如何限制android播放器同时播放多个媒体文件?

How to restrict android player from playing more than one media file parallely?

如果我在其他应用程序中播放音乐,例如foob​​ar2000

然后在我的应用中使用这个功能播放音乐,两个播放器会同时播放

public void playMusic(String file){
    Uri uri=Uri.parse("android.resource://" + getPackageName() + "/raw/"+file);

    if(uri!=null) {
        myPlayer = new MediaPlayer();
        if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
                myPlayer.setAudioAttributes(new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_MEDIA)
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .build());
        }else{
            myPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        }
        try {
            myPlayer.setDataSource(getApplicationContext(), uri);
        } catch (IllegalArgumentException e) {
        } catch (SecurityException e) {
        } catch (IllegalStateException e) {
        } catch (IOException e) {
        }
        try {
            myPlayer.prepare();
        } catch (IllegalStateException e) {
        } catch (IOException e) {
        }
        myPlayer.start();
    }
}

如果我先在我的应用程序中播放音乐,然后再播放其他播放器,其他播放器仍然无法停止我的播放器

如果我尝试其他两个播放器应用程序,它们可以互相停止。

如何强制 Android 只播放我的播放器,并允许其他播放器停止我的播放器?

您需要使用 AudioManager class,如下所示, 每当你需要音频焦点时,调用下面的方法

protected fun requestAudioFocus(): Boolean {
        val audioManager: AudioManager = binding.root.context.getSystemService(Context.AUDIO_SERVICE) as AudioManager

        val res = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            mFocusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)
                    .setAudioAttributes(mPlaybackAttributes)
                    .setAcceptsDelayedFocusGain(true)
                    .setOnAudioFocusChangeListener(afChangeListener)
                    .build()
            audioManager.requestAudioFocus(mFocusRequest)
        } else {
            audioManager.requestAudioFocus(afChangeListener,
                    // Use the music stream.
                    AudioManager.STREAM_MUSIC,
                    // Request permanent focus.
                    AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)
        }
        return res == AudioManager.AUDIOFOCUS_REQUEST_GRANTED
    }

每当您想发布它时,请使用下面的代码,

val audioManager: AudioManager = binding.root.context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                audioManager.abandonAudioFocusRequest(mFocusRequest)
            } else {
                audioManager.abandonAudioFocus(afChangeListener)
            }
        } catch (e: Exception) {

        }

在清单中,您需要请求修改音频设置的权限

    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

注意:- 代码片段在 Kotlin 中