Notice
Recent Posts
Recent Comments
Link
투케이2K
41. (TWOK/UTIL) [Android/Java] A_CookieWebview - 쿠키 설정 및 웹뷰 로드 수행 실시 클래스 본문
투케이2K 유틸파일
41. (TWOK/UTIL) [Android/Java] A_CookieWebview - 쿠키 설정 및 웹뷰 로드 수행 실시 클래스
투케이2K 2022. 5. 9. 16:29[설 명]
프로그램 : Android / Java
설 명 : 쿠키 설정 및 웹뷰 로드 수행 실시 클래스
[소스 코드]
package com.app.test;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.ClipData;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.ConsoleMessage;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.HttpAuthHandler;
import android.webkit.JavascriptInterface;
import android.webkit.SslErrorHandler;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebStorage;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class A_CookieWebview extends AppCompatActivity {
/**
* TODO [클래스 설명]
* // -----------------------------------------
* 1. 사용하는 레이아웃 : a_cookie
* 2. 쿠키 삽입 및 웹뷰 화면 호출 액티비티 화면
* // -----------------------------------------
* */
// TODO [쿠키 웹뷰 로직 설명 실시]
/**
* // -----------------------------------------
* 1. A_Main 클래스 에서 setCookieSettings 자바스크립트 브릿지 명령 받으면 쿠키 삽입 및 웹뷰 호출 수행 실시
* 2. 자바스크립트에서 내려받은 데이터에서 헤더 값이 있는 경우 헤더 값을 추가하는 로직 / 없으면 일반 웹뷰 호출 로직 수행
* 3. 쿠키 설정 로직 설정
* - [1]. 웹뷰 설정 및 최초 로드 (init_WebView) 시 쿠키 값이 있으면 쿠키 매니저를 사용해 쿠키 삽입 실시
* - [2]. 웹뷰 설정 및 최초 로드 (init_WebView) 시 헤더 값이 있으면 헤더 값 설정 후 웹뷰 로드 실시
* // -----------------------------------------
* */
// TODO [빠른 로직 찾기 : 주석 로직 찾기]
/**
* // -----------------------------------------
* // [SEARCH FAST] : [웹뷰 설정]
* // [SEARCH FAST] : [자바스크립트 통신]
* // [SEARCH FAST] : [동적 헤더 추가 실시]
* // [SEARCH FAST] : [쿠키 설정 실시]
* // [SEARCH FAST] : [실시간 쿠키 값 확인 실시]
* // -----------------------------------------
*/
// TODO [자바스크립트에서 전달 받은 쿠키 설정 데이터 형식]
/*
// -----------------------------------------
[쿠키 설정 방식]
{
"header" : [
{"Cookie" : "JSESSIONID=61f0aa76ad66d12300000000; domain=m.test.ac.kr; path=/;"}, // [쿠키 스트링 값]
{"Autholization" : "1234"} // [헤더 권한 설정]
],
"url" : "https://m.test.ac.kr/v3/app", // [웹뷰 주소 로드 수행]
"domain" : "https://m.test.ac.kr" // [쿠키 설정 도메인]
}
// -----------------------------------------
[일반 주소 호출]
{
"url" : "https://www.naver.com"
}
// -----------------------------------------
*/
// TODO [웹뷰 전역 변수 선언 부분]
WebView main_webview; // [웹뷰 컴포넌트]
Handler js_handler = new Handler(); // [자바스크립트 통신 사용 핸들러]
boolean webViewKeyEvent = false;
// TODO [전역 변수 선언 부분]
private static final String ACTIVITY_NAME = "A_CookieWebview"; // [액티비티 명칭 지정]
String saveData = ""; // [프리퍼런스에 저장된 데이터]
String loadUrl = ""; // [웹뷰 로드 주소]
String cookieDomain = ""; // [쿠키 설정 도메인 주소]
String cookieString = ""; // [쿠키 스트링 문자열 저장 값]
boolean headerExist = false; // [자바스크립트로 넘어온 헤더 데이터 있는지 체크 실시]
JSONArray headerArray = null; // [헤더 정보를 담는 배열]
boolean errorExist = false; // [에러 발생 여부 값]
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
// [타이틀바 없애기 : FEATURE_NO_TITLE]
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
catch (Exception e){
e.printStackTrace();
}
// [액티비티 레이아웃 지정 실시]
setContentView(R.layout.a_cookie);
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 액티비티 수행 실시]");
Log.d("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// TODO [자바스크립트에서 전달 받은 웹뷰 초기 로드 데이터 확인 실시]
saveData = S_Preference.getString(getApplication(), S_FinalData.PRE_WV_COOKIE_DATA);
if (C_Util.stringNotNull(saveData) == true) { // [널 데이터가 아닌 경우]
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 웹뷰 로드 정보 확인 실시]");
Log.i("","\n"+"[saveData :: "+String.valueOf(saveData)+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [프리퍼런스 데이터 초기화 수행 실시]
S_Preference.setString(getApplication(), S_FinalData.PRE_WV_COOKIE_DATA, "");
S_Preference.setString(getApplication(), S_FinalData.PRE_WV_COOKIE_DATA, "");
// -----------------------------------------
// -----------------------------------------
// [데이터 파싱 수행 실시]
try {
if (C_Util.stringJsonObjectEnable(saveData) == true){ // [json 데이터 변경 가능 한 경우]
JSONObject totalJSON = new JSONObject(String.valueOf(saveData));
// TODO [1]. url 데이터가 포함되어 있는지 확인 실시 (웹뷰 로드 주소)
if (totalJSON.has("url") == true){
loadUrl = String.valueOf(totalJSON.get("url"));
}
// TODO [2]. 도메인 주소가 포함되어 있는지 확인 실시 (쿠키 설정 도메인 주소)
if (totalJSON.has("domain") == true){
cookieDomain = String.valueOf(totalJSON.get("domain"));
}
// TODO [3]. 웹뷰 로드에 필요한 헤더 값이 포함되어있는지 확인 실시 (헤더 , 쿠키 값)
if (totalJSON.has("header") == true){
headerArray = new JSONArray(String.valueOf(totalJSON.get("header")));
}
// TODO [4]. 파싱한 데이터 검증 수행 실시
if (C_Util.stringNotNull(loadUrl) == true){ // [웹뷰 로드 주소가 널이 아닌 경우]
// [도메인 주소와 헤더 값이 널이 아닌 지 확인]
if (C_Util.stringNotNull(cookieDomain) == true
&& headerArray != null && headerArray.length()>0){
// [헤더 배열을 돌면서 세부적인 설정 값 파싱 실시]
for (int i=0; i<headerArray.length(); i++){
JSONObject jsonObj = new JSONObject(String.valueOf(headerArray.get(i)));
Iterator keyList = jsonObj.keys();
while(keyList.hasNext()){
String key = (String) keyList.next();
String keyData = String.valueOf(key); // [key]
String valueData = String.valueOf(jsonObj.get(key)); // [value]
/*
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: [헤더] 배열 값 파싱 수행 실시]");
Log.i("","\n"+"[array :: "+String.valueOf("headerArray")+"]");
Log.i("","\n"+"[key :: "+String.valueOf(keyData)+"]");
Log.i("","\n"+"[value :: "+String.valueOf(valueData)+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
// */
// TODO [실제 헤더가 포함된 경우임]
headerExist = true;
// TODO [쿠키 스트링 값 저장 실시]
if (keyData.trim().toLowerCase().contains("cookie")){ // [key 값이 쿠키 인 경우]
// [쿠키 스트링 값 데이터 지정]
cookieString = String.valueOf(valueData);
// [쿠키 스트링 값 포맷 수행 실시]
if (cookieString.endsWith(";") == false){
cookieString += ";";
}
cookieString = cookieString.replaceAll(" ", "");
/**
// -----------------------------------------
TODO : [쿠키 스트링 형태 설명]
// -----------------------------------------
1. 쿠키 스트링 형태 : JSESSIONID=61f0aa76ad66d12308000000;domain=m.test.ac.kr;path=/;
// -----------------------------------------
2. 주요 사항 : 쿠키 스트링은 각 데이터 별로 [;] 세미콜론 구분이 필요하다
// -----------------------------------------
*/
// [for 문을 돌면서 = [등호] 와 [;] 세미 콜론 개수 카운트 실시 >> 쿠키 스트링 형식 문자열 검사]
int check_1 = 0; // 특수문자 [=] 개수
int check_2 = 0; // 특수문자 [;] 개수
for (int k=0; k<cookieString.length(); k++){
if (cookieString.charAt(k) == '='){
check_1 += 1;
}
if (cookieString.charAt(k) == ';'){
check_2 += 1;
}
}
// [정상적인 쿠키 스트링 값이 아닌 경우]
if (check_1 != check_2){
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 쿠키 설정 데이터 포맷 양식 확인 에러]");
Log.i("","\n"+"[error :: "+String.valueOf("쿠키 설정에 필요한 데이터 확인 중 문제가 발생했습니다. [cookie data format check error]")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [쿠키 스트링 값 데이터 지정]
cookieString = "";
// [액티비티 종료 팝업창 알림 표시 수행]
showAlertFinish(
"[알림]",
"쿠키 설정에 필요한 데이터 확인 중 문제가 발생했습니다. [cookie data format check error]",
"확인",
""
);
}
else {
// [정상적으로 포맷을 수행한 쿠키 값을 배열에 삽입 실시]
jsonObj.put(keyData, cookieString);
headerArray.put(i, jsonObj); // [배열 데이터 수정]
}
}
}
}
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 웹뷰 로드 [쿠키] 설정 데이터 [검증] 수행]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[url :: "+String.valueOf(loadUrl)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[domain :: "+String.valueOf(cookieDomain)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[header :: "+String.valueOf(headerArray.toString())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[cookieString :: "+String.valueOf(cookieString)+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// [SEARCH FAST] : [웹뷰 설정]
init_WebView(1, loadUrl);
}
else { // [일반 주소 로드 실시]
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 웹뷰 로드 [일반] 설정 데이터 [검증] 수행]");
Log.i("","\n"+"[url :: "+String.valueOf(loadUrl)+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// [SEARCH FAST] : [웹뷰 설정]
init_WebView(0, loadUrl);
}
}
else { // [웹뷰 로드 주소가 널 인 경우]
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 웹뷰 로드 주소 확인 에러]");
Log.i("","\n"+"[error :: "+String.valueOf("웹뷰 로드에 필요한 주소 데이터를 다시 확인해주세요. [url data is null]")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [액티비티 종료 팝업창 알림 표시 수행]
showAlertFinish(
"[알림]",
"웹뷰 로드에 필요한 주소 데이터를 다시 확인해주세요. [url data is null]",
"확인",
""
);
}
}
else { // [json 데이터로 변경 불가능 한 경우]
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 웹뷰 로드 정보 확인 에러]");
Log.i("","\n"+"[error :: "+String.valueOf("데이터 json 형식 여부를 다시 확인해주세요. [data parsing error]")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [액티비티 종료 팝업창 알림 표시 수행]
showAlertFinish(
"[알림]",
"데이터 json 형식 여부를 다시 확인해주세요. [data parsing error]",
"확인",
""
);
}
}
catch (Exception e){
e.printStackTrace();
}
// -----------------------------------------
}
else { // [널 데이터 인 경우]
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 웹뷰 로드 정보 확인 실패]");
Log.i("","\n"+"[error :: "+String.valueOf("웹뷰 로드에 필요한 데이터를 다시 확인해주세요. [data is null]")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [액티비티 종료 팝업창 알림 표시 수행]
showAlertFinish(
"[알림]",
"웹뷰 로드에 필요한 데이터를 다시 확인해주세요. [data is null]",
"확인",
""
);
}
// -----------------------------------------
} // TODO [메인 종료]
// TODO [웹뷰 초기값 설정 및 최초 웹뷰 로드 수행 부분]
public void init_WebView(int _loadType, String _loadUrl) {
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> init_WebView() :: 웹뷰 초기값 설정 및 최초 웹뷰 로드 수행 실시]");
Log.i("","\n"+"[_loadType :: "+String.valueOf(_loadType)+"]");
Log.i("","\n"+"[_loadUrl :: "+String.valueOf(_loadUrl)+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [SEARCH FAST] : [웹뷰 설정]
// -----------------------------------------
try {
// -----------------------------------------
// TODO [웹뷰 컴포넌트 매칭 실시]
main_webview = (WebView)findViewById(R.id.main_webview);
// -----------------------------------------
// -----------------------------------------
// TODO [웹뷰 쿠키 및 세션 관리를 위한 쿠키 매니저 선언]
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.setAcceptThirdPartyCookies(main_webview, true);
// -----------------------------------------
// -----------------------------------------
// TODO [WebView 캐시 초기화 설정]
try {
main_webview.clearHistory();
main_webview.clearCache(true);
main_webview.clearView();
}
catch (Exception e){
//e.printStackTrace();
}
// -----------------------------------------
// -----------------------------------------
// TODO [웹뷰 CONTENT 허용 설정]
main_webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
// -----------------------------------------
// -----------------------------------------
// TODO [JavaScript 허용]
main_webview.getSettings().setJavaScriptEnabled(true);
// -----------------------------------------
// -----------------------------------------
// TODO [JavaScript의 window.open 허용]
main_webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
main_webview.getSettings().setSupportMultipleWindows(true); // [새창 띄우기 허용]
// -----------------------------------------
// -----------------------------------------
// TODO [자바스크립트 웹 스토리지 사용]
main_webview.getSettings().setDomStorageEnabled(true);
// -----------------------------------------
// -----------------------------------------
// TODO [HTTPS 페이지내 이미지 표시 설정]
if(Build.VERSION.SDK_INT >= 21) {
main_webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
// -----------------------------------------
// -----------------------------------------
// TODO [뷰 포트 스케일 관련]
main_webview.setInitialScale(8);
main_webview.scrollTo(0,0);
// -----------------------------------------
// -----------------------------------------
// TODO [뷰 포트 핀줌 관련]
main_webview.getSettings().setLoadWithOverviewMode(true);
main_webview.getSettings().setUseWideViewPort(true);
main_webview.getSettings().setBuiltInZoomControls(true);
main_webview.getSettings().setSupportZoom(true);
main_webview.getSettings().setDisplayZoomControls(false);
// -----------------------------------------
// -----------------------------------------
// TODO [웹뷰 크롬 브라우저에서 디버깅 모드 설정 허용]
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
try {
//main_webview.setWebContentsDebuggingEnabled(true); // TODO [디버깅 테스트 APK 생성 용도]
}
catch (Exception e){
//e.printStackTrace();
}
}
// -----------------------------------------
// -----------------------------------------
// TODO [web client 설정]
main_webview.setWebViewClient(new MainWeb());
// -----------------------------------------
// -----------------------------------------
// TODO [웹뷰가 띄어질 브라우저 선택 및 크롬 클라이언트 정의]
main_webview.setWebChromeClient(new WebChromeClient()); // [크롬으로 설정]
// -----------------------------------------
// -----------------------------------------
// TODO [크롬 클라이언트 설정 실시]
main_webview.setWebChromeClient(new WebChromeClient() {
// TODO [웹 브라우저 콘솔 로그 확인]
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onConsoleMessage() :: 웹 브라우저 콘솔 로그 확인 실시]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getUrl :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getOriginalUrl :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[message [1] :: "+String.valueOf(consoleMessage.message())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[message [2] :: "+String.valueOf(consoleMessage.toString())+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
return super.onConsoleMessage(consoleMessage);
}
// TODO [실시간 웹뷰 로드 상태 확인]
@Override
public void onProgressChanged(WebView view, int progress) {
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onProgressChanged() :: 실시간 웹뷰 호출 상황 확인 실시]");
Log.i("","\n"+"[getUrl :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"[getOriginalUrl :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
Log.i("","\n"+"[호출 상황 :: "+String.valueOf(progress)+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
// [웹뷰 로드 완료 상태 : 웹뷰의 호출 상황이 100 인 경우]
if(progress >= 100){
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"[A_ChildWebview >> onProgressChanged() :: 실시간 웹뷰 호출 완료 상태]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getUrl :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getOriginalUrl :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
Log.i("","\n"+"--------------------------------");
//Log.i("","\n"+"[저장된 쿠키 값 :: "+String.valueOf(cookieManager.getCookie(_loadUrl))+"]");
Log.i("","\n"+"[저장된 쿠키 값 :: "+String.valueOf(cookieManager.getCookie(main_webview.getUrl()))+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// ----------------------------------
// [SEARCH FAST] : [실시간 쿠키 값 확인 실시]
// ----------------------------------
}
}
});
// -----------------------------------------
// -----------------------------------------
// TODO [자바스크립트에서 안드로이드를 호출하는 [window.클래스.메소드] 부분에서 클래스 경로 정의]
// [SEARCH FAST] : [자바스크립트 통신]
Javascript_To_Android_Bridge(); // [자바스크립트 통신 모든 경로 추가]
// -----------------------------------------
// -----------------------------------------
// TODO [웹뷰 리소스 초기화 관련]
main_webview.getSettings().setAppCacheEnabled(false); // [앱 내부 캐시 사용 여부 설정]
main_webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); // [웹뷰 캐시 모드 설정 [캐시 모드 사용 않고 네트워크 사용해 로드]]
// -----------------------------------------
// -----------------------------------------
// TODO [SEARCH FAST] : [동적 헤더 추가 실시]
if (_loadType == 1 && headerArray != null && headerArray.length()>0){
// [동적 헤더 값을 담을 맵 선언 실시]
Map<String, String> extraHeaders = new HashMap<String, String>();
for (int i=0; i<headerArray.length(); i++){
JSONObject jsonObj = new JSONObject(String.valueOf(headerArray.get(i)));
Iterator keyList = jsonObj.keys();
while(keyList.hasNext()){
String key = (String) keyList.next();
String keyData = String.valueOf(key); // [key]
String valueData = String.valueOf(jsonObj.get(key)); // [value]
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> init_WebView() :: 동적 [헤더] 값 추가 실시]");
Log.i("","\n"+"[key :: "+String.valueOf(keyData)+"]");
Log.i("","\n"+"[value :: "+String.valueOf(valueData)+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
// [SEARCH FAST] : [쿠키 설정 실시]
if (keyData.trim().toLowerCase().contains("cookie")) { // TODO [쿠키가 포함된 경우]
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> init_WebView() :: 동적 [헤더] 값 추가 실시]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[설 명 :: "+String.valueOf("쿠키 추가 로직 처리 실시")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[cookieDomain :: "+String.valueOf(cookieDomain)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[valueData :: "+String.valueOf(valueData)+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
/**
// -----------------------------------------
TODO : [쿠키 스트링 형태 설명]
// -----------------------------------------
1. 쿠키 스트링 형태 [valueData] : JSESSIONID=61f0aa76ad66d12308000000;domain=m.test.ac.kr;path=/;
// -----------------------------------------
2. 주요 사항 : 쿠키 스트링은 각 데이터 별로 [;] 세미콜론 구분이 필요하다
// -----------------------------------------
*/
// TODO [쿠키 매니저에 추가 실시]
cookieManager.setCookie(cookieDomain, valueData);
cookieManager.getInstance().flush();
}
else { // TODO [쿠키가 포함되지 않는 경우]
// [헤더에 추가 실시]
extraHeaders.put(keyData, valueData);
}
}
}
// -----------------------------------------
// [헤더 지정 및 쿠키 설정 웹뷰 호출 실시]
main_webview.loadUrl(_loadUrl, extraHeaders);
// -----------------------------------------
}
else {
// TODO [일반 웹뷰 설정으로 로드 수행]
main_webview.loadUrl(_loadUrl);
}
// -----------------------------------------
}
catch (Exception e){
e.printStackTrace();
}
}
// TODO [WebViewClient 는 웹뷰에서 자유롭게 기능을 사용하기 위함]
class MainWeb extends WebViewClient {
// [로딩이 시작될 때]
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onPageStarted() :: [웹 클라이언트]]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("로딩 시작")+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
// [리소스를 로드하는 중 여러번 호출]
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onLoadResource() :: [웹 클라이언트]]");
Log.i("","\n"+"[주 소 :: "+String.valueOf(url)+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("로드 중")+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
// [방문 내역을 히스토리에 업데이트 할 때]
@Override
public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
super.doUpdateVisitedHistory(view, url, isReload);
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> doUpdateVisitedHistory() :: [웹 클라이언트]]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("방문내역 업데이트")+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
// [로딩이 완료됐을 때 한번 호출]
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onPageFinished() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로드 완료 주소 :: "+String.valueOf(url)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getUrl 주소 :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getOriginalUrl 주소 :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[설 명 :: "+String.valueOf("로드 완료")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
}
// [오류가 났을 경우, 오류는 복수할 수 없음]
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
switch (errorCode) {
case ERROR_AUTHENTICATION:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_AUTHENTICATION")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("서버에서 사용자 인증 실패")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_BAD_URL:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_BAD_URL")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("잘못된 URL")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_CONNECT:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_CONNECT")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("서버로 연결 실패")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_FAILED_SSL_HANDSHAKE:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_FAILED_SSL_HANDSHAKE")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("SSL handshake 수행 실패")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_FILE:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_FILE")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("일반 파일 오류")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_FILE_NOT_FOUND:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_FILE_NOT_FOUND")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("파일을 찾을 수 없습니다")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_HOST_LOOKUP:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_HOST_LOOKUP")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("서버 또는 프록시 호스트 이름 조회 실패")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_IO:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_IO")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("서버에서 읽거나 서버로 쓰기 실패")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_PROXY_AUTHENTICATION:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_PROXY_AUTHENTICATION")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("프록시에서 사용자 인증 실패")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_REDIRECT_LOOP:
Log.d("---","---");
Log.e("//===========//","================================================");
Log.d("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.d("","\n"+"[타 입 :: "+String.valueOf("ERROR_REDIRECT_LOOP")+"]");
Log.d("","\n"+"[설 명 :: "+String.valueOf("너무 많은 리디렉션")+"]");
Log.e("//===========//","================================================");
Log.d("---","---");
break;
case ERROR_TIMEOUT:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_TIMEOUT")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("연결 시간 초과")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_TOO_MANY_REQUESTS:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_TOO_MANY_REQUESTS")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("페이지 로드중 너무 많은 요청 발생")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_UNKNOWN:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_UNKNOWN")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("일반 오류")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case ERROR_UNSUPPORTED_AUTH_SCHEME:
Log.d("---","---");
Log.e("//===========//","================================================");
Log.d("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.d("","\n"+"[타 입 :: "+String.valueOf("ERROR_UNSUPPORTED_AUTH_SCHEME")+"]");
Log.d("","\n"+"[설 명 :: "+String.valueOf("지원되지 않는 인증 체계")+"]");
Log.e("//===========//","================================================");
Log.d("---","---");
break;
case ERROR_UNSUPPORTED_SCHEME:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_UNSUPPORTED_SCHEME")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("URI가 지원되지 않는 방식")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
}
}
@Override
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
// [E/chromium: [ERROR:ssl_client_socket_impl.cc 에러 해결 위함]
try {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedSslError() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[설 명 :: "+String.valueOf("사이트 인증서 문제 발생")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getUrl 주소 :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getOriginalUrl 주소 :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// TODO [ssl 접속 에러가 발생한 경우 경고 팝업창 처리 실시]
final AlertDialog.Builder builder = new AlertDialog.Builder(A_CookieWebview.this);
builder.setMessage("이 사이트의 보안 인증서는 신뢰하는 보안 인증서가 아닙니다. 계속하시겠습니까?");
builder.setPositiveButton("계속하기", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
handler.proceed();
}
});
builder.setNegativeButton("취소", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
handler.cancel();
}
});
final AlertDialog dialog = builder.create();
dialog.show();
}
catch (Exception e){
e.printStackTrace();
}
// [SSL 에러 타입 확인 실시]
switch (error.getPrimaryError()) {
case SslError.SSL_UNTRUSTED:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedSslError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("SSL_UNTRUSTED")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("이 사이트의 보안 인증서는 신뢰할 수 없습니다")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case SslError.SSL_EXPIRED:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedSslError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("SSL_EXPIRED")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("보안 인증서가 만료되었습니다")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case SslError.SSL_IDMISMATCH:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedSslError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("SSL_IDMISMATCH")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("보안 인증서가 ID 일치하지 않습니다")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
case SslError.SSL_NOTYETVALID:
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedSslError() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: "+String.valueOf("SSL_NOTYETVALID")+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("보안 인증서가 유효하지 않습니다")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
break;
}
}
// [http 인증 요청이 있는 경우, 기본 동작은 요청 취소]
@Override
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
super.onReceivedHttpAuthRequest(view, handler, host, realm);
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedHttpAuthRequest() :: [웹 클라이언트]]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("http 인증 요청")+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
// [확대나 크기 등의 변화가 있는 경우]
@Override
public void onScaleChanged(WebView view, float oldScale, float newScale) {
super.onScaleChanged(view, oldScale, newScale);
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onScaleChanged() :: [웹 클라이언트]]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("화면 크기 변화")+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
}
// [웹 페이지 내에서 페이지 이동 key 이벤트 발생]
@Override
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideKeyEvent() :: [웹 클라이언트]]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("웹 페이지 내에서 페이지 이동 key 이벤트 발생")+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
return super.shouldOverrideKeyEvent(view, event);
}
// [새로운 URL이 webview에 로드되려 할 경우 컨트롤을 대신할 기회를 줌]
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로딩 주소 :: "+String.valueOf(url)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getUrl 주소 :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getOriginalUrl 주소 :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[설 명 :: "+String.valueOf("새로운 URL이 webview에 로드")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// TODO [intent 딥링크 스키마 확인 실시]
if (url.startsWith("intent") && url.toLowerCase().contains("package")){
Intent intent = null;
try {
intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); // 딥링크 스키마 확인
String packgeName = String.valueOf(intent.getPackage()); // 스키마에 포함된 패키지명 확인
// [스키마에 포함된 패키지 명이 널이 아닌 경우]
if (C_Util.stringNotNull(packgeName) == true) {
Intent existPackage = getPackageManager().getLaunchIntentForPackage(intent.getPackage());
if (existPackage != null) {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[전체 데이터 :: "+String.valueOf(url.toString())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[패키지 명 :: "+String.valueOf(packgeName)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[success [성공] :: 스키마 외부 앱 이동 수행 실시]");
Log.w("//===========//","================================================");
Log.i("---","---");
// [스키마 사용해 외부앱 이동 수행 실시]
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
} else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[패키지 명 :: "+String.valueOf(packgeName)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[error [에러] :: existPackage is null]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로 직 :: 마켓 이동 수행 실시]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [마켓 이동 수행 실시]
C_MoveApp.goMarketRun(A_CookieWebview.this, packgeName);
}
}
else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[패키지 명 :: "+String.valueOf(packgeName)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[error [에러] :: PackageName Error]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
}
catch (URISyntaxException e){
// [URI 문법 오류 시 처리 구간]
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[catch [URISyntaxException] :: Intent URL Scheme 문법 오류 발생]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
catch (ActivityNotFoundException e){
// [인텐트 이동을 수행할 앱을 발견하지 못한 경우]
String packageName = String.valueOf(intent.getPackage());
// [패키지 명이 널이 아닌 경우]
if (C_Util.stringNotNull(packageName) == true){
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[패키지명 :: "+String.valueOf(packageName)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[catch [ActivityNotFoundException] :: 외부 앱 설치 진행 실시]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [마켓 이동 수행 실시]
C_MoveApp.goMarketRun(A_CookieWebview.this, packageName);
}
else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[catch [ActivityNotFoundException] :: 외부 앱 설치 실패]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[error :: PackgeName Error]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
}
// ----------------------------------
// [return 값을 반드시 true 설정]
return true;
// ----------------------------------
}
// TODO [SMS 인텐트 이동 실시 : if(url.startsWith("sms:010-5678-1234")]
if (url.startsWith("sms:")) {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("sms")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[정 보 :: "+String.valueOf(url)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로 직 :: "+String.valueOf("문자 이동 수행 실시")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// ----------------------------------
// [sms 이동 메소드 호출]
C_Intent.goSmsIntent(A_CookieWebview.this, url);
// ----------------------------------
// [return 값을 반드시 true 설정]
return true;
// ----------------------------------
}
// TODO [전화 다이얼 인텐트 이동 실시 : if(url.startsWith("tel:010-1234-5678")]
if(url.startsWith("tel:")){
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("tel")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[정 보 :: "+String.valueOf(url)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로 직 :: "+String.valueOf("전화 다이얼 이동 수행 실시")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// ----------------------------------
// [전화 다이얼 이동 메소드 호출]
C_Intent.goTelIntent(A_CookieWebview.this, url);
// ----------------------------------
// [return 값을 반드시 true 설정]
return true;
// ----------------------------------
}
// TODO [Mail (Gmail) 인텐트 이동 실시 : if(url.startsWith("mailto:honggildung@test.com?subject=tittle&body=content")]
if(url.startsWith("mailto:")){
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("mailto")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[정 보 :: "+String.valueOf(url)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로 직 :: "+String.valueOf("메일 이동 수행 실시")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// ----------------------------------
// [메일 이동 메소드 호출]
C_Intent.goMailIntent(A_CookieWebview.this, url);
// ----------------------------------
// [return 값을 반드시 true 설정]
return true;
// ----------------------------------
}
// TODO [하이퍼링크 이동 실시 : if(url.startsWith("l:https://naver.com")]
if(url.startsWith("l:")){
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[타 입 :: "+String.valueOf("하이퍼링크")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[정 보 :: "+String.valueOf(url)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로 직 :: "+String.valueOf("외부 링크 이동 수행 실시")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// ----------------------------------
// [하이퍼링크 이동 메소드 호출]
C_Intent.goLinkIntent(A_CookieWebview.this, url);
// ----------------------------------
// [return 값을 반드시 true 설정]
return true;
// ----------------------------------
}
// ----------------------------------
// [새로운 웹뷰 로드 수행]
view.loadUrl(url);
// ----------------------------------
// ----------------------------------
// [return 값을 반드시 false 설정]
return false;
// ----------------------------------
}
}
// TODO [자바스크립트 >> 안드로이드 - 경로 지정 : 브릿지 경로에 location 추가 시 웹뷰 무한 로딩 현상 발생]
public void Javascript_To_Android_Bridge(){
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> Javascript_To_Android_Bridge() :: 자바스크립트 통신 브릿지 경로 추가 실시]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[경로 [1] :: "+String.valueOf("android")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[경로 [2] :: "+String.valueOf("main")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[경로 [3] :: "+String.valueOf("media")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [SEARCH FAST] : [자바스크립트 통신]
// -----------------------------------------
// [서버 : window.android.함수(); : 임시]
main_webview.addJavascriptInterface(new AndroidBridge(), "android"); // [자바스크립트에 대응할 함수를 정의한 클래스 붙여줌]
// -----------------------------------------
// [서버 : window.main.함수(); : 임시]
main_webview.addJavascriptInterface(new AndroidBridge(), "main"); // [자바스크립트에 대응할 함수를 정의한 클래스 붙여줌]
// -----------------------------------------
// [서버 : window.media.함수(); : 임시]
main_webview.addJavascriptInterface(new AndroidBridge(), "media"); // [자바스크립트에 대응할 함수를 정의한 클래스 붙여줌]
// -----------------------------------------
}
// TODO [자바스크립트 >> 안드로이드 - 함수 지정]
// [SEARCH FAST] : [자바스크립트 통신]
class AndroidBridge {
// -----------------------------------------
// [자바스크립트에서 호출하는 안드로이드 메소드]
@JavascriptInterface
public void setMarket(final String arg) {
js_handler.post(new Runnable() {
public void run() {
try {
String value = String.valueOf(arg);
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: setMarket() :: JS >> Android]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf(value)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[설 명 :: "+String.valueOf("마켓 이동 정보 전달 받음")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[로 직 :: "+"마켓 이동 수행 실시"+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [자바스크립트 데이터 방어 로직 추가 실시 : 데이터 널 체크]
if (C_Util.stringNotNull(value.trim()) == true){
}
else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: setMarket() :: JS >> Android]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf(value)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[error [에러] :: "+String.valueOf(S_FinalData.ERROR_DATA_NULL)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [에러 팝업창 알림 표시]
C_Ui_View.showAlert(
A_CookieWebview.this,
0,
S_FinalData.AL_TITLE,
S_FinalData.ERROR_DATA_NULL + " [setMarket]",
S_FinalData.AL_OK, "", "");
// [리턴 종료 실시]
return;
}
// -----------------------------------------
// [자바스크립트 데이터 방어 로직 추가 실시 : key 값 체크]
if (C_Util.stringMultiContains(value.toLowerCase().trim(), new String [] {"android", "package"}) == true){
}
else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: setMarket() :: JS >> Android]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf(value)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[error [에러] :: "+String.valueOf(S_FinalData.ERROR_PARSING_KEY)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [에러 팝업창 알림 표시]
C_Ui_View.showAlert(
A_CookieWebview.this,
0,
S_FinalData.AL_TITLE,
S_FinalData.ERROR_PARSING_KEY + " [setMarket]",
S_FinalData.AL_OK, "", "");
// [리턴 종료 실시]
return;
}
// -----------------------------------------
// [자바스크립트 데이터 방어 로직 추가 실시 : json 데이터 형식 체크 실시]
if (C_Util.stringJsonObjectEnable(value) == true){ // [Json 파싱 가능한 경우]
// [json 객체 생성]
JSONObject responseJson = new JSONObject(value);
// [특정 key 포함 여부 확인]
if (responseJson.has("android")){
JSONObject packgesJson = new JSONObject(String.valueOf(responseJson.get("android")));
String packageName = String.valueOf(packgesJson.get("package"));
// [자바스크립트 데이터 방어 로직 추가 실시 : 파싱 data 값 체크]
if (C_Util.stringNotNull(packageName) == true){
}
else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: setMarket() :: JS >> Android]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf(value)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[error [에러] :: "+String.valueOf(S_FinalData.ERROR_PARSING_DATA)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [에러 팝업창 알림 표시]
C_Ui_View.showAlert(
A_CookieWebview.this,
0,
S_FinalData.AL_TITLE,
S_FinalData.ERROR_PARSING_DATA + " [setMarket]",
S_FinalData.AL_OK, "", "");
// [리턴 종료 실시]
return;
}
// TODO [앱 스토어 이동 실시]
C_MoveApp.goMarketRun(A_CookieWebview.this, packageName);
}
}
else { // [Json 파싱 불가능한 경우]
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: setMarket() :: JS >> Android]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf(value)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[error [에러] :: "+String.valueOf(S_FinalData.ERROR_JSON_PARSING)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [에러 팝업창 알림 표시]
C_Ui_View.showAlert(
A_CookieWebview.this,
0,
S_FinalData.AL_TITLE,
S_FinalData.ERROR_JSON_PARSING + " [setMarket]",
S_FinalData.AL_OK, "", "");
// [리턴 종료 실시]
return;
}
// -----------------------------------------
}
catch (Exception e){
e.printStackTrace();
}
}
});
}
// -----------------------------------------
}
// TODO [안드로이드 >> 자바스크립트]
// [SEARCH FAST] : [자바스크립트 통신]
class Android_To_Javascript{
// -----------------------------------------
// [안드로이드에서 자바스크립트 호출]
public void shakeResult(){
try {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shakeResult() :: Android >> JS]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[JS 함수 :: "+String.valueOf("shakeResult")+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[설 명 :: "+String.valueOf("디바이스 흔들기 이벤트 발생 전달")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// TODO [함수 호출]
main_webview.loadUrl("javascript:shakeResult('"+String.valueOf("")+"')");
// -----------------------------------------
}
catch (Exception e){
//e.printStackTrace();
}
}
// -----------------------------------------
}
// TODO [액티비티 인텐트 수행 결과 받기]
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onActivityResult() :: 액티비티 리턴 값 확인 수행]");
Log.i("","\n"+"[requestCode :: "+String.valueOf(requestCode)+"]");
Log.i("","\n"+"[resultCode :: "+String.valueOf(resultCode)+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
}
// TODO [모바일 키 이벤트 발생 체크 부분]
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// [모바일 디바이스의 뒤로가기 키 이벤트가 발생한 경우]
if (keyCode == KeyEvent.KEYCODE_BACK) {
try {
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onKeyDown() :: 백버튼 터치시 뒤로 가기 이벤트 실시]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[loadUrl :: "+String.valueOf(loadUrl)+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getUrl :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[getOriginalUrl :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
Log.i("","\n"+"--------------------------------");
Log.i("","\n"+"[canGoBack :: "+String.valueOf(main_webview.canGoBack())+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
// [더이상 웹뷰에서 뒤로갈 페이지가 없을 경우 이거나 메인 로드 주소인 경우]
if (main_webview.canGoBack() == false
|| String.valueOf(main_webview.getUrl()).equals(String.valueOf(loadUrl))
|| String.valueOf(main_webview.getOriginalUrl()).equals(String.valueOf(loadUrl))){
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onKeyDown() :: 백버튼 터치시 뒤로 가기 이벤트 실시]");
Log.i("","\n"+"[로 직 :: "+String.valueOf("액티비티 종료 수행 실시")+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [앱 종료 수행 실시]
existsAPP();
}
// [뒤로 갈 페이지가 있는 경우]
else {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onKeyDown() :: 백버튼 터치시 뒤로 가기 이벤트 실시]");
Log.i("","\n"+"[로 직 :: "+String.valueOf("웹뷰 뒤로가기 수행 실시")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// [웹뷰 뒤로가기]
main_webview.goBack();
}
}
catch (Exception e){
//e.printStackTrace();
}
}
return true;
}
// TODO [바깥 레이아웃 클릭 시 키보드 내림]
@Override
public boolean dispatchTouchEvent(MotionEvent event){
int action = event.getAction();
switch(action){
case(MotionEvent.ACTION_DOWN):
try {
//TODO [창 내리는 용도]
}
catch (Exception e){
//e.printStackTrace();
}
break;
case(MotionEvent.ACTION_MOVE):
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
public void onResume(){
super.onResume();
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onResume() :: 액티비티 실행 준비]");
Log.w("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [외부 브라우저 복귀 시 화면 전환 애니메이션 없애기 위함]
try {
overridePendingTransition(0,0);
}
catch (Exception e){
//e.printStackTrace();
}
// -----------------------------------------
}
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
public void onPause(){
super.onPause();
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onPause() :: 액티비티 중단 상태]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
public void onStop(){
super.onStop();
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onStop() :: 액티비티 정지 상태]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
// TODO [액티비티 생명 주기 상태 체크 메소드]
@Override
public void onDestroy(){
super.onDestroy();
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onDestroy() :: 액티비티 종료 상태]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
// TODO [액티비티 종료 메소드]
public void existsAPP(){
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> existsAPP() :: 액티비티 종료 수행 실시]");
Log.e("//===========//","================================================");
Log.i("---","---");
// [액티비티 종료 수행 실시]
finish();
overridePendingTransition(0, 0);
}
// TODO [액티비티 종료 팝업창 메소드]
public void showAlertFinish(String header, String content, String ok, String no){
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> showAlertFinish() :: 액티비티 종료 팝업창 수행 실시]");
Log.i("","\n"+"[header :: "+String.valueOf(header)+"]");
Log.i("","\n"+"[content :: "+String.valueOf(content)+"]");
Log.d("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [타이틀 및 내용 표시]
final String Tittle = String.valueOf(header);
final String Message = String.valueOf(content);
// -----------------------------------------
// [버튼 이름 정의]
String buttonYes = String.valueOf(ok);
String buttonNo = String.valueOf(no);
// -----------------------------------------
try {
// [AlertDialog 팝업창 생성]
new AlertDialog.Builder(A_CookieWebview.this)
.setTitle(Tittle) //[팝업창 타이틀 지정]
//.setIcon(R.drawable.app_icon) //[팝업창 아이콘 지정]
.setMessage(Message) //[팝업창 내용 지정]
.setCancelable(false) //[외부 레이아웃 클릭시도 팝업창이 사라지지않게 설정]
.setPositiveButton(buttonYes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
// -----------------------------------------
// TODO [확인 버튼 클릭 이벤트 처리]
existsAPP(); // [액티비티 종료 실시]
// -----------------------------------------
}
})
.setNegativeButton(buttonNo, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
// -----------------------------------------
// TODO [취소 버튼 클릭 이벤트 처리]
// -----------------------------------------
}
})
.show();
}
catch (Exception e){
//Toast.makeText(mContext, Tittle+"\n"+Message,Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
} // TODO [클래스 종료]
반응형
'투케이2K 유틸파일' 카테고리의 다른 글
Comments