Я получаю удовольствие от Android WebView.
Я использую его, чтобы показать экран входа в систему, а затем перехватить код авторизации в ответ. Должно быть довольно просто...
Мой WebView загружается и отображается абсолютно нормально, если я только переопределяю shouldOverrideUrlLoading, но если я переопределяю (так же, как автозаполнение Android Studio):
override fun shouldInterceptRequest(
view: WebView?,
request: WebResourceRequest?
): WebResourceResponse {
return super.shouldInterceptRequest(view, request)
}
без каких-либо других изменений он сразу же вылетает во время выполнения с родным сбоем
A/хром: [FATAL:jni_android.cc(259)]
с последующим
A/libc: Фатальный сигнал 6 (SIGABRT), код -6 (SI_TKILL) в tid 16220 (TaskSchedulerFo), pid 16175 (eports.internal)
Как ни странно, если я сделаю ответ обнуляемым, WebView снова заработает. Однако добавление чего-либо еще в метод shouldInterceptRequest приводит к падению с той же ошибкой.
Итак, это работает:
override fun shouldInterceptRequest(
view: WebView?,
request: WebResourceRequest?
): WebResourceResponse? {
return super.shouldInterceptRequest(view, request)
}
Но это вылетает с указанным выше сбоем:
override fun shouldInterceptRequest(
view: WebView?,
request: WebResourceRequest?
): WebResourceResponse? {
val url = view?.url
return super.shouldInterceptRequest(view, request)
}
Это кажется действительно странной проблемой, и мне непонятно, почему добавление присваивания val вообще имеет какое-то значение.
Я исследовал ошибку, и предложения должны были добавить
webView.destroy()
в активности/фрагментах onDestroy/onDestroyView это, к сожалению, не помогает.
Поведение одинаково на устройстве и эмуляторе, а также на Android SDK 22 и 28.
Кто-нибудь видел что-нибудь подобное раньше? Я чувствую, что, вероятно, упускаю что-то очевидное.
На случай, если это будет полезно для всех, я также сгенерировал микродамп Breakpad, он слишком велик, чтобы публиковать этот вопрос. Но дайте мне знать, может ли это или его подмножество помочь в диагностике!