如何解决 AudioFlinger 服务器死机!安卓系统出错?

Posted

技术标签:

【中文标题】如何解决 AudioFlinger 服务器死机!安卓系统出错?【英文标题】:How to Resolve a AudioFlinger server died! Error in Android? 【发布时间】:2022-01-12 20:34:21 【问题描述】:

android 新手,这是我的第一个应用程序,我已经解决这个问题好几天了。我的应用程序允许用户在玩游戏时播放 6 种背景乐器。音乐全部为 .mp3 格式,直接保存在应用程序的 R.raw 文件夹中 - 没有从服务器流式传输

问题是选择轨道时,轨道播放一秒钟,冻结一两个,然后拾取并开始播放。这总是在第一次选择曲目时发生,然后通常在第二次发生,然后如果我通过播放不同的曲目继续测试,错误会变成 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!!!!");
 

每次结果都是“内存不足”。我还检查了内存泄漏,但在我的应用程序中没有发现任何内存泄漏。我最后的手段是在后台线程上播放曲目,但我得到了相同的结果。我在 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 的替代品?这是我的应用程序的最后一个大障碍。谢谢。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于如何解决 AudioFlinger 服务器死机!安卓系统出错?的主要内容,如果未能解决你的问题,请参考以下文章

Android 9 Audio系统笔记:AudioFlinger音频流处理流程

Android 9 Audio系统笔记:AudioFlinger音频流处理流程

Android 9 Audio系统笔记:AudioFlinger音频流处理流程

Android音频系统之AudioFlinger

Android 9 Audio系统笔记:AudioPolicy&AudioFlinger初始化

如何解决 U盘启动 Lunix 系统死机问题?