代码之家  ›  专栏  ›  技术社区  ›  user319940

支持Android webview中的其他协议

  •  19
  • user319940  · 技术社区  · 14 年前

    7 回复  |  直到 11 年前
        1
  •  42
  •   sven    13 年前

    对我来说,JavaScript不是一个解决方案,因为HTML不在我的控制之下。因此,如果您需要从应用程序端对此进行控制,那么有一个相对简单的解决方案:从 WebViewClient 并使用 WebView.setWebViewClient() . 你需要在你的 WebView客户端 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;
        }
    }
    

    对我来说这很好。

        2
  •  2
  •   Sathish Kumar    10 年前

    希望这对你有帮助

    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;
            }
    }
    
        3
  •  1
  •   Konstantin Burov    14 年前

    你的应用程序还需要请求访问网络的权限。

    升级版本: 作为一种解决方法,您可以从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);
    
    }
    
        4
  •  0
  •   Jonathan Nolasco Barrientos    10 年前

    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;
            }
        }
    }
    
        5
  •  0
  •   Tarang Zilpe    9 年前

    了解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://发送?text=你好%20World! 市场详情?身份证=xx.xx.xx 如果在webview之外打开相应的应用程序,并且该应用程序安装在手机上,则会自动打开这些应用程序。

    如果要打开webview中的某些链接和webview之外的特定方案,则需要重写WebChromeClients onCreateWindow()方法,如上面提供的链接中所述。它应该能解决这个问题。

        6
  •  0
  •   Sumit    6 年前

    不是为特定方案添加检查,而是修改@sven solution,这将适用于所有方案

    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;
     }
    
        7
  •  -2
  •   Ciff    11 年前

    最简单的解决方案

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