변명은 만개 결과는 한개

[Android] 코로나 문진표 자동기입 앱 구현 순서대로 서술 본문

공부/Android

[Android] 코로나 문진표 자동기입 앱 구현 순서대로 서술

노마십가 2020. 9. 1. 01:03
728x90
반응형

들어가며

이번에 코로나 문진표 자동기입 앱(https://tmrtkr.tistory.com/78) 을 만들며 굉장히 즐거웠기때문에, 기억을 더듬어가며 구현 순서대로 서술해보도록 하겠습니다 :)

 

더보기

목차

1. 링크를 눌렀을 때 연결 프로그램 으로써 앱을 여는 방법

2. 1번에서 설정한 스코프에 의하여 호출된 intent의 데이터를 얻는 방법

3. 웹뷰 생성 및 2번에서 가져온 Uri를 로딩

4. jsAlert 를 받기 위하여 WebViewClinet 에서 WebChromeClient 로 수정

5. 웹뷰에 Js를 넘겨 항목을 채우는 함수 생성

6. 앱이 intent로 onCreate 되고 웹뷰에 Uri 페이지가 완전히 로딩 뒤 5번에서 만든 setValues 함수가 호출되도록 구현

7. 자동기입될 유저의 이름 사번 휴대폰 데이터의 저장및 호출을 위해 SharedPreferences 구현

8. MainActivity 의 버튼 클릭 시 기입한 데이터를 SharedPreferences 에 저장되도록 한 뒤 관련 코드 적용


1. 링크를 눌렀을 때 연결 프로그램 으로써 앱을 여는 방법

이런식으로 특정 링크를 클릭하면 연결 프로그램(Open with)으로 내 앱이 올라온다

1
2
3
4
5
6
7
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.APP_BROWSER"/>
    <data android:host="anyvisit.co.kr" android:scheme="https" />
</intent-filter>
cs

manifest에 위 intent-filter 등록.
연결 프로그램으로 열 링크의 스코프는 <data /> 부분을 수정해주면 됩니다.

저같은 경우에는 삼성전자 스마트시티의 문진링크만 적용되면 되기에 android:host="anyvisit.co.kr" 으로 기입하였습니다


2. 1번에서 설정한 스코프에 의하여 호출된 intent의 데이터를 얻는 방법

1
2
3
4
Intent intent = getIntent(); 
String action = intent.getAction(); 
Uri data = intent.getData(); 
Log.e(TAG, "intent..." + action + ":" + data); 
cs

제 경우 가져온 데이터가 웹뷰에서 호출할 Uri 로서 필요했기에 위와 같이 확보하였습니다


3. 웹뷰 생성 및 2번에서 가져온 Uri를 로딩

1
2
3
4
5
6
7
8
9
10
11
12
private WebView mWebView; 
 
mWebView = findViewById(R.id.activity_main_webview); 
 
mWebView.setWebViewClient(new WebViewClient() { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        view.loadUrl(url); 
        return true
    } 
}); 
mWebView.loadUrl(data.toString()); 
cs

레이아웃에 만들어놓은 웹뷰를 findViewById로 가져오고,
.setWebViewClient 로 웹뷰 세팅을 합니다.

그 뒤 .loadurl 를 이용하여 2번에서 얻어놓은 data 를 엽니다.
이때, 웹뷰로 인터넷의 웹사이트를 열기 위해서는 manifest에 아래 퍼미션의 추가가 필요합니다.
<uses-permission android:name="android.permission.INTERNET"/>


4. jsAlert 를 받기 위하여 WebViewClinet 에서 WebChromeClient 로 수정

1
2
3
4
5
6
WebSettings webSettings = mWebView.getSettings(); 
webSettings.setJavaScriptEnabled(true); 
 
mWebView.setWebChromeClient(new WebChromeClient() { 
 
}); 
cs

 

문진 사이트에서는 제출 버튼을 눌렀을때 문진 항목에 대한 Alert 을 뿌려주며 한번 더 물어보는데,

이런식으로 한번 더 물어본다

WebViewClient는 해당 Alert를 받기 위해 비교적 손이 더 들어가지만, WebChromeClienet 의 경우 Alert를 쉽게 받을 수 있어 위 코드와 같이 수정하였습니다.

 


5. 웹뷰에 Js를 넘겨 항목을 채우는 함수 생성

1
2
3
4
5
6
7
8
9
10
11
void setValues(WebView view){
    Log.d(TAG,"Set Values!");
    view.evaluateJavascript("(function() { document.querySelector(\"input[value=SEC]\").click()})()"null); 
    view.evaluateJavascript("(function() { document.getElementById(\"userName\").value=\"1\"})()"null); 
    view.evaluateJavascript("(function() { document.getElementById(\"empNo\").value=\"4\"})()"null); 
    view.evaluateJavascript("(function() { document.getElementById(\"telNumber\").value=\"7\"})()"null); 
}
 
... 
 
setValues(mWebView);
cs

setValues 함수 호출시 인자로 넣은 웹뷰에 차례대로

소속구분 삼성전자 radio box 체크
이름 text box 에 "1" 기입
사번 text box 에 "4" 기입
휴대폰 text box 에 "7" 기입

동작을 하는 Js 코드를 넘겨줍니다.


6. 앱이 intent로 onCreate 되고 웹뷰에 Uri 페이지가 완전히 로딩 뒤 5번에서 만든 setValues 함수가 호출되도록 구현

1
2
3
4
5
6
7
8
9
10
11
mWebView.setWebChromeClient(new WebChromeClient() { 
    @Override 
    public void onProgressChanged(WebView view, int newProgress) { 
        super.onProgressChanged(view, newProgress); 
 
        if (newProgress == 100) { 
            Log.d(TAG,"loading complete !"); 
            setValues(view); 
        } 
    } 
}); 
cs

WebChromeClientonProgressChanged 를 Override 한 뒤
newProgress가 100이되면 완전히 로딩 완료되었다 판단하여 setValues 호출합니다.

 

! 이때 완전히 로딩되면, newProgress == 100 이 2번 호출되던데 신경쓰인다면 2번째 호출때 action 하도록 수정하면 될듯합니다


7. 자동기입될 유저의 이름 사번 휴대폰 데이터의 저장및 호출을 위해 SharedPreferences 구현

 

[Android] SharedPreferences 사용하기

이래저래 바쁘다는 핑계로 미루다가 오랜만에 포스팅을 하게 되었습니다. 벌써 새해가 밝았네요. 저만 시간이 빨리 가는 것처럼 느껴지는 건 아니겠죠? 모두 새해에는 좋은 일이 생겼으면 좋겠�

re-build.tistory.com

 

늦은시간이었고 구현시간을 당기기 위해 위 게시글 코드 그대로 구현하였습니다


8. MainActivity 의 버튼 클릭 시 기입한 데이터를 SharedPreferences 에 저장되도록 한 뒤 관련 코드 적용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
mContext = this
et_userName = findViewById(R.id.et_name); 
et_empNo = findViewById(R.id.et_employee_number); 
et_telNumber = findViewById(R.id.et_phone_number); 
 
String userName = PreferenceManager.getString(mContext, "USER_NAME"); 
String empNo = PreferenceManager.getString(mContext, "EMPLOYEE_NUMBER"); 
String telNo = PreferenceManager.getString(mContext, "PHONE_NUMBER"); 
 
et_userName.setText(userName); 
et_empNo.setText(empNo); 
et_telNumber.setText(telNo); 
 
btn_set = findViewById(R.id.btn_set_information); 
btn_set.setOnClickListener(new Button.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
        Log.d(TAG, "Set button clicked!"); 
 
        PreferenceManager.setString(mContext, "USER_NAME", et_userName.getText().toString()); 
        PreferenceManager.setString(mContext, "EMPLOYEE_NUMBER", et_empNo.getText().toString()); 
        PreferenceManager.setString(mContext, "PHONE_NUMBER", et_telNumber.getText().toString()); 
 
        setValues(mWebView); 
    } 
}); 
 
... 
 
private void setValues(WebView view) { 
    Log.d(TAG, "Set Values!"); 
    view.evaluateJavascript("(function() { document.querySelector(\"input[value=SEC]\").click()})()"null); 
 
    String userName = PreferenceManager.getString(mContext, "USER_NAME"); 
    String empNo = PreferenceManager.getString(mContext, "EMPLOYEE_NUMBER"); 
    String telNo = PreferenceManager.getString(mContext, "PHONE_NUMBER"); 
 
    view.evaluateJavascript("(function() { document.getElementById(\"userName\").value=\"" + userName + "\"})()"null); 
    view.evaluateJavascript("(function() { document.getElementById(\"empNo\").value=\"" + empNo + "\"})()"null); 
    view.evaluateJavascript("(function() { document.getElementById(\"telNumber\").value=\"" + telNo + "\"})()"null); 
}
cs

 

 

 

이상입니다! : ) 

728x90
반응형

'공부 > Android' 카테고리의 다른 글

코로나 문진표 자동기입 앱  (4) 2020.08.21
[Android] Android, Tesseract, OCR  (0) 2019.05.20
[Android] PreferenceActivity  (0) 2019.04.19
[Android] ActionBar 아니라 Toolbar [임시]  (0) 2019.04.19