Android WebView:Tel:Geo:Mailto:正确处理

时间:2012-03-10 19:08:55

标签: android

有人可以帮助解释如何使用WebView正确处理Tel:Geo:和Mailto:链接。

目前所有链接都会导致“无法显示页面”错误。

以下是我正在使用的代码,它是从其他建议的解决方案中汇总而来的:

mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setBuiltInZoomControls(true);
mWebView.getSettings().setUseWideViewPort(true);
mWebView.loadUrl("http://www.google.com");
mWebView.setWebViewClient(new HelloWebViewClient()); 

}
private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        if (url.startsWith("tel:")) { 
            startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(url))); 
            return true; 
        } else if (url.startsWith("mailto:")) { 
            url = url.replaceFirst("mailto:", ""); 
            url = url.trim(); 
            Intent i = new Intent(Intent.ACTION_SEND); 
            i.setType("plain/text").putExtra(Intent.EXTRA_EMAIL, new String[]{url}); 
            startActivity(i); 
            return true; 
        } else if (url.startsWith("geo:")) { 
            Intent searchAddress = new Intent(Intent.ACTION_VIEW, Uri.parse(url));  
            startActivity(searchAddress);        
            return true; 
        } else { 
            view.loadUrl(url); 
            return true; 
        } 
    } 
}

}

2 个答案:

答案 0 :(得分:1)

This answer为我工作,您可以在每种情况下使用Intent.ACTION_VIEW,因为它会强制设备找到向用户显示的可能选项。

答案 1 :(得分:0)

本准则对我有用: (如果您使用后退按钮,上面的代码不正确)

调用自定义Webview:

view.setWebViewClient(new CustomWebViewClient());

现在扩展WebView:

 private class CustomWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if( url.startsWith("http:") || url.startsWith("https:") ) {
                return false;
            }
            // Otherwise allow the OS to handle it
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity( intent );
            return true;
        }
    }