Реализация onShowCustomView на Android 3.1 вызывает исключение в HTML5VideoFullScreen - PullRequest
15 голосов
/ 28 августа 2011

Я пытаюсь воспроизвести видео в формате html на весь экран. Когда я нажимаю на полноэкранную кнопку в видео, запускается метод onShowCustomView. Вот моя реализация:

public void onShowCustomView(View view, CustomViewCallback callback) {
    super.onShowCustomView(view, callback);
    if (view instanceof FrameLayout) {
        customComponenet.addView(view, new FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT,
                Gravity.CENTER));
        customComponenet.setVisibility(View.VISIBLE);
    }
}

Где customComponenet - это FrameLayout, помещенный поверх моего текущего макета. Wideo играет хорошо, хорошо видно, и все выглядит хорошо, но выдает:

    08-27 22:16:07.520: ERROR/AndroidRuntime(7235): FATAL EXCEPTION: main
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235): java.lang.NullPointerException
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at android.webkit.HTML5VideoFullScreen.switchProgressView(HTML5VideoFullScreen.java:320)
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at android.webkit.HTML5VideoView.setPlayerBuffering(HTML5VideoView.java:319)
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at android.webkit.HTML5VideoView.start(HTML5VideoView.java:85)
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at android.webkit.HTML5VideoViewProxy$VideoPlayer.onPrepared(HTML5VideoViewProxy.java:257)
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at android.webkit.HTML5VideoViewProxy.onPrepared(HTML5VideoViewProxy.java:278)
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at android.webkit.HTML5VideoView.onPrepared(HTML5VideoView.java:265)
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at android.webkit.HTML5VideoFullScreen.onPrepared(HTML5VideoFullScreen.java:164)
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1456)
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at android.os.Handler.dispatchMessage(Handler.java:99)
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at android.os.Looper.loop(Looper.java:132)
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at android.app.ActivityThread.main(ActivityThread.java:4028)
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at java.lang.reflect.Method.invokeNative(Native Method)
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at java.lang.reflect.Method.invoke(Method.java:491)
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
    08-27 22:16:07.520: ERROR/AndroidRuntime(7235):     at dalvik.system.NativeStart.main(Native Method)

Что я делаю не так?

Мои настройки WebView:

webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setPluginState(PluginState.ON);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setDatabasePath("/data/data/" + App.class.getPackage().getName() + "/databases");
webView.getSettings().setSupportZoom(false);

Я тестирую на Galaxy Tab 10.1, в браузере по умолчанию это работает просто отлично. Я могу переключиться в полноэкранный режим. Более того, в моем приложении при воспроизведении встроенного видео я слышу только звук и вижу строку состояния под областью, где должно быть видео, а в браузере я вижу видео как в WebView, так и в полноэкранном режиме.

EDIT https://github.com/novemberox/VideoFail вот пример проекта с этой ошибкой, вы также можете открыть его в эмуляторе, так что вам не нужно иметь реальное устройство.

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

NPE выглядит как ошибка в HTML5VideoFullScreen, хотя мне не удалось воспроизвести его с помощью моего эмулятора.

Возможно, HTML5VideoFullScreen ожидает ненулевое представление от WebChromeClient # getVideoLoadingProgressView . Попробуйте переопределить этот метод, чтобы вернуть ненулевой объект View (например, фиктивный 0x0 View в вашей компоновке) и посмотреть, все ли еще происходит сбой.

2 голосов
/ 27 декабря 2012

Не забудьте включить аппаратное ускорение!

Это можно найти по адресу: Веб-страница для разработчиков Android

Поддержка видео HTML5

Для поддержки встроенного видео HTML5 в вашем приложении необходимо включить аппаратное ускорение и установить WebChromeClient.Для поддержки полного экрана требуются реализации onShowCustomView (View, WebChromeClient.CustomViewCallback) и onHideCustomView (), getVideoLoadingProgressView () является необязательным.

Поэтому добавьте это в свой AndroidManifest.xml

<application 
  android:hardwareAccelerated="true" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...