Использование значения audioSessionId для создания класса AudioFx?

Я прочитал API Android и попытался audioSessionId поиск по интернету о объявлении пользовательского audioSessionId а затем с помощью этого audioSessionId инициализировать класс AudioFx и назначить свой MediaPlayer или AudioTrack audioSessionId .

Этот метод позволит мне сначала создать AudioFx, а затем подключить новый MediaPlayer или AudioTrack к этому audioSessionId .

В настоящее время я могу использовать этот метод на Android 2.3.6, но на Android 4.x. Я сталкиваюсь с проблемами с ошибками, которые инициализация терпит неудачу, или на других устройствах ICS / JellyBean эта ошибка не работает, но вызов функции приводит к исключениям.

Samsung Galaxy S II [Android 4.0.3]: [Проблема больше не происходит с Android 4.0.4]

  E/AudioEffect(13250): set(): AudioFlinger could not create effect, status: -38 E/AudioEffects-JNI(13250): AudioEffect initCheck failed -5 E/AudioEffect-JAVA(13250): Error code -5 when initializing AudioEffect. W/WrapEqualizer(13250): createEqualizer() -> Effect library not loaded 

Motorola Xoom [Android 4.1.2]
Не получается, что после конструктора это кажется бесшумным. Затем при вызове getProperties () он сбой.

 java.lang.RuntimeException: AudioEffect: set/get parameter error at android.media.audiofx.AudioEffect.checkStatus(AudioEffect.java:1247) at android.media.audiofx.Equalizer.getProperties(Equalizer.java:532) 

Nexus 4 [Android 4.2.1]
Используя audioSessionId = 0, все работает нормально, но с использованием любого другого номера устройство будет сообщать о следующей тихой ошибке каждый раз, когда я пытаюсь изменить предустановку, уровень полосы, бас, активировать ON или Virtualizer до ON. Идентификатор эффекта различается в зависимости от FX, который я пытаюсь изменить.

 W/AudioPolicyManagerBase(165): unregisterEffect() unknown effect ID 1381 

Обновление 08/11/12:
Я могу использовать audioSessionId как 0. Я знаю, что он устарел, но он работает с использованием разрешения. <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> Должен ли я использовать AudioFx со звуковым идентификатором сеанса 0?

Solutions Collecting From Web of "Использование значения audioSessionId для создания класса AudioFx?"

Вы должны посмотреть: это

По-видимому, это нерешенная проблема, возникшая в ICS и, вероятно, не была решена ни в JB.

Должен ли я использовать AudioFx со звуковым идентификатором сеанса 0?

Вероятно, это будет работать в некоторых случаях, но не рассчитывайте на продолжение этого в будущих версиях Android. Вы уже ставите под угрозу взаимодействие между вашим приложением и другими приложениями на Jellybean. Просто взгляните на то, что делает AudioFlinger, когда включен эффект :

 // suspend all effects in AUDIO_SESSION_OUTPUT_MIX when enabling any effect on // another session. This gives the priority to well behaved effect control panels // and applications not using global effects. // Enabling post processing in AUDIO_SESSION_OUTPUT_STAGE session does not affect // global effects if ((sessionId != AUDIO_SESSION_OUTPUT_MIX) && (sessionId != AUDIO_SESSION_OUTPUT_STAGE)) { setEffectSuspended_l(NULL, enabled, AUDIO_SESSION_OUTPUT_MIX); } 

Я знаю эту проблему, если кто-то хочет попробовать

сделай это

  Equalizer eq=null; . . . . . //in any function before initialization do this if(eq!=null) eq.release(); eq=new Equalizer(0, audiosessionid); 

Попробуйте один раз

Помимо сеанса 0, который является «устаревшим глобальным сеансом», мое понимание кода AudioFlinger показывает, что сеансы создаются только для классов, которые фактически выполняют аудио IO, то есть AudioRecord, AudioTrack, MediaPlayer и т. Д. Вы должны создать эти классы и Затем получите идентификатор сеанса, а затем добавьте эффект.

Любое другое значение, которое вы предоставили для идентификатора сеанса, будет соответствовать аудио-сеансу, который не существует, и так будет терпеть неудачу.