변명은 만개 결과는 한개
[Android] 코로나 문진표 자동기입 앱 구현 순서대로 서술 본문
들어가며
이번에 코로나 문진표 자동기입 앱(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. 링크를 눌렀을 때 연결 프로그램 으로써 앱을 여는 방법
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 |
WebChromeClient
의 onProgressChanged
를 Override 한 뒤newProgress
가 100이되면 완전히 로딩 완료되었다 판단하여 setValues
호출합니다.
! 이때 완전히 로딩되면, newProgress == 100
이 2번 호출되던데 신경쓰인다면 2번째 호출때 action 하도록 수정하면 될듯합니다
7. 자동기입될 유저의 이름 사번 휴대폰 데이터의 저장및 호출을 위해 SharedPreferences 구현
늦은시간이었고 구현시간을 당기기 위해 위 게시글 코드 그대로 구현하였습니다
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 |
이상입니다! : )
'공부 > 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 |