问题描述
我有一个简单的媒体播放器应用程序,可以在一段时间内正常工作(例如每首歌曲将播放50次),然后在几乎所有媒体文件上开始崩溃(一些仍然可以工作,但滞后确实很糟糕;没有)滞后直到错误)。即使停止活动并重新打开,这些错误仍然继续!
这些相同的媒体文件在其他媒体播放器退出我的工作之后便可以使用,因此显然存在一些错误。我必须重新启动设备才能使Activity能够再次调用文件上的MediaPlayer.create()而不会出现错误。这种行为太晦涩了!
一个创建:
E/MediaPlayer: error (1,-38)
E/MediaPlayer: error (1,-2147483648)
E/MediaPlayer: Error (1,-2147479551)
E/MediaPlayer: error (1,-38)
另一个:
E/MediaPlayer: error (1,-2147479551)
E/MediaPlayer: Error (1,-38)
E/MediaPlayer: Error (1,-38)
因此,错误的顺序不一致,但是有重复出现的数字。其中一个数字不在目标SDK 30的MediaPlayer.java文件中,但是我正在测试的设备正在使用Android 6.0.1(我相信是SDK 23)。我不确定如何找到相关的Android源。使用Google搜索“ site:https://android.googlesource.com/ mediaplayer.java”是我发现的最好方法。
我确实找到了MEDIA_ERROR_SYstem = -2147483648
和MEDIA_ERROR_UNKNowN = 1
。我的系统中出现未知的媒体错误。
-2147479551怎么样?它似乎是MEDIA_ERROR_SYstem | 0x1001。 0x1001没有出现在MediaPlayer.java中。这是另一个未知的媒体错误。附加了哪些其他信息?那-38呢?!
可能导致此类错误的原因。我什至不知道该如何绕过这种行为。 MediaPlayer是否无法正确释放?应用程序关闭时,我是否会泄漏不会消失的资源?我的代码很简单,它似乎可以按预期的方式释放所有内容。重新启动如何解决该问题?
以下是相关代码:
Playlist masterPlaylist;
public boolean surfaceCreated;
AudioURI currentSong;
AudioURI nextSong;
MediaPlayer mediaPlayer;
MediaPlayer nextMediaPlayer;
VideoView videoView;
final Object lock = new Object();
MediaPlayer.OnCompletionListener onCompletionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer2) {
synchronized (lock) {
Log.i(TAG,"onCompletion started");
currentSong = nextSong;
mediaPlayer.release();
mediaPlayer = nextMediaPlayer;
if (surfaceCreated) {
mediaPlayer.setdisplay(videoView.getHolder());
mediaPlayer.start();
}
nextSong = masterPlaylist.next();
executorService.submit(runnableNextMediaPlayer);
Log.i(TAG,"onCompletion ended");
}
}
};
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.i(TAG,"onClick started");
currentSong = nextSong;
mediaPlayer.release();
mediaPlayer = nextMediaPlayer;
if (surfaceCreated) {
mediaPlayer.setdisplay(videoView.getHolder());
mediaPlayer.start();
}
nextSong = masterPlaylist.next();
executorService.submit(runnableNextMediaPlayer);
Log.i(TAG,"onClick ended");
}
};
ExecutorService executorService = Executors.newSingleThreadExecutor();
Runnable runnableNextMediaPlayer = new Runnable() {
@Override
public void run() {
synchronized (lock) {
Log.i(TAG,"creating next MediaPlayer");
nextMediaPlayer = MediaPlayer.create(getApplicationContext(),nextSong.getUri()); nextMediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
nextMediaPlayer.setonCompletionListener(onCompletionListener);
Log.i(TAG,"next MediaPlayer created");
}
}
};
public void calledAtTheEndOfOnCreate() {
videoView = findViewById(R.id.video_view);
currentSong = masterPlaylist.next();
mediaPlayer = MediaPlayer.create(getApplicationContext(),currentSong.getUri());
mediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
mediaPlayer.setonCompletionListener(onCompletionListener);
nextSong = masterPlaylist.next();
executorService.submit(runnableNextMediaPlayer);
videoView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
surfaceCreated = true;
mediaPlayer.setdisplay(surfaceHolder);
mediaPlayer.start();
}
@Override
public void surfaceChanged(@NonNull SurfaceHolder surfaceHolder,int i,int i1,int i2) {}
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {surfaceCreated = false;}
});
FloatingActionButton floatingActionButton = findViewById(R.id.fab);
floatingActionButton.setonClickListener(onClickListener);
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)