Android WebView Воспроизведение видео HTML5 / h.264 / mp4, как добраться до MediaPlayer

у меня естьActivity который являетсяWebView, у меня естьWebChromeClient внутри него. Внутри этого есть несколько обратных вызовов, которые предназначены для возвратаMediaPlayer обработка видео битов. Например:

@Override
public void onPrepared(MediaPlayer mp) {
    Log.i(TAG, " -------------> onPrepared");
}

Они не запускаются, когда я загружаю поток MP4 вWebView используя HTML теги (через инъекцию).

Когда яfinish() активность, logcat сообщает об этом:

09-13 23:55:24.590: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to send MEDIA_BUFFERING_UPDATE message.
09-13 23:55:24.680: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to send MEDIA_BUFFERING_UPDATE message.
09-13 23:55:24.680: E/MediaPlayer(7949): mOnVideoSizeChangedListener is null. Failed to send MEDIA_SET_VIDEO_SIZE message.
09-13 23:55:25.675: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to send MEDIA_BUFFERING_UPDATE message.
09-13 23:55:26.735: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to send MEDIA_BUFFERING_UPDATE message.
09-13 23:55:27.755: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to send MEDIA_BUFFERING_UPDATE message.
09-13 23:55:28.705: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to send MEDIA_BUFFERING_UPDATE message.

Попробуй как смогу, смогуостановить его, хотяWebView очищается, а затем уничтожается. При загрузке видео с помощью теги, я нене знаю ни одного способа заставитьWebChromeClient использовать определенныйMediaPlayer что я создаю для этого. Кажется, решено использовать какой-то скрытый, который сообщает выше. Есть ли способ найтиMediaPlayer создан с помощью тег на?WebView

--Обновить

Вот код для инициализации WebView:

        mWebView = new WebView(mContext);

        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.getSettings().setPluginState(PluginState.OFF);
        mWebView.setVisibility(View.INVISIBLE);
        mWebView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);
        mWebView.getSettings().setBuiltInZoomControls(false);
        mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        mWebView.getSettings().setLoadWithOverviewMode(true);
        mWebView.getSettings().setUseWideViewPort(true);
        mWebView.clearHistory();
        mWebView.clearFormData();
        mWebView.clearCache(true);
        mWebView.getSettings().setAllowFileAccess(true);
        mWebView.getSettings().setUserAgentString("Android Mozilla/5.0 AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30");

        chrome = new MyWebChromeClient();
        mWebView.setWebChromeClient(chrome);

        wvc = new MyWebViewClient();
        mWebView.setWebViewClient(wvc);

        mDomain = "http://foo.bar.com";
        mWebView.requestFocus(View.FOCUS_DOWN);

        String meat = genMainHTML(R.raw.frame);

        mWebView.loadDataWithBaseURL(mDomain, meat, "text/html", "utf-8", null);

"Рамка" code - это iframe для запуска некоторого видео (как Vimeo, так и YouTube, по крайней мере, используют этот подход). Я немного обрезал это, чтобы избежать беспорядка:







     
     



В этом классе WebView существует этот класс:

private class MyWebViewClient extends WebViewClient {

    @Override
    public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            String injection = injectPageMonitor();
            if(injection != null && !injectionComplete) {
                // Log.i(TAG, " ---------------> Page Loaded . . .");
                view.loadUrl(injection);
                injectionComplete = true;
        }
    }

    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Log.d(TAG, "*** Error ["+description+"] ["+failingUrl+"]");
        Toast.makeText(mContext, description, Toast.LENGTH_SHORT).show();
    }

}

А также этот класс:

    private class MyWebChromeClient extends WebChromeClient implements MediaPlayer.OnInfoListener, MediaPlayer.OnSeekCompleteListener, MediaPlayer.OnErrorListener, MediaPlayer.OnVideoSizeChangedListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnBufferingUpdateListener {

       @Override
       public void onProgressChanged(WebView view, int progress) {
           //Log.e(TAG, " -------------> Progress Changed . . . . ["+progress+"] mWebView ["+mWebView+"] ["+view+"]");
           if(progress == 100) {
                               // Do something really interesting
           }  else  {
               updateBuffering(UPDATE_PERCENT_LAUNCH_EXTRACTOR + (progress / 2));
           }
       }

       @Override
       public boolean onConsoleMessage(ConsoleMessage cm) {
                       // Spit out lots of console messages here
           return(true);
       }
   }

И у меня переопределены все обычные подозреваемые, на случай, если мне повезет и я получу ответ от MediaPlayer:

        @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        // Jump up and down because we got a mp!
                    // never happens, so no jumping
    }

Как примечание, я копался с помощью рефлексии и таким образом овладел MediaPlayer, но я всегда чувствую себя немного странно после такого рода вещей. И хотя у меня есть объект MediaPlayer, яЯ не хотел бы просто выпустить это. Небольшое изучение исходного кода для MP предполагает, что ничего плохого не произойдет, но. , ,

Это происходит не на каждом устройстве, я заметил. HTC, кажется, ведет себя лучше, чем Samsung, например (так же" Уровень OS / API - I 'я не достаточно амбициозен, чтобы сравнить два исходных дерева).

Поведение, отмеченное ниже, раздражает, но только для меня (который наблюдает за выводом logcat. Для пользователя или приложения это, кажется, не имеет никакого эффекта.Просто мне действительно не нравится, что яЯ запускаю экземпляр MediaPlayer, активно его кеширую, а затем (если / когда пользователь завершает работу с моим приложением) оставляю эту болтовню там. На данный момент у меня много денег, связанных с терапией, и это некажется, помогает.

Заранее спасибо.

Ответы на вопрос(2)

Ваш ответ на вопрос