Нет альтернативы присоединению AudioEffect к глобальному выходу. Вместо этого вам следует зарегистрировать широковещательный приемник, который получает все аудиосессии, чтобы вы могли применять к нему звуковые эффекты. Пример можно найти здесь а>. Намерение, содержащее идентификатор сеанса, получено в этом BroadcastReceiver. Помните, что это работает, только если вы зарегистрировали приемник в манифесте. В качестве альтернативы вы можете программно зарегистрировать приемник в своей службе onCreate():
IntentFilter()
.apply { addAction(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION) }
.apply { addAction(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION) }
.run { registerReceiver(mAudioSessionReceiver, this) } `
где mAudioSessionReceiver выглядит примерно так:
private val mAudioSessionReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent == null || context == null) {
return
}
val sessionStates = arrayOf(
AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION,
AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION
)
if (sessionStates.contains(intent.action)) {
val service = Intent(context, WaveletService::class.java)
val sessionID = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, AudioEffect.ERROR)
service
.apply { action = intent.action }
.apply { putExtra(AudioEffect.EXTRA_AUDIO_SESSION, sessionID) }
context.startService(service)
}
}
}`
Затем вы можете получить намерение в onStartCommand:
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
if (intent == null)
return START_STICKY
val sessionID = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, AudioEffect.ERROR)
when (intent.action) {
AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION -> {
// create new instance of the AudioEffect using the sessionID
}
AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION -> {
// Release instance of the AudioEffect connected to this sessionID
}
}
return START_REDELIVER_INTENT
}`
Наконец, не забудьте отменить регистрацию получателя в onDestroy():
unregisterReceiver(mAudioSessionReceiver)`
person
Thomas W.
schedule
24.11.2019