Android 新手,这是我的第一个应用程序,我已经解决这个问题好几天了。我的应用程序允许用户在玩游戏时播放 6 种背景乐器。音乐都是 .mp3 格式,直接存放在应用程序的 R.raw 文件夹中 -没有从服务器流式传输。
The issue is when a track is selected the track plays for a second, freezes for a second or two, and the picks up and starts to play on. 这总是在第一次选择曲目时发生,然后通常在第二次发生,然后如果我通过播放不同的曲目继续测试,则错误将变为 50/50,以确定它是否会发生。
在要求它播放曲目之前,我一直确保 mediaPlayer == null 。我还认为这可能是内存问题,因此在调用 mediaPlayer 之前,我使用以下代码检查内存:
private ActivityManager.MemoryInfo getAvailableMemory() {
ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
return memoryInfo;
}
if (!memoryInfo.lowMemory) {
Log.d("Tag", "NOT LOW MEMORY");
} else {
Log.d("Tag", "LOW MEMORY!!! LOW MEMORY!!!!");
}
每次结果都是“NOT LOW MEMORY”。我还检查了内存泄漏,但在我的应用程序中没有发现任何内存泄漏。我最后的手段是在后台线程上播放曲目,但我得到了相同的结果。我在 Logcat(Info) 中看到的是这些错误:
E/AudioSystem-JNI: Command failed for android_media_AudioSystem_error_callback: -32
W/AudioSystem: AudioFlinger server died!
W/AudioSystem: AudioPolicyService server died!
我最近的测试是为了超级简化代码,我尽可能地把它删掉了。当播放器单击按钮播放曲目时,这是直接代码:
boolean stopThread = false;
startNewBackgroundThreadForMediaPlayer(stopThread);
方法:
private void startNewBackgroundThreadForMediaPlayer(boolean stopThread) {
BackgroundMediaPlayerThreadRunnable runnable = new BackgroundMediaPlayerThreadRunnable(stopThread);
new Thread(runnable).start();
}
内部类:
private class BackgroundMediaPlayerThreadRunnable implements Runnable {
boolean stopThread;
BackgroundMediaPlayerThreadRunnable(boolean stopThread) {
this.stopThread = stopThread;
}
@Override
public void run(){
if(!stopThread) {
MediaPlayer player = new MediaPlayer();
player = MediaPlayer.create(SongsActivity.this, R.raw.song1);
player.start();
}
}
我遗漏了一些代码,比如停止歌曲/线程。我对媒体播放器的状态(==null?)进行了更复杂的代码检查,将歌曲保存到共享首选项等。无论是这段代码还是其他代码,结果都是一样的。
我已经用尽了我所有的资源,我还没有找到很多关于这样的错误的信息。我知道这不是真正的 mp3,因为它们有时可以播放。我正在真实设备上进行测试,Pixel 4XL。此外,这个错误刚刚开始发生,同样的代码在 3-4 天前工作得很好。任何人都可以帮助我吗?有没有我应该尝试的 mediaPlayer 的替代品?这是我的应用程序的最后一个大障碍。谢谢。