22

我创建了一个 web 视图应用程序,显示的页面包含 market:// 链接,但是单击它们后,我会看到 404 屏幕以及不支持协议的错误。我尝试过查看文档,但找不到与此相关的任何内容。任何帮助深表感谢。

4

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

对我来说,这很好用。

于 2011-04-01T14:19:49.610 回答
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;
        }
}
于 2015-01-09T15:00:14.747 回答
1

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

UPD:作为一种解决方法,您可以从 web 视图中调用 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");

Handler接口可以定义如下:

   public interface Handler{

    public void go(String url);

}
于 2010-08-27T10:53:47.787 回答
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;
        }
    }
}
于 2015-02-03T17:01:12.060 回答
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() 方法,如上面提供的链接中所述。它应该解决目的。

于 2015-07-24T07:26:41.763 回答
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;
 }
于 2019-02-26T11:45:39.300 回答
-2

最简单的解决方案

 Intent newApp = new Intent(Intent.ACTION_VIEW,  Uri.parse(URL));
startActivity(newApp);
于 2013-04-23T06:13:51.723 回答