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
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.
À 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é)
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");
Solutions:
Android:targetSdkVersion
dans le fichier manifeste à 16.target=Android-17
et annotez la méthode de rappel avec @JavascriptInterface
.