【问题标题】:Android + PhoneGap intercept URL (equivalent of iOS shouldStartLoadWithRequest)Android + PhoneGap 拦截 URL(相当于 iOS shouldStartLoadWithRequest)
【发布时间】:2012-09-26 12:13:33
【问题描述】:

My PhoneGap 封装的、本地托管的 Sencha Touch 应用程序制作了一些虚假的 URL 回调来与本机封装器进行通信。 (即app_callback://do_function_a)。

在 iOS 中我实现了以下

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

检查app_callback:// URL,调用本机函数并返回 NO(以停止实际发生的导航)。

我可以在 Android 中实现一个等价物吗?

提前致谢!

【问题讨论】:

    标签: android cordova


    【解决方案1】:
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.setBooleanProperty("showTitle", true);
        super.onCreate(savedInstanceState);
    
        //creates super.appView and calls setContentView(root) in DroidGap.java
        init();
    
        this.appView.clearCache(true);
        this.appView.clearHistory();  
        this.appView.setWebViewClient(new CordovaWebViewClient(this, this.appView) {
    
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
    
                Log.d("DEBUG", "Should intercept request" +url);
                //Implement your code
                return super.shouldInterceptRequest(view, url);
            }
    
            @Override
            public void onLoadResource(WebView view, String url) {
                Log.d("DEBUG", "onLoadResource" +url);
                //Implement your code
                super.onLoadResource(view, url);
            }
    
    
    
            @Override
            public void onPageFinished(WebView view, String url) {
                Log.d("DEBUG", "On page finished "+url);
                //Implement your code
                super.onPageFinished(view, url);
            }
    
    
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
    
                Log.d("DEBUG", "should override url loading "+url);
                //Implement your code
                return super.shouldOverrideUrlLoading(view, url);
    
    
            }
    
        });super.loadUrl("file:///android_asset/www/index.html");}
    

    这适用于 API 版本 9-17 重要的是还添加了 onLoadResource

    【讨论】:

      【解决方案2】:
      public class MainActivity extends DroidGap {
      
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              super.setIntegerProperty("loadUrlTimeoutValue", 60000);
      
              this.init();
      
              this.appView.clearCache(true);
              this.appView.clearHistory();  
      
              this.appView.setWebViewClient(new CordovaWebViewClient(this, this.appView) {
      
                  @Override
                  public boolean shouldOverrideUrlLoading(WebView view, String url) {
      
                      if(url.contains("app://")) {
                           url = url.replace("app://", "");
                           Log.d("DEBUG", url);
      
                           // DO STUFF
      
                           return true;
                      } else {
                       //view.loadUrl(url);
                       return super.shouldOverrideUrlLoading(view, url);
                      }
      
                  }
      
              });
      
              super.loadUrl("file:///android_asset/www/index.html");
          }
      
      }
      

      【讨论】:

        【解决方案3】:

        是的,shouldOverrideUrlLoadingWebViewClient

        【讨论】:

        • 谢谢。我在 DroidGap 子类中设置自定义 WebViewClient 时遇到问题。你能帮忙吗?
        • 我认为在 Cordova 中,您需要扩展或修改 CordovaWebViewClient 以达到您的期望。
        【解决方案4】:

        由于这是“phonegap android intercept url”出现的第一个搜索结果,并且我遇到了同样的问题,我想我会添加一个更新的答案。我希望使用“tel:01234567890”之类的 URL 启动拨号程序。在 iOS 上,我使用了 shouldStartLoadWithRequest,效果很好。在 Android 上,我需要找到一个替代方案,结果发现最新的 PhoneGap 内置了一个功能。

        在 config.xml 文件中,您可以而且应该定义访问来源,以说明哪些 URL 模式可以在您的应用程序中工作。这是一项安全功能,但您也可以指定将在外部应用程序中启动的 URL 模式。例如,如果您的应用向 yourdomain.com 发出 JSON 请求,那么您可能会有如下条目:

        <access origin="http://www.yourdomain.com/*" />
        <access origin="https://www.yourdomain.com/*" />
        <access origin="tel:*" launch-external="yes" />
        <access origin="http:*" launch-external="yes" />
        <access origin="https:*" launch-external="yes" />
        

        当在 WebView 中访问 URL 时,Cordova 将首先检查是否有任何内部规则匹配,然后检查是否有任何外部规则匹配。如果没有一个内部规则匹配,但有一个外部规则匹配,则在 Intent 中启动 URL。

        这对我来说非常有用,但如果您需要更多定制的东西,我发现处理它的代码在 CordovaUriHelper.java 中的函数 shouldOverrideUrlLoading 中。因此,如果您想稍微自定义一下,您可以做任何事情。

        【讨论】:

          【解决方案5】:

          实际上 shouldOverrideUrl 加载不太可能起作用。相反,对于 SDK>=11 的 android,您应该使用 shouldInterceptRequest。

          webview shouldinterceptrequest example

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-01-10
            • 2020-04-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多