2016-01-24 2 views
2

Я пытаюсь добавить javascript-интерфейс к WebView, который я нашел. Я следил за всем стандартным учебником и все еще боролся с задачей. При добавлении яваскрипта интерфейс, я не получаю никаких исключений и ошибок, но при явном вызове мост от JS, я получаю следующее сообщение об ошибке:addJavascriptInterface функция не работает на API 21

I/chromium: [INFO:CONSOLE(1)] "Uncaught ReferenceError: JSNativeBridge is not defined", source: (1) 

Добавление яваскрипта интерфейса:

new Handler(context.getMainLooper()).post(new Runnable() { 
    @Override 
    public void run() { 
     WebView webView = webViews[0]; 
     if (Constants.DEBUG_MODE) { 
      webView.setWebChromeClient(new WebChromeClient()); 
      webView.getSettings().setJavaScriptEnabled(true); 
     } 
     ImpressionSyncJsInterface impressionSyncJsInterface = new ImpressionSyncJsInterface(context); 
     webView.addJavascriptInterface(impressionSyncJsInterface, JS_BRIDGE_NAME); 
     didAddInterfaceToWebView = true; 
    } 
}); 

Мой интерфейс: открытый класс ImpressionSyncJsInterface { закрытый конечный контекстный контекст;

public ImpressionSyncJsInterface(Context context) { 
     this.context = context; 
    } 

    @JavascriptInterface 
    public void foo() { 
     Log.e("TEST", "test"); 
    } 
} 

Выполнение JavaScript:

final String javascriptInjectionTest = "javascript: " + JS_BRIDGE_NAME + ".foo();"; 

new Handler(Looper.getMainLooper()).post(new Runnable() { 
    @Override 
    public void run() { 
     webView.loadUrl(javascriptInjectionTest); 
    } 
}); 

Любая помощь будет оценена.

+0

Пожалуйста, введите код javascript, из которого вы вызываете Java-класс. –

+0

Я не вижу, чтобы какой-либо код загружал страницу перед попыткой доступа к инжектированному объекту. Сначала нужно загрузить некоторую страницу, см. Http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object,%20java.lang.String) –

ответ

9

Разобрался проблема, так что я буду делиться своими мыслями:

addJavascriptInterface функции применяется только при вызове ПЕРЕДloadUrl/LoadData функции.

В моем случае - я ожидал добавить JavascriptInterface для ввода JS-моста, но я никогда не перезагружал контент WebView, поэтому он никогда не вводился активно.

После перезагрузки содержимого WebView HTML мост был добавлен, как ожидалось.

+1

Вы должны принять это как ваш собственный ответ, чтобы другие люди могли найти его легче, я просто наткнулся на то же самое! – davidgyoung