0

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 的替代品?这是我的应用程序的最后一个大障碍。谢谢。

4

1 回答 1

0

我花了很多时间试图弄清楚这一点,我遇到的所有东西都远远超出了我的理解水平。最终,我将 Pixel 手机重置为出厂设置,然后解决了问题。

不确定这是否是最好的解决方案,但这是唯一有效的方法。也许这个答案会帮助其他人解决同样的问题。

编辑:我还在用过的 Pixel 手机上进行测试,所以手机本身可能有些缺陷。

于 2021-12-09T14:21:35.290 回答