Android 纹理视图播放视频在onPause后变为黑色
我正在使用TextureView在ListView中播放视频。TextureView本身工作得很好,但是,如果我按home按钮并重新输入应用程序几次,TextureView将变黑(尽管音频仍在播放)。如果我退出并再次进入,TextureView将变为白色(或者可能是透明的,因为白色是我背景的颜色) 这是我的密码: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() {
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项目上使用doe.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*/);
}