支持Android WebView中的其他协议
-
01-10-2019 - |
题
我已经创建了一个Web视图应用程序,即显示为“市场”市场的页面://链接,但是单击它们后,我将获得404屏幕以及不支持协议的错误。我尝试查看文档,但找不到与此有关的任何内容。任何帮助深表感谢。
解决方案
对我来说,JavaScript的东西不是解决方案,因为HTML不在我的控制之下。因此,如果您需要从应用程序侧控制它,则有一个相对简单的解决方案:从 WebViewClient
并使用 WebView.setWebViewClient()
. 。您需要覆盖自己的一切 WebViewClient
实施是 shouldOverrideUrlLoading
如下所示的方法:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url != null && url.startsWith("market://")) {
view.getContext().startActivity(
new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
} else {
return false;
}
}
对我来说,这很好。
其他提示
有关工作的链接,您必须在设备/仿真器上安装市场应用程序。此外,您的应用需要请求访问网络的权限。
UPD:作为解决方法,您可以从WebView中调用Java代码,例如,如果您生成这样的链接:
<a href="javascript:go('market://your.path.to.market.app')">..</a>
定义名为go()的JavaScript函数:
<script type="text/javascript">
function go(link) {
if (handler) {
handler.go(link);
} else {
document.location = link;
}
}
</script>
然后,您可以将处理程序对象传递到WebView:
webview.addJavascriptInterface(new Handler() {
@Override
public void go(String marketUrl) {
//start market intent here
}
}, "handler");
处理程序接口可以定义如下:
public interface Handler{
public void go(String url);
}
希望这对你有帮助
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
if (url.startsWith("market://")||url.startsWith("vnd:youtube")||url.startsWith("tel:")||url.startsWith("mailto:"))
{
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
return true;
}
else{
view.loadUrl(url);
return true;
}
}
为我工作:
webView = (WebView) findViewById(R.id.webView);
webView.setWebChromeClient(new WebChromeClient());
webView.getSettings().setPluginState(WebSettings.PluginState.ON);
webView.getSettings().setPluginState(WebSettings.PluginState.ON_DEMAND);
webView.setWebViewClient(new MyWebViewClient());
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://myweb.com");
private class MyWebViewClient extends WebViewClient {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url != null && url.startsWith("whatsapp://")) {
view.getContext().startActivity(
new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
} else {
return false;
}
}
}
重要的是要了解WebView及其客户端(WebViewClient和Web Cromeclient)的工作方式。请通过 http://therockncoder.blogspot.in/2014/04/understanding-androids-webchromeclient.html
在WebViewClient的shoreoverrideurlloading()方法中,您可以决定是否要在新浏览器中或WebView中打开链接。如果您不覆盖此方法,则默认情况下将在您的Android应用程序之外的新浏览器中打开链接。如果您想在WebView中打开,请覆盖以下方法
public boolean shouldOverrideUrlLoading(WebView view, String url) { <br>
Log.v("activity", "INSIDE WEBVIEW CLIENT ON shouldOverrideUrlLoading");
view.loadUrl(url);
return false; //need to understand return value based on usage
}
类似的方案 whatsapp:// send?text = hello%20world! 或者 市场://详细信息?id = xx.xx.xx 如果在WebView之外打开以及该应用程序安装在手机上,则将自动打开相应的应用程序。
如果要在WebView和WebView之外打开特定方案中的某些链接,则需要覆盖上面提供的链接中所述的WebChromeClients OnCreateWindow()方法。它应该解决目的。
这将适用于所有方案
public boolean shouldOverrideUrlLoading(WebView view, String url) {
String host= Uri.parse(url).getHost();
if (host == null) {
view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
}
view.loadUrl(url);
return false;
}
最简单的解决方案
Intent newApp = new Intent(Intent.ACTION_VIEW, Uri.parse(URL));
startActivity(newApp);