Notice
Recent Posts
Recent Comments
Link
투케이2K
254. (AndroidStudio/android/java) 웹뷰 intent scheme 스키마 딥링크 확인 및 외부앱 수행 실시 - shouldOverrideUrlLoading 본문
Android
254. (AndroidStudio/android/java) 웹뷰 intent scheme 스키마 딥링크 확인 및 외부앱 수행 실시 - shouldOverrideUrlLoading
투케이2K 2022. 1. 24. 08:10[개발 환경 설정]
개발 툴 : 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("---","---");
// [외부앱 실행 인텐트 이동 실시 : 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")) {
Intent existPackage = getPackageManager().getLaunchIntentForPackage(intent.getPackage());
if (existPackage != null) {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"[A_Nice >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
Log.i("","\n"+"[success [성공] :: 외부 앱 이동 수행 실시 - 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"+"[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"+"[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"+"[catch [URISyntaxException] :: Intent URL Scheme 문법 오류 발생]");
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"+"[catch [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"+"[catch [ActivityNotFoundException] :: 외부 앱 설치 실패]");
Log.i("","\n"+"[error :: PackgeName Error]");
Log.i("","\n"+"[패키지명 :: "+String.valueOf(packageName)+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
}
}
// ----------------------------------
// [return 값을 반드시 true 설정]
return true;
// ----------------------------------
}
// ----------------------------------
// [새로운 웹뷰 로드 수행]
view.loadUrl(url);
// ----------------------------------
// [return 값을 false 설정]
return false;
// ----------------------------------
}
}
반응형
'Android' 카테고리의 다른 글
Comments