2013-04-02 3 views
21

Я использую компонент VideoView для воспроизведения видео. Кажется, я не могу очистить дисплей VideoView после того, как я вручную вызову stopPlayback(). Я хотел бы сбросить VideoView, чтобы исходный фон был виден.Android VideoView ясный дисплей после stopPlayback()

  1. Воспроизведение видео в компоненте VideoView.
  2. Выберите новое видео, чтобы играть.
  3. VideoView застревает в последнем кадре первого видео до следующего запуска видео. Если при следующем видео есть ошибка, статическое изображение с первого видео остается там.
  4. Если я разрешаю воспроизведению видео до состояния завершения, дисплей очищается.

код я использую:

private VideoView videoViewer = null; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
... 
    if (videoViewer != null) { 
    videoViewer.setOnPreparedListener(new OnPreparedListener()); 
    } 
... 
} 

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    if (videoViewer != null) { 
    videoViewer.stopPlayback(); 
    videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8")); 
    } 
} 

private class OnPreparedListener implements MediaPlayer.OnPreparedListener { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
    videoViewer.start(); 
    } 
} 

Обратите внимание, что на основе источника VideoView.java, stopPlayback() выполняет следующие действия на подстилающей MediaPlayer:

public void stopPlayback() { 
    if (mMediaPlayer != null) { 
    mMediaPlayer.stop(); 
    mMediaPlayer.release(); 
    mMediaPlayer = null; 
    } 
} 

ответ

9

решение, на котором я остановился, если кто-то не предложит лучшего, это использовать setBackgroundResource, который кажется странно названным, поскольку он, похоже, изменит ресурс переднего плана.

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
... 
    videoViewer.setBackgroundResource(R.drawable.viewer_background); 
... 
} 

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    if (videoViewer != null) { 
    videoViewer.stopPlayback(); 
    // Set the background back to the drawable resource to clear the current video when switching to a new one. 
    videoViewer.setBackgroundResource(R.drawable.viewer_background); 
    videoViewer.setVideoURI(Uri.parse("http://my_vido_url/playlist.m3u8")); 
    } 
} 

private class OnPreparedListener implements MediaPlayer.OnPreparedListener { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
    videoViewer.start(); 
    // Clear the background resource when the video is prepared to play. 
    videoViewer.setBackgroundResource(0); 
    } 
} 

вытяжки Я ссылаюсь простой layer-list с нестандартным синим цветом фоном и центрированным логотипом.

вытяжки \ viewer_background.xml:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item> 
    <shape android:shape="rectangle"> 
     <solid android:color="@color/custom_blue" /> 
    </shape> 
    </item> 
    <item> 
    <bitmap android:src="@drawable/img_logo" 
     android:gravity="center" /> 
    </item> 
</layer-list> 

В качестве альтернативы я также был в состоянии использовать setZOrderOnTop для управления, где вид поверхности помещаемые (можно также определить другой вид сверху на VideoViewer и переключать видимость, что способ):

videoViewer.setZOrderOnTop(false); 
videoViewer.setZOrderOnTop(true); 

в качестве альтернативы я мог бы также использовать setBackgoundColor сделать то же самое, как setBackgroundResource:

videoViewer.setBackgroundColor(getResources().getColor(R.color.custom_blue)); 
videoViewer.setBackgroundColor(Color.TRANSPARENT); 
+0

Когда Я делаю это, следующее воспроизведение по-прежнему показывает последний кадр предыдущего. Любые идеи относительно того, почему это происходит? – slhck

+0

Фактическая видеокадра рисуется на поверхности «снизу» VideoView. Установка фона в VideoView скроет фрейм, но не удалит его.Когда фон очищается, старый кадр все еще присутствует. – William

12

Для меня то, что работало, было просто спрятаться, затем показать VideoView с помощью setVisibility.

public void clearCurrentFrame() { 
    videoView.setVisibility(GONE); 
    videoView.setVisibility(VISIBLE); 
} 

Это потому, что я хотел VideoView стать прозрачными, а не быть сплошным цветом. Настройка фона на прозрачный не работает - показывается видеокадр.

+0

Я только что получил предложенное изменение от анонимного пользователя, говорящего, чтобы поставить 'videoView.stopPlayback();' как последнюю строку кода. Я не могу проверить, что это необходимо, хотя видео нужно будет уже остановить для моего ответа на работу. Просто хотел оставить его здесь, если он кому-то поможет :) – William

1

Ну, для меня ни одно из решений из этой нити не работал, так что я пытался что-то еще и под это решение, которое работает для меня,

new Handler().postDelayed(new Runnable() { 

    @Override 
    public void run() { 
     mVideoViewPlayList.setVisibility(View.GONE); 
     mVideoViewPlayList.setVisibility(View.VISIBLE); 
     mVideoViewPlayList.setVideoURI(Uri.parse(path)); 
    } 
}, 500); 
+0

Без обид. Я действительно задаюсь вопросом, в чем цель этих строк. mVideoViewPlayList.setVisibility (View.GONE); mVideoViewPlayList.setVisibility (View.VISIBLE); –

+2

@PsyCoder в некоторых устройствах, mVideoViewPlayList.setVideoURI (Uri.parse (путь)) не вступил в силу до тех пор, пока изменение видимости по крайней мере один раз! –

+0

Спасибо за объяснение. Это может сэкономить мое время, когда-нибудь :) –

0

только этот код:

videoView.setVideoURI(null); 
+0

Пожалуйста, добавьте более подробную информацию к вашему ответу! –

+2

java.lang.NullPointerException: uriString он сбрасывает мое приложение, когда я устанавливаюUrl null. –

+0

Работает для меня спасибо –