AppView.addJavascriptInterface() не работает с API 17
Я могу использовать java-функцию из функции java script java phonegap phone и Android 2.2.
но тот же код не запускается на API 17. что мне нужно сделать, чтобы вызвать собственный код Java из java script в API 17.
Я использую этот код в своем 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 script я использую эту строку для вызова этой функции входа
var value = window.CustomNativeAccess.login(email,pass);
поэтому, используя это, я успешно вызываю это на api 2.2, но когда я запускаю этот код на api 17, он дает мне ошибку
Uncaught TypeError: Object [object Object] не имеет метода "login" в файле:///android_asset/www/index.html: 81
как я могу это использовать на api 17
Ответы
Ответ 1
Что вы должны сделать в 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
Изменить: вам нужно будет аннотировать каждый метод с помощью @JavascriptInterface внутри вашего класса, к которому вы хотите получить доступ из Javascript.
Ответ 2
Из документации Android 4.2:
Внимание: если вы установили цель targetSdkVersion на 17 или выше, вы должны добавьте аннотацию @JavascriptInterface к любому методу, который вы хотите доступный код вашей веб-страницы (метод должен быть общедоступным). если ты не предоставляют аннотации, то метод не будет доступен вашей веб-страницы при работе на Android 4.2 или новее.
Источник: Android WebView Doc (выделено мной)
Ответ 3
Я только что написал веб-приложение с addJavascriptInterface
с API 17, он работает хорошо. Я не знаю, что случилось с вашим кодом. Возможно, вы можете попробовать:
убедитесь, что вы добавили:
WebSettings webSettings = appView.getSettings();
webSettings.setJavaScriptEnabled(true);
Во-вторых, почему вы используете super.loadUrl, а не appView для загрузки html?
objCustomNativeAccess = new CustomNativeAccess(this, appView);
appView.addJavascriptInterface(objCustomNativeAccess, "CustomNativeAccess");
appView.loadUrl("file:///android_asset/www/index.html");
Ответ 4
Решения:
- Опустите
android:targetSdkVersion
в файле манифеста до 16.
- Измените уровень api-компиляции на 17 в project.properties:
target=android-17
и аннотируйте метод обратного вызова с помощью @JavascriptInterface
.