Android WebView“tel:”链接显示网页未find

我想让我的android webview应用程序打开电话:链接到手机。 每次我打开一个电话链接,它都很好,打开了电话。 但是,一旦我完成了我的通话,回到应用程序,它是在一个网页上说:“网页找不到电话:0000000000”。 然后我必须再次点击后退button才能进入到我点击电话号码的页面。

有没有办法让它打开电话的链接,而不是试图在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; } 

任何帮助,将不胜感激。 我已经花了最后2个小时淘宝,并没有提供任何答案。

好,所以我解决了我想的问题。 我只需要分开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; } 

现在我的常规链接和电话链接一样工作。 如果需要的话,我还可以在那里添加geo:链接,这不会给我以前在电话上打开地图的问题。

而不是调用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; } 

我发现查看电话:在我们尝试过的所有手机上按预期工作。 由于DIAL操作,无需特殊情况。

我注意到YouTubevideo等在WebViews中不起作用,因此您可能也要检测这些video。

整个过程可能通过查询PackageManager来处理你的URI而不是embedded式浏览器,从而推广到所有types的URI。 这可能是矫枉过正,并被其他安装的浏览器弄糊涂了。

根据我的经验,根据我的经验, Intent.ACTION_VIEW 完全可以parsingtel:sms:smsto:mms:mmsto: links。

这是一个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; } 

注意: – Android Nouget shouldOverrideUrlLoading已弃用

您需要使用shouldOverrideUrlLoadingshouldOverrideUrlLoading来获得更好的支持。 你也可能想要检查url是否有mailto:tel这些在HTML5中用来分别触发邮件客户端和电话拨号。

一个完整的解决scheme现在看起来像这样

  @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; } 

如果没有将WebViewClient分配给WebView,默认情况下WebView将要求活动pipe理器为URLselect正确的处理程序。 如果提供了WebViewClient,则应该自己处理不同的URL,并在WebViewClient.shouldOverrideUrlLoading()中返回true,否则将尝试向URL发送请求并获取错误,然后触发onReceiveError()。

检查文档:WebViewClient.shouldOverrideUrlLoading

  @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("tel:")) { // ...TODO: launch a Dial app or send SMS or add to contact, etc... return true; } else if (url.startsWith("mailto:")) { // ...TODO: send email to someone or add to contact, etc... return true; } else { // ...TODO: Handle URL here boolean handled = yourHandleUrlMethod(url); return handled; } } 
 public boolean shouldOverrideUrlLoading(WebView view, String url) {Uri query_string=Uri.parse(url); String query_scheme=query_string.getScheme(); String query_host=query_string.getHost(); if ((query_scheme.equalsIgnoreCase("https") || query_scheme.equalsIgnoreCase("http")) && query_host!=null && query_host.equalsIgnoreCase(Uri.parse(URL_SERVER).getHost()) && query_string.getQueryParameter("new_window")==null ) {return false;//handle the load by webview } try {Intent intent=new Intent(Intent.ACTION_VIEW, query_string); String[] body=url.split("\\?body="); if (query_scheme.equalsIgnoreCase("sms") && body.length>1) {intent=new Intent(Intent.ACTION_VIEW, Uri.parse(body[0])); intent.putExtra("sms_body", URLDecoder.decode(body[1])); } view.getContext().startActivity(intent);//handle the load by os } catch (Exception e) {} return true; }