web-dev-qa-db-fra.com

appView.addJavascriptInterface () ne fonctionne pas sur l'API 17

je peux utiliser la fonction Java à partir de ma fonction de script Java phonegap et d'Android 2.2 , mais le même code n'est pas exécuté sur l'API 17. Que dois-je faire pour appeler du code Java natif à partir du script Java dans l'API 17 

j'utilise ce code dans mon fichier Java

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

ma classe CustomNativeAccess est

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;
        }

et dans mon script Java, j'utilise cette ligne pour appeler cette fonction de connexion

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

donc, en utilisant cela, j'appelle avec succès sur api 2.2, mais quand je lance ce code sur api 17, il me donne une erreur

Uncaught TypeError: Object [objet Object] n'a pas de méthode 'login' dans le fichier: ///Android_asset/www/index.html: 81

comment puis-je l'utiliser sur api 17

21
vivek tiwari

Ce que vous devez faire sur l'API 17 est d'annoter votre méthode avec @JavascriptInterface:

Public class CustomNativeAccess {
   @JavascriptInterface

et ensuite se débarrasser de la partie constructeur:

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

Assurez-vous également que vous importez JavascriptInterface dans votre projet:

 import Android.webkit.JavascriptInterface;

Vous pouvez en savoir plus à ce sujet ici: http://developer.Android.com/reference/Android/webkit/WebView.html#addJavascriptInterface%28Java.lang.Object,%20Java.lang.String%29 =

Edit: Vous devrez annoter chaque méthode avec @JavascriptInterface dans votre classe à laquelle vous souhaitez accéder à partir de Javascript.

39
benka

À partir de la documentation Android 4.2:

Attention: Si vous avez défini votre targetSdkVersion sur 17 ou plus, vous devez ajoutez le @JavascriptInterface annotation à la méthode de votre choix disponible votre code de page Web ( la méthode doit également être publique ). Si vous ne fournissez pas l'annotation, la méthode ne sera pas accessible par votre page Web lorsque vous utilisez Android 4.2 ou une version ultérieure.

Source: Android WebView Doc (soulignement ajouté)

4
peter

Je viens d'écrire l'application Web avec addJavascriptInterface avec API 17, cela fonctionne bien. Je ne sais pas ce qui est arrivé à votre code. Peut-être que vous pouvez essayer ces:

assurez-vous d'ajouter le:

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

Deuxièmement, pourquoi utilisez-vous super.loadUrl et non pas appView pour charger le code HTML?

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

Solutions:

  1. Abaissez le Android:targetSdkVersion dans le fichier manifeste à 16.
  2. Changez le niveau de l'API de compilation en 17 dans project.properties: target=Android-17 et annotez la méthode de rappel avec @JavascriptInterface.
0
AlikElzin-kilaka