본문 바로가기
Android

Android Studio, JAVA] 안드로이드 웹뷰에서 ISP 요청시 ERR_UNKNOWN_URL_SCHEME 오류 해결법

by 김마리님 2021. 3. 12.

이유가 너무.. 간단하다. 좀 황당할정도로 어이 없는데,

웹뷰에서 앱 - 앱간의 통신 시에 인텐트를 열기 위한 String을 웹뷰가 uri로 로딩하며 생기는 문제이다.

ISP 같은 경우

ispmobile://TID= XXXXXXXXXXXXX

로 요청하기 때문에 당연지사 http:// 등 웹이 로드할 수 없는 형태로 요청하니까 오류를 출력한다.

이걸 그럼 어떻게 해결하냐고? 웹뷰에서 uri이 오버로딩 될 때 uri을 낚아채서 인텐트를 요청하면 된다.

 

private WebViewClient = new WebViewClient() {
...


        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

            //안드로이드가 앱 - 앱 간 인텐트 로딩할때 uri 방식으로 로드하기 때문에 오버라이드 단계에서 uri로 판단해서, 정상 uri가 아닐 경우 scheme로 parse 하여 인텐트 요청
            if(!request.getUrl().toString().startsWith("http://") && !request.getUrl().toString().startsWith("https://") && !request.getUrl().toString().startsWith("javascript")) {
                Intent intent = null;

                try {
                    intent = Intent.parseUri(request.getUrl().toString(), Intent.URI_INTENT_SCHEME);
                    Uri uri = Uri.parse(intent.getDataString());

                    webView.getContext().startActivity(new Intent(Intent.ACTION_VIEW, uri));
                    return true;

                } catch (URISyntaxException e) {
                    e.printStackTrace();
                    return false;
                } catch (ActivityNotFoundException e) {
                    if(intent == null) {
                        return false;
                    }

                    String packageName = intent.getPackage();
                    if(packageName != null) {
                        webView.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName)));
                        return true;
                    }

                    return false;
                }
            }

            return super.shouldOverrideUrlLoading(view, request);

        }

}

 

이 클라이언트를 웹뷰에 셋하기만 하면 된다. 간단하지?!

반응형