#android #audio #android-mediaplayer #audioflinger
#Android #Аудио #android-медиаплеер #аудиофлингер
Вопрос:
Новичок в Android, это мое первое приложение, и я занимаюсь этим вопросом уже несколько дней. Мое приложение позволяет пользователям воспроизводить 6 фоновых инструментов во время игры. Музыка полностью в формате .mp3 и размещена непосредственно в приложении в папке файлов R. raw — с сервера ничего не передается.
Проблема в том, что при выборе трека трек воспроизводится в течение секунды, замирает на секунду или две, а затем подхватывается и начинает воспроизводиться. Это всегда происходит при первом выборе трека, а затем обычно на 2-м, а затем, если я продолжу тестирование, воспроизводя разные треки, ошибка станет 50/50 относительно того, произойдет это или нет.
Я всегда гарантировал, что медиаплеер == null, прежде чем запрашивать воспроизведение трека. Я также подумал, что это может быть проблема с памятью, поэтому перед вызовом медиаПлеера я проверяю память с помощью этого кода:
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(Информация), — это эти ошибки:
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 к заводским настройкам, и после этого проблема была решена.
Не уверен, что это лучшее решение, но это единственное, что сработало. Возможно, этот ответ поможет кому-то еще столкнуться с той же проблемой.