Воспроизведение видео TextureView становится черным после onPause

Я использую TextureView для воспроизведения видео в ListView. Сам TextureView работает отлично, однако, если я несколько раз нажимаю кнопку «Домой» и повторно захожу в приложение, TextureView становится черным (хотя звук продолжает воспроизводиться). Если я выйду и снова войду, TextureView станет белым (или, может быть, прозрачным, так как белый цвет моего фона).

Вот мой код:

holder.instagramTextureView
    .setSurfaceTextureListener(new SurfaceTextureListener() {

        @Override
        public void onSurfaceTextureUpdated(
                SurfaceTexture surface) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onSurfaceTextureSizeChanged(
                SurfaceTexture surface, int width, int height) {
            // TODO Auto-generated method stub

        }

        @Override
        public boolean onSurfaceTextureDestroyed(
                SurfaceTexture surface) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public void onSurfaceTextureAvailable(
                SurfaceTexture surface, int width, int height) {
            final Surface s = new Surface(surface);

            try {
                holder.mMediaPlayer = new MediaPlayer();
                holder.mMediaPlayer.setDataSource(post
                                .getMedias().get(0)
                                .getMediaUrlVideomp4StandardRes());
                holder.mMediaPlayer.setSurface(s);
                holder.mMediaPlayer.prepare();

                holder.instagramVideoVolume = 0f;
                holder.mMediaPlayer.setVolume(
                        holder.instagramVideoVolume,
                        holder.instagramVideoVolume);
                //holder.mMediaPlayer.setOnBufferingUpdateListener(this);

                holder.mMediaPlayer
                    .setOnCompletionListener(new OnCompletionListener() {
                        @Override
                        public void onCompletion(
                                MediaPlayer mp) {

                            // To play:
                            mp.reset();
                            try {
                                mp.setDataSource(post
                                    .getMedias()
                                    .get(0)
                                    .getMediaUrlVideomp4StandardRes());
                                mp.prepare();

                            } catch (IllegalArgumentException e) {
                                // TODO Auto-generated catch
                                // block
                                e.printStackTrace();
                            } catch (SecurityException e) {
                                // TODO Auto-generated catch
                                // block
                                e.printStackTrace();
                            } catch (IllegalStateException e) {
                                // TODO Auto-generated catch
                                // block
                                e.printStackTrace();
                            } catch (IOException e) {
                                // TODO Auto-generated catch
                                // block
                                e.printStackTrace();
                            }
                            // <--- Here comes a call to
                            // "To Resize" which is shown
                            // right above this code
                            mp.start();
                        }
                });

                // holder.mMediaPlayer.setOnPreparedListener(this);
                //holder.mMediaPlayer.setOnVideoSizeChangedListener(this);

                holder.mMediaPlayer
                    .setAudioStreamType(AudioManager.STREAM_MUSIC);
                holder.mMediaPlayer.start();

                holder.instagramTextureView
                    .setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                            if (holder.instagramVideoVolume == 1) {
                                holder.instagramVideoVolume = 0f;
                                holder.mMediaPlayer
                                    .setVolume(
                                        holder.instagramVideoVolume,
                                        holder.instagramVideoVolume);
                            } else {
                                holder.instagramVideoVolume = 1f;
                                holder.mMediaPlayer
                                    .setVolume(
                                        holder.instagramVideoVolume,
                                        holder.instagramVideoVolume);
                                    }
                            }
                });

            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
});

person Userrrrrrrrr    schedule 21.07.2015    source источник
comment
не используйте do e.printStackTrace(); в проектах Android, вместо этого используйте Log.e("UNIQUE_TAG", "error doing ....", e);, чтобы получить полезную информацию об ошибках через logcat   -  person petey    schedule 21.07.2015
comment
Вызывается ли onSurfaceTextureAvailable каждый раз? Если вы каждый раз запускаете медиаплеер, где вы его останавливаете?   -  person fadden    schedule 21.07.2015
comment
Хотелось бы, чтобы ваш комментарий был ответом fadden, ответ действительно был в onSurfaceTextureAvailable   -  person Userrrrrrrrr    schedule 21.07.2015


Ответы (3)


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

person Userrrrrrrrr    schedule 21.07.2015

Из моего исследования textureView.getSurfaceTexture() возвращает null onResume(). Что я сделал, так это повторно подключил к нему слушателя в onResume().

TextureView textureView;

/*....
Usual stuff
*/

public void onPause(){
    super.onPause();

    //... destroy or disable image producer
}

public void onResume(){
    super.onResume();

    textureView.setSurfaceTextureListener(/*another listener*/);
}

Затем займитесь своими обычными делами на onSurfaceTextureAvailable()

person daisura99    schedule 14.09.2016

Черный экран и воспроизведение звука произошло со мной, когда я не выпустил объект MediaPlayer.

person Mohammad Sayed    schedule 22.11.2018