Android프로그래밍

[Android Studio]안드로이드 웹뷰로 url 호출시 net::ERR_UNKNOWN_URL_SCHEME 오류 발생 해결하기

참 오랜만에 앱을 업데이트 하면서

새로 개발한 앱을 홍보를 해볼까?

메뉴 하나 추가해서 구글플레이 url 링크 하나 걸어서 테스트를 하였는데,

아래와 같이 오류가 발생되었다.

오류가 발생한 웹뷰 코드는 다음과 같다.


오류 발생한 WebView 코드

//웹뷰에서 홈페이지를 띄웠을때 새창이 아닌 기존창에서 실행이 되도록 아래 코드를 넣어준다.
    private class WebViewClientClass extends WebViewClient {//페이지 이동
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            mProgressBar.setVisibility(ProgressBar.VISIBLE);
            webView.setVisibility(View.INVISIBLE);
        }
        @Override
        public void onPageCommitVisible(WebView view, String url) {
            super.onPageCommitVisible(view, url);
            mProgressBar.setVisibility(ProgressBar.GONE);
            webView.setVisibility(View.VISIBLE);
        }
//        @Override
//        public void onPageFinished(WebView view, String url) {
//            findViewById(R.id.progress1).setVisibility(View.GONE);
//        }
        @Override
        public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(WebActivity.this);
            String message = "SSL Certificate error.";
            switch (error.getPrimaryError()) {
                case SslError.SSL_UNTRUSTED:
                    message = "The certificate authority is not trusted.";
                    break;
                case SslError.SSL_EXPIRED:
                    message = "The certificate has expired.";
                    break;
                case SslError.SSL_IDMISMATCH:
                    message = "The certificate Hostname mismatch.";
                    break;
                case SslError.SSL_NOTYETVALID:
                    message = "The certificate is not yet valid.";
                    break;
            }
            message += " Do you want to continue anyway?";
            builder.setTitle("SSL Certificate Error");
            builder.setMessage(message);
            builder.setPositiveButton("continue", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    handler.proceed();
                }
            });
            builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    handler.cancel();
                }
            });
            final AlertDialog dialog = builder.create();
            dialog.show();
        }
    }


net::ERR_UNKNOWN_URL_SCHEME 해결 방법

shouldOverrideUrlLoading()함수를 오버라이드 하는 부분에 코드를 추가해주어야한다.

@Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.startsWith("intent:")) {
                try {
                    Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
                    Intent existPackage = getPackageManager().getLaunchIntentForPackage(intent.getPackage());
                    if (existPackage != null) {
                        startActivity(intent);
                    } else {
                        Intent marketIntent = new Intent(Intent.ACTION_VIEW);
                        marketIntent.setData(Uri.parse("market://details?id=" + intent.getPackage()));
                        startActivity(marketIntent);
                    }
                    return true;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                view.loadUrl(url);
            }
            return true; 
        } 

intent 체크 조건을 추가해주면 , url 중에 구글플레이스토어 url이 유입될 경우 안드로이드 웹뷰에서 바로 구글플레이스토어 앱을 실행하여 앱을 바로 찾아준다.

error: Content is protected !!