Android WebView"tel:"链接显示未找到网页

Jef*_*mas 62 android android-webview

我想让我的android webview应用程序打开tel:电话链接.每次打开电话链接时,它都能很好地打开电话.然而,一旦我完成了我的通话并返回应用程序,它就会出现在"未找到网页电话:0000000000"的页面上.然后我必须再次点击后退按钮才能进入我点击电话号码的页面.

有没有办法让它打开TEL链接而不试图在webview中找到页面以及在手机上打开它?

这是我在WebView中使用的代码,用于覆盖其对TEL和Mailto链接的处理:

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("mailto:") || url.startsWith("tel:")) { 
                Intent intent = new Intent(Intent.ACTION_VIEW,
                        Uri.parse(url)); 
                startActivity(intent); 
                } 
        view.loadUrl(url);
        return true;
        }
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.我花了最后2个小时来搜索goodle并且未能提出任何答案.

Jef*_*mas 105

好的,所以我解决了我认为的问题.我只需要按如下方式分隔URL覆盖:

public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.startsWith("tel:")) { 
        Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url)); 
        startActivity(intent);
        view.reload();
        return true;
    }

    view.loadUrl(url);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

现在我的常规链接和tel链接一样.我还可以添加geo:链接,如果我需要,它不会给我我之前在手机上打开地图的问题.

  • @jasonflaherty实际上CALL_PHONE权限适用于ACTION_CALL而不是ACTION_DIAL.因此,即使未经许可,上述代码也能正常工作. (7认同)
  • 将<uses-permission android:name ="android.permission.CALL_PHONE"/>添加到Manifest. (6认同)
  • 请不要按原样复制上面的代码.从回调返回false而不是调用view.loadUrl.调用loadUrl会引入一个微妙的错误,如果你在页面中有任何iframe,并带有自定义方案URL(比如说<iframe src ="tel:123"/></iframe>),它会将你应用程序的主框架导航到最有可能破坏应用程序的URL副作用. (4认同)
  • 你不需要view.loadUrl(url); 返回true将导致WebView覆盖URL并处理它看起来如何适合. (3认同)
  • 咄.我刚刚意识到你正在tel:link上调用view.LoadUrl(url).你也可以在`startActivity()之后添加一个`return true`. (2认同)

Anm*_*Anm 52

而不是调用loadUrl(url),只为不应被覆盖的URL返回false:

public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if( URLUtil.isNetworkUrl(url) ) {
        return false;
    }

    // Otherwise allow the OS to handle it
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    startActivity( intent ); 
    return true;
}
Run Code Online (Sandbox Code Playgroud)

我发现VIEWing tel:在我们尝试过的所有手机上按预期工作.由于DIAL行动,无需特殊情况.

我注意到YouTube视频等在WebView中不起作用,因此您可能也想要检测它们.

通过查询处理URI的活动的PackageManager(也不是嵌入式浏览器),整个过程可能会针对所有类型的URI进行推广.这可能是过度的,并被其他已安装的浏览器搞糊涂了.

  • 您可以使用URLUtil.isNetworkUrl(url)进行http/https(和其他)检查 (2认同)
  • 很棒的建议,@ xnagyg.我已经更新了我的代码段. (2认同)
  • 这比添加单个URL方案更实用. (2认同)

Ped*_*ito 17

根据该文件,并根据我的经验,Intent.ACTION_VIEW完全正常解析tel:,sms:,smsto:,mms:mmsto:链接.

这是一个5合1:

@Override
    public boolean shouldOverrideUrlLoading(WebView webview, String url)
    {
     if (url.startsWith("tel:") || url.startsWith("sms:") || url.startsWith("smsto:") || url.startsWith("mms:") || url.startsWith("mmsto:"))
       { 
         Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(url)); 
         startActivity(intent); 
         return true;
       }
    return false;
   }
Run Code Online (Sandbox Code Playgroud)


Hit*_*ahu 9

注意: - Android Nouget shouldOverrideUrlLoading已弃用

您需要使用shouldOverrideUrlLoadingshouldOverrideUrlLoading获得更好的支持.此外,您可能想要检查URL是否具有mailto:tel:,HTML5中使用它们分别触发邮件客户端和电话拨号.

完整的解决方案现在看起来像这样

    @SuppressWarnings("deprecation")
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("mailto:")) {  
            //Handle mail Urls
            startActivity(new Intent(Intent.ACTION_SENDTO, Uri.parse(url)));
        } else if (url.startsWith("tel:")) {
            //Handle telephony Urls
            startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(url)));
        } else {
            view.loadUrl(url);
        }
        return true;
    }

    @TargetApi(Build.VERSION_CODES.N)
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        final Uri uri = request.getUrl();
        if (uri.toString().startsWith("mailto:")) {
            //Handle mail Urls
            startActivity(new Intent(Intent.ACTION_SENDTO, uri));
        } else if (uri.toString().startsWith("tel:")) {
            //Handle telephony Urls
            startActivity(new Intent(Intent.ACTION_DIAL, uri));
        } else {
            //Handle Web Urls
            view.loadUrl(uri.toString());
        }
        return true;
    }
Run Code Online (Sandbox Code Playgroud)