如何在Android中通过编程打开内置的均衡器?

9
我看到很多应用程序可以直接在系统内建的均衡器中打开(例如Google Play音乐、Spotify、三星股票音乐播放器),而无需从头编写自己的均衡器。这些应用程序是如何实现的?我找不到解决方法。
} else if (id == R.id.action_fx) {
        Intent intent = new Intent();
        intent.setAction("android.media.action.DISPLAY_AUDIO_EFFECT_CONTROL_PANEL");
        if ((intent.resolveActivity(getPackageManager()) != null)) {
            startActivity(intent);
        } else {
            Intent intent11 = new Intent(MainActivity.this, Help.class);
            intent11.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            startActivity(intent11);
            // No equalizer found :(
        }
        return true;
4个回答

9
以下内容可启动默认的均衡器活动:Activity
Intent intent = new Intent(AudioEffect
    .ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL);

if ((intent.resolveActivity(getPackageManager()) != null)) {
    startActivityForResult(intent, REQUEST_EQ);
} else {
    // No equalizer found :(
}

基本上,Spotify也是这样做的,其他应用我没有检查过。

startActivityForResult()方法的必要性在文档中有解释:

Intent携带了一些额外的信息,用于播放器应用与控制面板应用之间的通信。

调用方必须使用android.app.Activity#startActivityForResult(Intent, int)方法来启动控制面板,以便指定其包名并由控制面板应用用于跟踪此特定应用程序的更改。


0
这是我为在Android中打开内置均衡器所编写的函数,您只需要在下面的函数中传递Activity Context并提供会话ID即可。
    public static void openEqualizer(@NonNull final Activity activity) throws RemoteException {
    final int sessionId = MediaPlaybackServiceManager.sService.getAudioSessionId();
    if (sessionId == AudioEffect.ERROR_BAD_VALUE) {
        Toast.makeText(activity, "No Session Id", Toast.LENGTH_LONG).show();
    } else {
        try {
            final Intent effects = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL);
            effects.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, "your app package name");
            effects.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, sessionId);
            effects.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC);
            activity.startActivityForResult(effects, 0);
        } catch (@NonNull final ActivityNotFoundException notFound) {
            Toast.makeText(activity, "There is no equalizer", Toast.LENGTH_SHORT).show();
        }
    }
}

以上代码对我有效,希望对你也有效...


0

你需要使用以下代码:intent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, mp.getAudioSessionId());,然后你需要一个MediaPlayer变量,你需要在同一个intent中添加显示均衡器的intent、audioSession和getPackageName:effects.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, this.getPackageName());,同时还需要Intent intent = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL);,其中包含audiosession和package name。首先显示intent,然后是audiosession和getpackagename。

然后在服务中,只有当多个歌曲正在播放时才需要以下代码,否则均衡器不会始终工作。

public void openAudioFx() {
    Intent i = new Intent(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION);
    i.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, getPackageName);
    i.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, audioSession);
    this.sendBroadcast(i);
}

public void closeAudioFx() {
    Intent k = new Intent(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION);
    k.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, getPackageName);
    k.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, audioSession);
    this.sendBroadcast(k);
    } 

那么你需要接收广播,为了让它一直工作,你需要创建一个整型变量audioSession = 0;

还有一个获取包名的字符串getPackageName = getPackageName();

然后你需要广播包名和音频会话,然后使用这些变量,而不是代码。均衡器显示意图、包名和音效是意图显示均衡器所必需的,只能在Activity中使用。

我认为你可以尝试使用广播接收器类。

public final BroadcastReceiver hello;
{
    hello = new BroadcastReceiver() {


        private static final String TAG = "mMessageReceiver";

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null) {
                String action = intent.getAction();


                switch (action) {
                    case AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION:
                        // Log.d(TAG_MAIN_ACTIVITY, action);


                        break;
                    case AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION:
                        break;
                    case AudioEffect.EXTRA_AUDIO_SESSION:
                        audioSession = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, 0);


                        break;
                    case AudioEffect.EXTRA_PACKAGE_NAME:
                        // Log.d(TAG_MAIN_ACTIVITY, action);


                        break;

接下来,您需要从服务中广播包名称,并在活动中找到它。使用一个变量,该变量是必须比其他变量更高级的字符串,将其用于广播包名称,然后将变量用于广播。然后将此放入 onCreate 中:

public final BroadcastReceiver hello;

{
    hello = new BroadcastReceiver() {


        private static final String TAG = "mMessageReceiver";

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null) {
                String action = intent.getAction();


                switch (action) {
                    case AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION:
                        // Log.d(TAG_MAIN_ACTIVITY, action);
                        break;
                    case AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION:
                        break;
                    case AudioEffect.EXTRA_AUDIO_SESSION:
                        audioSession = intent.getIntExtra(AudioEffect.EXTRA_AUDIO_SESSION, 0);
                        break;
                    case AudioEffect.EXTRA_PACKAGE_NAME:
                        // Log.d(TAG_MAIN_ACTIVITY, action);
                        break;
                    }

    LocalBroadcastManager.getInstance(this).registerReceiver(hello, new IntentFilter("ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION"));
    LocalBroadcastManager.getInstance(this).registerReceiver(hello, new IntentFilter("ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION"));
    LocalBroadcastManager.getInstance(this).registerReceiver(hello, new IntentFilter("EXTRA_PACKAGE_NAME"));
    LocalBroadcastManager.getInstance(this).registerReceiver(hello, new IntentFilter("EXTRA_AUDIO_SESSION")); 

完成了。希望它能正常工作,如果有任何遗漏,请告诉我,我会尽快回复。抱歉,部分代码格式不正确,请先阅读并将所有代码放在一起,然后如果您能看到编写的内容,请将其与代码分开。


-1
顺便提一下,如果来自ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL的意图请求代码无处可去,则均衡器将无法正常工作。要解决此问题,请在您的应用程序中放置此代码,否则效果可能根本不起作用。可以尝试将以下代码放入应用程序中: @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 0 && resultCode == RESULT_OK) { final Intent effects = new Intent(); effects.putExtra(AudioEffect.EXTRA_PACKAGE_NAME,getPackageName()); effects.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, audiosession); effects.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC); effects.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.EFFECT_TYPE_EQUALIZER); startActivity(effects); } } 谢谢!请注意:他可以使用自己的请求代码,而不仅仅是我的0。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接