5

PhoneGap でラップされ、ローカルにホストされている Sencha Touch アプリは、ネイティブ ラッパーと通信するためにいくつかの偽の URL コールバックを作成します。(つまりapp_callback://do_function_a)。

iOSでは、次を実装します

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

URL を確認しapp_callback://、ネイティブ関数を呼び出して 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

これは「phonegap android interrupt 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" />

URL が WebView でアクセスされると、Cordova はまず内部ルールが一致するかどうかを確認し、次に外部ルールが一致するかどうかを確認します。内部ルールのいずれも一致せず、外部ルールの 1 つが一致する場合、URL はインテントで起動されます。

それは私にとってはうまくいきましたが、もっとカスタマイズしたものが必要な場合は、これを処理するコードが CordovaUriHelper.java の関数 shouldOverrideUrlLoading にあることがわかりました。ですから、それを少しカスタマイズしたい場合は、何でもできます。

于 2014-12-03T22:40:37.923 に答える
1

はい。shouldOverrideUrlLoading_WebViewClient

于 2012-09-26T13:04:26.583 に答える
0

実際に shouldOverrideUrl の読み込みが機能しない可能性があります。むしろ、SDK>=11 の Android の場合は、shouldInterceptRequest を使用する必要があります。

webview shouldinterceptrequest の例

于 2013-06-18T10:49:00.720 に答える