5

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 中实现一个等价物吗?

提前致谢!

4

5 回答 5

10
@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

于 2012-12-12T21:58:58.073 回答
6
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");
    }

}
于 2012-09-26T15:04:18.323 回答
1

是的,shouldOverrideUrlLoadingWebViewClient

于 2012-09-26T13:04:26.583 回答
1

由于这是“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 将首先检查是否有任何内部规则匹配,然后检查是否有任何外部规则匹配。如果没有任何内部规则匹配,但有一个外部规则匹配,则 URL 在 Intent 中启动。

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

于 2014-12-03T22:40:37.923 回答
0

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

webview应该拦截请求示例

于 2013-06-18T10:49:00.720 回答