투케이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;
            // ----------------------------------
        }
    }

 

반응형
Comments