手机音乐播放控制权抢占

[复制链接]
回帖奖励 6 金钱      回复本帖可获得 2 金钱奖励! 每人限 1 次
查看615 | 回复2 | 2024-9-25 10:35:15 | 显示全部楼层 |阅读模式
你有没有遇到过这种情况,在你的app播放音乐的时候,远程的控制器(例如耳机线控,蓝牙按钮控制)在控制你的app音乐的同时也会同时控制别的音乐播放器。如果遇到过,那就走过路过莫错过。
这种就是播放控制器的抢占问题。
iOS上解决比较方便:
  1. AVAudioSession *audioSession = [AVAudioSession sharedInstance];
  2. NSError *error = nil;
  3. [audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionDuckOthers error:&error];
  4. //    NSLog(@"error: %@", error);
  5.     error = nil;
  6. // 开启
  7.     [audioSession setActive:YES error:&error];
  8. // 关闭
  9. [audioSession setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:NULL];
复制代码
Android就复杂一些:
  1. // 抢占音乐控制权限
  2.     private int requestAudioFocus(Context context) {
  3.         audioManager = context.getSystemService(AudioManager.class);
  4.         afChangeListener = focusChange -> {
  5.             switch (focusChange) {
  6.                 case AudioManager.AUDIOFOCUS_GAIN:
  7. //                    if (playbackDelayed || resumeOnFocusGain) {
  8. //                        synchronized(focusLock) {
  9. //                            playbackDelayed = false;
  10. //                            resumeOnFocusGain = false;
  11. //                        }
  12. //                        playbackNow();
  13. //                    }
  14.                     break;
  15.                 case AudioManager.AUDIOFOCUS_LOSS:
  16. //                    synchronized(focusLock) {
  17. //                        resumeOnFocusGain = false;
  18. //                        playbackDelayed = false;
  19. //                    }
  20. //                    pausePlayback();
  21.                     break;
  22.                 case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
  23. //                    synchronized(focusLock) {
  24. //                        // only resume if playback is being interrupted
  25. //                        resumeOnFocusGain = isPlaying();
  26. //                        playbackDelayed = false;
  27. //                    }
  28. //                    pausePlayback();
  29.                     break;
  30.                 case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
  31.                     // ... pausing or ducking depends on your app
  32.                     break;
  33.             }
  34.         };

  35.         int code = 10000;
  36.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  37.             AudioAttributes playbackAttributes = new AudioAttributes.Builder()
  38.                     .setUsage(AudioAttributes.USAGE_MEDIA)
  39.                     .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
  40.                     .build();
  41.             // 获取永久音频焦点 AUDIOFOCUS_GAIN
  42.             focusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
  43.                     .setAudioAttributes(playbackAttributes)
  44.                     .setAcceptsDelayedFocusGain(true)
  45.                     .setOnAudioFocusChangeListener(afChangeListener, handler)
  46.                     .build();
  47.             // requesting audio focus and processing the response
  48.             int res = audioManager.requestAudioFocus(focusRequest);
  49.             synchronized (audioFocusLock) { // 与afChangeListener中的操作互斥
  50.                 if (res == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
  51.                     playbackNowAuthorized = true;
  52. //                    playbackNow();
  53.                     code = 0;
  54.                 } else if (res == AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
  55.                     // 请求失败了
  56.                     playbackNowAuthorized = false;
  57.                 } else if (res == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
  58.                     // 请求延迟了
  59.                     playbackDelayed = true;
  60.                     playbackNowAuthorized = false;
  61.                 }
  62.             }
  63.         } else {
  64.             // Request audio focus for playback
  65.             int result = audioManager.requestAudioFocus(
  66.                     afChangeListener,
  67.                     // Use the music stream.
  68.                     AudioManager.STREAM_MUSIC,
  69.                     // Request permanent focus.
  70.                     AudioManager.AUDIOFOCUS_GAIN
  71.             );

  72.             if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
  73.                 // Start playback
  74.                 code = 0;
  75.             }
  76.         }
  77.         // 创建 MediaSession
  78.         MediaSessionCompat mediaSession = new MediaSessionCompat(context, context.getPackageName());
  79.         // 设置 MediaSession 的处理器
  80.         mediaSession.setCallback(new MediaSessionCompat.Callback() {
  81.             @Override
  82.             public void onPlay() {
  83.                 // 处理播放事件
  84.             }

  85.             @Override
  86.             public void onPause() {
  87.                 // 处理暂停事件
  88.             }
  89.         });

  90.         // 激活 MediaSession
  91.         mediaSession.setActive(true);

  92.         return code;
  93.     }

  94. // 放弃控制权
  95.     private void abandonAudioFocus() {
  96.         if (null != mediaSession) {
  97.             mediaSession.setActive(false);
  98.             mediaSession = null;
  99.         }
  100.         if (null == audioManager) return;

  101.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  102.             if (null != focusRequest) {
  103.                 audioManager.abandonAudioFocusRequest(focusRequest);
  104.                 focusRequest = null;
  105.             }
  106.         } else {
  107.             audioManager.abandonAudioFocus(afChangeListener);
  108.         }
  109.         audioManager = null;
  110.         afChangeListener = null;
  111. }
复制代码


回复

使用道具 举报

一只呆头鹅 | 2024-9-25 11:27:41 | 显示全部楼层

回帖奖励 +2 金钱

看不懂,但大为震撼
回复 支持 反对

使用道具 举报

大猫的鱼 | 2024-9-25 14:06:49 | 显示全部楼层

回帖奖励 +2 金钱

牛的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则