본문 바로가기
프로그래밍-앱/안드로이드스튜디오

[ 안드로이드스튜디오 ] net::err_unknown_url_scheme 웹뷰

by 지연2 2023. 4. 26.
728x90

정말 정말 이것 때문에 너무 생고생을 했는데 

완전 어이없게 해결됐다


 기존코드 

public class MainActivity extends AppCompatActivity {

    WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = findViewById(R.id.webView);
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true); // allow the js
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        webSettings.setSupportMultipleWindows(true);

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER);

        webView.setWebViewClient(new WebViewClient());
        webView.loadUrl("웹뷰 URL");


        ActionBar actionBar = getSupportActionBar();
        actionBar.hide();
    }

    
}

 해결 

 


1. WebViewClient 이너클래스 생성


 

setWebViewClient
setWebVIewClient

해당 코드 위에 마우스를 올리면(오류 표시가 안뜬다면 WebViewClient import를 제거한다)

more actions
more actions

import class를 누르지 말고 More actions을 눌린다

 

WebVIewClient
WebViewClient

제일 마지막 Create inner class 'WebViewClient' 클릭

 

 

그럼 아래의 사진처럼 코드가 자동생성된다

생성코드
생성코드

 

 


2. shouldOverrideUrlLoading 오버라이딩하기


 

아래의 코드를 WebViewClient 클래스 안에 붙여넣기 한다

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.startsWith("intent://") || url.startsWith("tel:")) {
        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()));
                try {
                   startActivity(marketIntent);
                } catch (ActivityNotFoundException e){
                    Intent webIntent = new Intent(Intent.ACTION_VIEW);
                    webIntent.setData(Uri.parse("https://play.google.com/store/apps/details?id=" + getPackageName()));
                    startActivity(webIntent);
                }
            }
            return true;
        }catch (Exception e) {
            e.printStackTrace();
        }
    } else if (url.startsWith("market://")) {
        try {
            Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);

            Intent marketIntent = new Intent(Intent.ACTION_VIEW);
            marketIntent.setData(Uri.parse("market://details?id="+intent.getPackage()));
            try {
                startActivity(marketIntent);
            } catch (ActivityNotFoundException e){
                Intent webIntent = new Intent(Intent.ACTION_VIEW);
                webIntent.setData(Uri.parse("https://play.google.com/store/apps/details?id=" + getPackageName()));
                startActivity(webIntent);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    view.loadUrl(url);
    return true;
}

 

 

 

그럼 이제 오류가 안나온다!

댓글