Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 纹理视图播放视频在onPause后变为黑色_Android_Android Listview_Android Mediaplayer_Onpause_Textureview - Fatal编程技术网

Android 纹理视图播放视频在onPause后变为黑色

Android 纹理视图播放视频在onPause后变为黑色,android,android-listview,android-mediaplayer,onpause,textureview,Android,Android Listview,Android Mediaplayer,Onpause,Textureview,我正在使用TextureView在ListView中播放视频。TextureView本身工作得很好,但是,如果我按home按钮并重新输入应用程序几次,TextureView将变黑(尽管音频仍在播放)。如果我退出并再次进入,TextureView将变为白色(或者可能是透明的,因为白色是我背景的颜色) 这是我的密码: holder.instagramTextureView .setSurfaceTextureListener(new SurfaceTextureListener() {

我正在使用TextureView在ListView中播放视频。TextureView本身工作得很好,但是,如果我按home按钮并重新输入应用程序几次,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();
            }
        }
});
holder.instagramTextureView
.setSurfaceTextureListener(新的SurfaceTextReListener(){
@凌驾
已更新SurfaceTexture上的公共无效(
表面纹理(表面){
//TODO自动生成的方法存根
}
@凌驾
SurfaceTextureSizeChanged上的公共无效(
表面纹理表面、整型宽度、整型高度){
//TODO自动生成的方法存根
}
@凌驾
公共布尔onSurfaceTextureDestroyed(
表面纹理(表面){
//TODO自动生成的方法存根
返回false;
}
@凌驾
SurfaceTextureAvailable上的公共无效(
表面纹理表面、整型宽度、整型高度){
最终表面s=新表面(表面);
试一试{
holder.mMediaPlayer=新媒体播放器();
holder.mmediplayer.setDataSource(post
.getMedias().get(0)
.getMediaUrlVideomp4StandardRes());
夹持器。固定层。固定表面;
holder.mmediplayer.prepare();
holder.instagramVideoVolume=0f;
holder.mmediplayer.setVolume(
holder.instagramVideoVolume,
支架(instagramVideoVolume);
//holder.mmediplayer.setOnBufferingUpdateListener(此);
持牌人
.setOnCompletionListener(新的OnCompletionListener(){
@凌驾
未完成的公共空间(
媒体播放器(mp){
//要玩:
mp.reset();
试一试{
mp.setDataSource(post
.getMedias()
.get(0)
.getMediaUrlVideomp4StandardRes());
mp.prepare();
}捕获(IllegalArgumentException e){
//TODO自动生成的捕获
//挡块
e、 printStackTrace();
}捕获(安全异常e){
//TODO自动生成的捕获
//挡块
e、 printStackTrace();
}捕获(非法状态){
//TODO自动生成的捕获
//挡块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕获
//挡块
e、 printStackTrace();
}

//问题是每次surface可用时都要制作一个新的mediaplayer。不太确定这是如何工作的,但这就是问题所在。相反,我在这个侦听器之外创建了mediaplayer。

根据我的研究,
textureView.getSurfaceTexture()
在Resume()上返回null
。我所做的是在
onResume()中将侦听器重新连接到它


然后,在SurfaceTextureAvailable()上执行您的常规操作。

当我没有释放MediaPlayer对象时,我身上出现了黑屏和音频播放。

不要在android项目上使用do
e.printStackTrace();
,而是使用
Log.e(“唯一标记”,“错误处理…”),e);
因此,您可以通过每次调用onSurfaceTextureAvailable来获取有用的错误信息?如果您每次都启动媒体播放器,您在哪里停止它?如果您的评论是一个答案,则答案确实在onSurfaceTextureAvailable中
TextureView textureView;

/*....
Usual stuff
*/

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

    //... destroy or disable image producer
}

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

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