首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android WebView err_unknown_url_scheme

Android WebView err_unknown_url_scheme
EN

Stack Overflow用户
提问于 2017-01-17 09:22:18
回答 5查看 85.4K关注 0票数 27

使用下面的简单代码,我可以正确地加载我的url,但是,当我试图点击以mailto: whatsapp:和tg:(Telegram)开头的html链接时,我会得到"ERR_UNKNOWN_URL_SCHEME“。

有人能帮我解决这个问题吗?不幸的是,我根本不懂Java :(

谢谢。

代码语言:javascript
复制
    import android.app.Activity;
    import android.os.Bundle;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
        
    public class MainActivity extends Activity {
    
        private WebView mWebView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mWebView = (WebView) findViewById(R.id.activity_main_webview);
    
            // Force links and redirects to open in the WebView instead of in a browser
            mWebView.setWebViewClient(new WebViewClient());
    
            // Enable Javascript
            WebSettings webSettings = mWebView.getSettings();
            webSettings.setJavaScriptEnabled(true);
    
            // Use remote resource
            mWebView.loadUrl("http://myexample.com");
        }
    }
EN

回答 5

Stack Overflow用户

发布于 2017-01-17 09:27:18

您必须在webview中设置一个客户端,并将它们传递给意图。

代码语言:javascript
复制
webView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if( URLUtil.isNetworkUrl(url) ) {
                return false;
            }
            if (appInstalledOrNot(url)) {
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                startActivity( intent );
            } else {
                // do something if app is not installed
            }
            return true;
        }

    });
}

您可以有一个方法来检查应用程序是否已安装。

代码语言:javascript
复制
private boolean appInstalledOrNot(String uri) {
        PackageManager pm = getPackageManager();
        try {
            pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
        }

        return false;
    }
票数 19
EN

Stack Overflow用户

发布于 2018-10-30 07:36:30

您需要重写shouldOverrideUrlLoading of WebViewClient方法,在该方法中,您可以自己控制链接传输。

因为http://“或https://"不是普通的url,所以WebView不能解析它到正确的位置,所以我们应该使用意图重定向url。

例如:

代码语言:javascript
复制
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url == null || url.startsWith("http://") || url.startsWith("https://")) return false;

                try {
                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                    view.getContext().startActivity(intent);
                    return true;
                } catch (Exception e) {
                    Log.i(TAG, "shouldOverrideUrlLoading Exception:" + e);
                    return true;
                }
            }

然后setWebViewClient到您的WebView,如下所示:

代码语言:javascript
复制
    public class MainActivity extends Activity {

    private WebView mWebView;

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

        mWebView = (WebView) findViewById(R.id.activity_main_webview);

        // Force links and redirects to open in the WebView instead of in a browser
        mWebView.setWebViewClient(new WebViewClient() {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url == null || url.startsWith("http://") || url.startsWith("https://")) return false;

            try {
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                view.getContext().startActivity(intent);
                return true;
            } catch (Exception e) {
                Log.i(TAG, "shouldOverrideUrlLoading Exception:" + e);
                return true;
            }
        }
        });

        // Enable Javascript
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        // Use remote resource
        mWebView.loadUrl("http://myexample.com");
    }}
票数 12
EN

Stack Overflow用户

发布于 2019-10-21 16:33:59

代码语言:javascript
复制
@Override
        public boolean shouldOverrideUrlLoading(WebView wv, String url) {
            if(url.startsWith("tel:") || url.startsWith("whatsapp:")) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse(url));
                startActivity(intent);
                return true;
            }
            return false;
        }

将此代码放入mWebView.setWebViewClient(新的WebViewClient() )中。它将非常适合所有链接,如tel:whatsapp:mailto:等。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41693263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档