Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将AudioEffect附加到全球混音的首选方式?_Android_Session_Audio_Global_Effects - Fatal编程技术网

Android 将AudioEffect附加到全球混音的首选方式?

Android 将AudioEffect附加到全球混音的首选方式?,android,session,audio,global,effects,Android,Session,Audio,Global,Effects,在Android的AudioEffectAPI中,所有的内置效果(如均衡器)都带有警告 “注意:不推荐使用会话0将均衡器连接到全局音频输出混音。” 如果这是不推荐的,那么替换API是什么?我的目标是对全球产出组合产生影响…是的,它被弃用,因为 Android开发者网站声明均衡器类的第二个参数应该是: 系统范围的唯一音频会话标识符。均衡器将是 在同一音频会话中连接到MediaPlayer或AudioTrack 您应该改为使用此选项: MediaPlayer mediaPlayer = new Me

在Android的AudioEffectAPI中,所有的内置效果(如均衡器)都带有警告

“注意:不推荐使用会话0将均衡器连接到全局音频输出混音。”


如果这是不推荐的,那么替换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)`