Веб-браузер Chromium, похоже, не работает с Android applyOverrideConfiguration

После моих изменений, описанных в настройке Force для языка Android с resConfig, я столкнулся с проблемой веб-просмотров, содержащих видео. Проблема только в API21+ и действительно исчезает при удалении вызова applyOverrideConfiguration. Не уверен, как обойти это.

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
            at com.android.webview.chromium.WebViewContentsClientAdapter.getDefaultVideoPoster(WebViewContentsClientAdapter.java:1172)
            at org.chromium.android_webview.DefaultVideoPosterRequestHandler$1.run(DefaultVideoPosterRequestHandler.java:39)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Из того, что я мог найти в grepcode, это было бы при получении изображения ic_media_video_poster. Я проверил, что это изображение действительно в SDK. http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.1_r1/com/android/webview/chromium/WebViewContentsClientAdapter.java#WebViewContentsClientAdapter.getDefaultVideoPoster%28%29

public Bitmap More ...getDefaultVideoPoster() {
         TraceEvent.begin();
         Bitmap result = null;
         if (mWebChromeClient != null) {
             if (TRACE) Log.d(TAG, "getDefaultVideoPoster");
             result = mWebChromeClient.getDefaultVideoPoster();
         }
         if (result == null) {
             // The ic_media_video_poster icon is transparent so we need to draw it on a gray
             // background.
             Bitmap poster = BitmapFactory.decodeResource(
                     mWebView.getContext().getResources(),
                     R.drawable.ic_media_video_poster);
             result = Bitmap.createBitmap(poster.getWidth(), poster.getHeight(), poster.getConfig());
             result.eraseColor(Color.GRAY);
             Canvas canvas = new Canvas(result);
             canvas.drawBitmap(poster, 0f, 0f, null);
         }
         TraceEvent.end();
         return result;
     }

РЕДАКТИРОВАТЬ: После еще нескольких испытаний, я смог изолировать сбой в testApp. Он доступен в отчете об ошибках, который я создал в Chromium https://code.google.com/p/chromium/issues/detail?id=521753

Есть идеи? Как кто-нибудь сталкивался с этой проблемой уже?

0 ответов

Как прокомментировал@Martin Edlman, он должен работать с этим обходным путем:

В Котлине:

override fun getAssets(): AssetManager {
    return resources.assets
}

В Java:

@Override
public AssetManager getAssets() {
    return getResources().getAssets();
} 

На будущее; Вы можете попробовать мою собственную реализацию. Добавьте приведенный ниже код в свой CustomChromeClient;

@Nullable
@Override
public Bitmap getDefaultVideoPoster() {
    if (super.getDefaultVideoPoster() == null) {
        return BitmapFactory.decodeResource(context.getResources(),
                R.drawable.ic_launcher);
    } else {
        return super.getDefaultVideoPoster();
    }
}
Другие вопросы по тегам