Android 将AudioEffect附加到全球混音的首选方式?
在Android的AudioEffectAPI中,所有的内置效果(如均衡器)都带有警告 “注意:不推荐使用会话0将均衡器连接到全局音频输出混音。”Android 将AudioEffect附加到全球混音的首选方式?,android,session,audio,global,effects,Android,Session,Audio,Global,Effects,在Android的AudioEffectAPI中,所有的内置效果(如均衡器)都带有警告 “注意:不推荐使用会话0将均衡器连接到全局音频输出混音。” 如果这是不推荐的,那么替换API是什么?我的目标是对全球产出组合产生影响…是的,它被弃用,因为 Android开发者网站声明均衡器类的第二个参数应该是: 系统范围的唯一音频会话标识符。均衡器将是 在同一音频会话中连接到MediaPlayer或AudioTrack 您应该改为使用此选项: MediaPlayer mediaPlayer = new Me
如果这是不推荐的,那么替换API是什么?我的目标是对全球产出组合产生影响…是的,它被弃用,因为 Android开发者网站声明均衡器类的第二个参数应该是: 系统范围的唯一音频会话标识符。均衡器将是 在同一音频会话中连接到MediaPlayer或AudioTrack 您应该改为使用此选项:
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource( _your_data_source_ );
Equalizer equalizer = new Equalizer(0, mediaPlayer.getAudioSessionId());
equalizer.setEnabled(true);
/* Do your stuff ... */
mediaPlayer.start();
根据,您可以使用操作\打开\音频\效果\控制\会话来接收播放音频会话的id:
意图向效果控制应用程序或服务发出信号,表示新的音频会话已打开,需要应用音频效果
我尝试在清单中添加常量,但无效:
<receiver android:name=".receivers.AudioSessionReceiver">
<intent-filter>
<action android:name="android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION"/>
</intent-filter>
</receiver>
如果您知道如何使用该常量,则意图将包含音频会话id,您可以使用该id应用所需的均衡器设置。(如果你在这些年里找到了工作,你介意分享吗?除了在全球输出中附加音频效果之外,别无选择。您应该做的是注册一个接收所有音频会话的广播接收器,以便可以对其应用音频效果。可以找到一个例子。包含会话ID的意图在此BroadcastReceiver中获得。请记住,只有在清单中注册了接收者,这才有效。 或者,您可以在服务onCreate()中以编程方式注册这样的接收器: 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)
}
}
}`
然后,您可以在onstart命令中获得意图:
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()中注销接收器:
正如您链接上的一条评论所述,如果您希望对现有流或所有流应用均衡器或其他效果,则这不是一种解决方法。目前,您仍可以使用带有
均衡器的全局音频会话。没有替代品,弃用并不总是伴随着替代品。他们只是认为这似乎不起作用,并决定在进一步发布Android之前保持对这一功能的支持。您的解决方法是在应用程序中为每个MediaPlayer实例附加一个均衡器。如果没有,请冒险将均衡器
连接到全局音频会话,知道它肯定不会在以后的版本中运行。您好,Halim,如何将eqaulizer连接到每个MediaPlayer实例?请分享更多信息。还有什么可以替代ICS中的全局附加效应呢?这只适用于Spotify,你对此有什么线索吗?
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
}`
unregisterReceiver(mAudioSessionReceiver)`