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

 

반응형
Comments