3

Я слишком долго боролся с этим. Надеюсь, кто-нибудь может мне помочь. Вот моя ситуация:WebView не может найти объекты, открытые через addJavascriptinterface в Lollipop

В нашем Android-приложении мы отправляем XMLHttpRequests из нашего WebView через Java/Android, чтобы мы могли добавить токен OAuth2 и отслеживать запросы. Это отлично работало, пока Android 5 не был выпущен.

Запуск Android 5, следующее исключение поднимается всякий раз, когда WebView пытается взаимодействовать с выставленной объекта в JavaScript:

java.lang.ClassNotFoundException: Didn't find class "com/company/android/AndroidXMLHttpRequest$AjaxRequest" on path: DexPathList[[zip file "/system/app/webview/webview.apk"],nativeLibraryDirectories=[/system/app/webview/lib/x86_64, /vendor/lib64, /system/lib64]] 
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:469) 
    at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method) 
    at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:53) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.os.HandlerThread.run(HandlerThread.java:61) 
    Suppressed: java.lang.ClassNotFoundException: Invalid name: com/company/android/AndroidXMLHttpRequest$AjaxRequest 
    at java.lang.Class.classForName(Native Method) 
    at java.lang.BootClassLoader.findClass(ClassLoader.java:781) 
    at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:504) 
    ... 6 more 

Результаты на различных конфигурациях:

  • Этот код работает отлично на Физические и виртуальные устройства под управлением Android < 5.
  • Этот код разбит на ysical устройства работает Android 5 и 5.1
  • Этот код прекрасно работает на виртуального устройства работает Android 5.0
  • Этот код перерывы на виртуальных устройств работает Android 5,1
  • Там нет никакой разницы между запуска отладки или производство строить

Некоторая информация о коде: * WebViewFragment получает инициирована в MainActivity.onCreate. * WebViewFragment.onCreateView создает объект, который будет подвергаться воздействию WebView * интерфейс JavaScript будет добавлен в WebViewClient.onPageFinished * Класс, который подвергается воздействию является общественной * Все методы класса, которые подвергаются воздействию являются общедоступными и имеют @JavascriptInterface аннотацию

Начиная Lollipop , WebView был отделен от Android, поэтому его можно обновить через Play Store. Это также то, что показывает от ошибки:

DexPathList[[zip file "/system/app/webview/webview.apk"],nativeLibraryDirectories=[/system/app/webview/lib/x86_64, /vendor/lib64, /system/lib64]] 

Я смотрел на примечания к выпуску, чтобы обнаружить, если мы должны сделать что-то другое в отношении WebView и addJavaScriptInterface, но я не могу найти что-нибудь.

У кого-нибудь есть идеи, что может быть причиной того, что это не удается?

ответ

2

Извините за это, была ошибка в WebView: http://crbug.com/491800

Данная ошибка была введена в Android 5.1, поэтому оригинальные 5.0 работает отлично (эмулятор). Но на физических устройствах Lollipop с Play Store WebView обновляется до более поздней версии (43), которая все еще была сломана. Исправление получило версию WebView версии 44, которая, как мне кажется, сейчас только начинается.

Однако есть обходное решение. В введенном методе, который принимает экземпляр AjaxRequest, вам необходимо заменить тип аргумента на Object, а затем преобразовать в AjaxRequest позже в функцию (см. Пример this comment). Таким образом, WebView перестанет пытаться найти класс, к которому он не может получить доступ в этот момент.

 Смежные вопросы

  • Нет связанных вопросов^_^