2012-02-16 24 views
3

私はいくつかのHTML5/javascriptファイルをサーバー上でホストしています。 HTML5ページでボタンがクリックされると、javascript関数が呼び出されます。私は、関数が呼び出されたときにリッスンし、その関数が返すjsonを取得します。以前はデバイスのポートを開いていましたが、Android 3.0では動作しません。私は外部インターフェイスを使用してJavaScript呼び出しを聞くことができると聞いたことがありますが、それを実装する方法はわかりません。javaからのjavascript関数の呼び出しを聞く - Android

+0

WebViewでページを実行していますか? – Olegas

答えて

3

外部インターフェイスを使用するには、WebViewでサイトを実行する必要があります。また、以下のソリューションを使用すると、

  • これらの関数は、JSコードの公開範囲内にある...あなたが傍受したいすべての関数名を、知っている、と何

    1. 、暗示します。

    インターフェイスを登録するには、WebViewインスタンスでaddJavascriptInterfaceメソッドを呼び出す必要があります。その名前を選択して実装を作成する必要があります。あなたのインターフェイスはBinding JavaScript

    を参照してくださいJavaScriptのインターフェイスの詳細については、関数呼び出しをインターセプトし、その結果を報告し、それでは、それを説明してみましょう...

    class FunctionCallInterceptor { 
        public void reportCall(String functionName, String result) { 
         // some code, handling interception 
        } 
    } 
    

    して登録...

    mWebView.addJavascriptInterface(new FunctionCallInterceptor(), 'Interceptor'); 
    

    必要があります

    次に、関数結果をインターフェースに転送する必要があります。ここにはJavaScriptコードが必要です。このコード

    wrapFunc('myFunction'); // wraps myFunction in the source 
    

    はまた、外部のページにこのコードを埋め込む方法をすると、すべての

    mWebView.getSettings().setJavaScriptEnabled(true); 
    

    でJavaScriptを有効にすることを忘れないでください、あなたの関数の使用をラップする

    function wrapFunc(name) { 
        if(typeof window[name] == 'function') { // If target is accessible 
        var original = window['__' + name] = window[name]; // remember original one 
        window[name] = function() { // and replace with wrapper 
         var result = original.apply(this, arguments); // call original     
         Interceptor.reportCall(name, result.toString()); // report to interceptor 
         return result; // return result as usual 
        } 
        } 
    } 
    

    (私は、あなたが外部JSコードにアクセスしていないことを暗示しています)...ページコンテキストで任意のコードを実行するには、WebView

    012のloadUrlメソッドを使用できます
    mWebView.loadUrl('javascript:some... js... code...'); 
    

    これはページのリロードを開始せず、JavaScriptのみが実行されます。ページが完全に読み込まれた後でこれを実行する必要があることに注意してください。あなたは以下のコードでこれを入手することができます

    mWebView.setWebViewClient(new WebViewClient { 
        @Override 
        public void onPageFinished (WebView view, String url) { 
         // here page is loaded 
        } 
    }); 
    

    詳細

    ためsetWebViewClientonPageFinishedを参照してくださいにも改行を含めることはできませんloadUrl呼び出しを介してページに転送どのようなコード、、、注意してください。だからあなたはそれらを取り除く必要があります(String.replaceなど)。

    だから を追加し、最終的な解決策は以下のとおりです。

    String wrapFuncCode = "function wrapFunc ...... "; // or maybe place it in resources? 
    mWebView.addJavascriptInterface(new FunctionCallInterceptor(), 'Interceptor'); 
    mWebView.getSettings().setJavaScriptEnabled(true); 
    mWebView.setWebViewClient(new WebViewClient { 
        @Override 
        public void onPageFinished (WebView view, String url) { 
         // inject wrapper 
         // don't forget to remove newline chars 
         mWebView.loadUrl("javascript:" + wrapFuncCode.replace('\n', '')); 
    
         // wrap all the functions needed 
         String[] funcToWrap = new String[] { 'myFunc1', ... }; 
         for(String f : funcToWrap) { 
          mWebView.loadUrl("javascript:wrapFunc('" + f + "myFunction');"); 
         } 
        } 
    }); 
    
  • +0

    こんにちは、この関数wrapFunc(name){ if(typeof window [name] == 'function'){//ターゲットにアクセス可能であればもっと詳しく説明できます var original = window ['__' + name] =ウィンドウ[名前]; //元のものを記憶する ウィンドウ[名前] = function(){//ラッパーで置き換える var result = original.apply(this、arguments); //元の呼び出し Interceptor.reportCall(name、result.toString()); //インターセプタに報告する return result; //結果を通常どおり返す } } }とwrapFunction( 'myFunction');このコードを追加する場所はどこですか? – Vibhuti

    +0

    はい...私はwebviewで私のページを実行しています。私は傍受したい機能名を知っています。はい、jsコードの公開範囲にあります。 – Vibhuti

    +0

    私は完全なソリューションを追加しました。事がもっと明確にならない場合は、具体的な質問をお願いします。 – Olegas

    2

    私は別の方法を行なったし、それがeasily.Iは、(文字列のメッセージ)window.external.notifyを使用働きました。 私のJavaでは、webview.addJavascriptInterface(新しいJSInterface()、 "external")を使用しました。私のJSInterfaceクラスでは、関数public void notify(String messg).messgにjavascriptからの応答が含まれています。

    +0

    これは同じアプローチです。 – Olegas

    +0

    はい。わかりました。 – Vibhuti

    関連する問題