web-dev-qa-db-ja.com

appView.addJavascriptInterface()がAPI 17で機能しない

Java関数を使用できますJavaスクリプト関数とAndroid 2.2ですが、同じコードが実行されていませんAPI 17.ネイティブJavaからコードを呼び出すために何をすべきかJava API 17のスクリプト.

このコードをmy Javaファイルで使用します

 objCustomNativeAccess = new CustomNativeAccess(this, appView);
            appView.addJavascriptInterface(objCustomNativeAccess,
                    "CustomNativeAccess");
    super.loadUrl("file:///Android_asset/www/index.html");

私のCustomNativeAccessクラスは

public class CustomNativeAccess {
        private WebView mAppView;
        private DroidGap mGap;

        /**
         * Constructor
         * 
         * @param gap
         * @param view
         */
        public CustomNativeAccess(DroidGap gap, WebView view) {
            mAppView = view;
            mGap = gap;
        }

        /**
         * Get the device phone number
         * 
         * @return
         */
        public JSONObject login(String email, String password) {
            JSONObject object = new JSONObject();
                    object.put("Login_Status", login_status);
            object.put("date", dateString);
            return object;
        }

私のJavaスクリプトでは、この行を使用してこのログイン関数を呼び出します

 var value = window.CustomNativeAccess.login(email,pass);

これを使用すると、api 2.2でこれを正常に呼び出すことができますが、api 17でこのコードを実行すると、エラーが発生します

Uncaught TypeError:Object [object Object] has a method 'login' at file:///Android_asset/www/index.html:81

どのように私はこれをAPI 17で使用できますか

21
vivek tiwari

API 17で行う必要があるのは、@ JavascriptInterfaceを使用してメソッドに注釈を付けることです。

Public class CustomNativeAccess {
   @JavascriptInterface

そして、コンストラクタの部分を取り除きます:

/*private WebView mAppView;
    private DroidGap mGap;
    public CustomNativeAccess(DroidGap gap, WebView view) {
        mAppView = view;
        mGap = gap;
    }
*/

また、プロジェクトにJavascriptInterfaceを必ずインポートしてください。

 import Android.webkit.JavascriptInterface;

あなたはそれについてもっと読むことができます: http://developer.Android.com/reference/Android/webkit/WebView.html#addJavascriptInterface%28Java.lang.Object,%20Java.lang.String%29 =

編集:JavaScriptからアクセスしたいクラス内の@JavascriptInterfaceで各メソッドに注釈を付ける必要があります。

39
benka

Android 4.2ドキュメントから:

注意:targetSdkVersionを17以上に設定した場合は、@ JavascriptInterfaceアノテーションをWebページコードで利用できるようにするすべてのメソッドに追加する必要があります(メソッドもパブリックでなければなりません))。アノテーションを提供しない場合、Android 4.2以降で実行している場合、Webページからメソッドにアクセスできません。

出典:Android WebView Doc(強調を追加))

4
peter

私はAPI 17でaddJavascriptInterfaceを使用してWebアプリケーションを作成しただけで、うまく機能します。私はあなたのコードに何が起こったかわかりません。多分あなたはこれらを試すことができます:

必ず追加してください:

WebSettings webSettings = appView.getSettings();
webSettings.setJavaScriptEnabled(true);

第二に、なぜappViewではなくsuper.loadUrlを使用してHTMLをロードするのですか?

objCustomNativeAccess = new CustomNativeAccess(this, appView);
appView.addJavascriptInterface(objCustomNativeAccess, "CustomNativeAccess");
appView.loadUrl("file:///Android_asset/www/index.html");
0
buptcoder

ソリューション:

  1. マニフェストファイルのAndroid:targetSdkVersionを16に下げます。
  2. Project.properties:target=Android-17でコンパイルAPIレベルを17に変更し、@JavascriptInterfaceでコールバックメソッドに注釈を付けます。
0