Android webview的其他协议支持

22

我创建了一个Web视图应用程序,显示的页面包含market://链接,但单击它们时出现404错误屏幕,提示不支持该协议。我尝试查找文档,但没有找到相关内容。非常感谢任何帮助。

7个回答

43

对我来说,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;
    }
}
对我来说,这个很好用。

伟大的想法,快速简便。但我确实认为会有官方协议识别支持。 - Kevin Parker
应该在onReceivedError中调用它,而不是shouldOverrideUrlLoading。 - Omid Aminiva
@OmidAminiva 可能不会 - 这意味着意图已经得到很好的处理,但用户会看到一个错误消息。 - Armand

3
希望这能帮到你。
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;
        }
}

1
最好在代码之外添加一些解释。 - Paul Lo
请考虑在您的答案中包含一些信息,而不仅仅是发布代码。我们试图提供的不仅仅是“修复”,而是帮助人们学习。您应该解释原始代码中的错误之处,您做了什么不同的事情以及为什么您的更改有效。 - Andrew Barber

1

为了使链接正常工作,您必须在设备/模拟器上安装市场应用程序。 此外,您的应用程序需要请求访问网络的权限。

更新: 作为解决方法,您可以从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);

}

你使用的是什么设备?你确定该设备已安装市场客户端吗? - Konstantin Burov
或者是否有可能通过一些变通方法,使用默认浏览器打开market://链接? - user319940
链接是由您生成的吗?如果是,您可以使用JavaScript调用Android Java代码,从而启动市场意图。 - Konstantin Burov
是的,这些链接是由我输入的。基本上是通过webview包装我的WordPress网站的移动版本,其中包含市场链接。所以我需要在我的网站中使用JavaScript?我不熟悉JavaScript,所以任何建议或指引都将不胜感激。 - user319940
谢谢更新,我会尝试一下并告诉你它的效果如何 :)。 - user319940
显示剩余5条评论

0

给我工作:

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

0

不要为特定的方案添加检查,改变@sven的解决方案,这将适用于所有方案

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

0

了解webview及其客户端(webviewclient和webchromeclient)的工作原理非常重要。请阅读http://therockncoder.blogspot.in/2014/04/understanding-androids-webchromeclient.html

在webviewclient的shouldOverrideUrlLoading()方法中,您可以决定是否要在新浏览器中打开链接或在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! 或者 market://details?id=xx.xx.xx 这样的方案会在用户手持设备上安装了相应应用的前提下,在Webview之外自动打开相应的应用。

如果您想在Webview内打开某些链接并在Webview之外打开特定方案,您需要重写WebChromeClients onCreateWindow() 方法,如上述链接所述。这应该能够解决问题。


-2

最简单的解决方案

 Intent newApp = new Intent(Intent.ACTION_VIEW,  Uri.parse(URL));
startActivity(newApp);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接