Notice
Recent Posts
Recent Comments
Link
투케이2K
244. (AndroidStudio/android/java) 웹뷰 shouldOverrideUrlLoading 실시간 주소 감지 부분 확인 및 외부 앱 실행 실시 본문
Android
244. (AndroidStudio/android/java) 웹뷰 shouldOverrideUrlLoading 실시간 주소 감지 부분 확인 및 외부 앱 실행 실시
투케이2K 2021. 12. 31. 15:25[개발 환경 설정]
개발 툴 : AndroidStudio
개발 언어 : java
[소스 코드]
// [새로운 URL이 webview에 로드되려 할 경우 컨트롤을 대신할 기회를 줌]
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"[A_Nice >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"[기본 주소 :: "+String.valueOf(url)+"]");
Log.i("","\n"+"[getUrl 주소 :: "+String.valueOf(main_webview.getUrl())+"]");
Log.i("","\n"+"[getOriginalUrl 주소 :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
Log.i("","\n"+"[설 명 :: "+String.valueOf("새로운 URL이 webview에 로드")+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// [SEARCH FAST] : [외부앱 실행 실시]
// [외부앱 실행 인텐트 이동 실시 : if(url.startsWith("intent://")]
if(url.startsWith("intent://")) {
// ----------------------------------
// TODO [웹뷰 내 표준창에서 외부앱을 호출하려면 intent:// URI를 별도로 처리]
Intent intent = null;
try {
intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
String packgeName = String.valueOf(intent.getPackage());
// [패키지 명이 널이 아닌 경우]
if (packgeName != null && packgeName.length()>0 && !packgeName.equals("") && !packgeName.contains("null")) {
/**
* // -----------------------------------------
* [안드로이드 OS 11 및 타겟 30 이상 필수 사항]
* [AndroidManifest.xml 파일 > manifest 부분 > 특정 앱 패키지명 등록 필요]
* <queries>
* <package android:name="com.android.chrome" />
* </queries>
* // -----------------------------------------
* */
Intent existPackage = getPackageManager().getLaunchIntentForPackage(intent.getPackage());
if (existPackage != null) {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"[A_Nice >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"[로 직 :: 외부 앱 이동 수행 실시 - intent://]");
Log.i("","\n"+"[패키지명 :: "+String.valueOf(packgeName)+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
} else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"[A_Nice >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"[로 직 :: 외부 앱 설치 진행 실시 - intent://]");
Log.i("","\n"+"[error :: existPackage is null]");
Log.i("","\n"+"[패키지명 :: "+String.valueOf(packgeName)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
Intent marketIntent = new Intent(Intent.ACTION_VIEW);
marketIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
marketIntent.setData(Uri.parse("market://details?id=" + packgeName));
startActivity(marketIntent);
}
}
else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"[A_Nice >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"[로 직 :: 외부 앱 실행 실패 - intent://]");
Log.i("","\n"+"[error :: packgeName Error]");
Log.i("","\n"+"[패키지명 :: "+String.valueOf(packgeName)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
}
catch (URISyntaxException e) {
// [URI 문법 오류 시 처리 구간]
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"[A_Nice >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"[로 직 :: Intent URL Scheme 문법 오류 발생 - URISyntaxException]");
Log.i("","\n"+"[error :: "+String.valueOf(url)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
catch (ActivityNotFoundException e) {
// [인텐트 이동을 수행할 앱을 발견하지 못한 경우]
String packageName = String.valueOf(intent.getPackage());
// [패키지 명이 널이 아닌 경우]
if (packageName != null && packageName.length()>0 && !packageName.equals("") && !packageName.contains("null")) {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"[A_Nice >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"[로 직 :: 외부 앱 설치 진행 실시 - ActivityNotFoundException]");
Log.i("","\n"+"[패키지명 :: "+String.valueOf(packageName)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
Intent marketIntent = new Intent(Intent.ACTION_VIEW);
marketIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
marketIntent.setData(Uri.parse("market://details?id=" + packageName));
startActivity(marketIntent);
}
else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"[A_Nice >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"[로 직 :: 외부 앱 설치 실패 - ActivityNotFoundException]");
Log.i("","\n"+"[error :: packgeName Error]");
Log.i("","\n"+"[패키지명 :: "+String.valueOf(packageName)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
}
// ----------------------------------
// [return 값을 반드시 true 설정]
return true;
// ----------------------------------
}
else if (url.startsWith("https://play.google.com/store/apps/details?id=")
|| url.startsWith("market://details?id=")
|| url.startsWith("http://play.google.com/store/apps/details?id=") ) {
// ----------------------------------
// [표준창 내 앱설치하기 버튼 클릭 시 PlayStore 앱으로 연결하기 위한 로직]
Uri uri = Uri.parse(url);
String packageName = String.valueOf(uri.getQueryParameter("id"));
// [패키지명 널 체크 수행 실시]
if (packageName != null && packageName.length()>0 && !packageName.equals("") && !packageName.contains("null")) {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"[A_Nice >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: 외부 앱 설치 수행 실시 - market://details]");
Log.i("","\n"+"[패키지명 :: "+String.valueOf(packageName)+"]");
Log.w("//===========//","================================================");
Log.i("---","---");
// [구글 마켓 이동]
Intent marketIntent = new Intent(Intent.ACTION_VIEW);
marketIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
marketIntent.setData(Uri.parse("market://details?id=" + packageName));
startActivity(marketIntent);
}
else {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"[A_Nice >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"[타 입 :: 외부 앱 설치 수행 실패 - market://details]");
Log.i("","\n"+"[패키지명 :: "+String.valueOf(packageName)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
// ----------------------------------
// [return 값을 반드시 true 설정]
return true;
// ----------------------------------
}
// ----------------------------------
// [새로운 웹뷰 로드 수행]
view.loadUrl(url);
// ----------------------------------
// [return 값을 반드시 false 설정]
return false;
// ----------------------------------
}
반응형
'Android' 카테고리의 다른 글
Comments