Android蓝牙音箱按键监听(播放、暂停、上下曲)

news/2024/11/23 12:59:28/

测试机

  • 荣耀9x(Android 10)
  • 三星(Android 7)

开发环境

  • Android Studio 3.5.1
  • compileSdkVersion 30
  • buildToolsVersion “30.0.1”
  • minSdkVersion 21
  • targetSdkVersion 30

播放音乐,不先播放音乐会被别的音频播放器把广播给拦截。

下面播放Raw目录下的音频文件。

mediaPlayer = new MediaPlayer();
AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.hui);
try {mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
} catch (IOException e) {e.printStackTrace();
}
//异步准备播放
mediaPlayer.prepareAsync();
//设置准备就绪状态监听
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {// 开始播放mediaPlayer.start();}
});
按键状态监听

Api21 之前

  1. 新建按键广播监听类
/*** Author: jVen* Time: 2020/8/14 16:39* Description:*/
public class MyMediaButtonReceiver extends BroadcastReceiver {private String TAG = "MyMediaButtonReceiver";@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action != null) {if (TextUtils.equals(action, Intent.ACTION_MEDIA_BUTTON)) {KeyEvent keyEvent = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);if (keyEvent != null) {if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {int keyCode = keyEvent.getKeyCode();switch (keyCode) {//可以通过广播形式通知Activity更新UIcase KeyEvent.KEYCODE_MEDIA_PLAY:Toast.makeText(context, "onReceive: 播放", Toast.LENGTH_SHORT).show();break;case KeyEvent.KEYCODE_MEDIA_PAUSE:Toast.makeText(context, "onReceive: 暂停", Toast.LENGTH_SHORT).show();break;case KeyEvent.KEYCODE_MEDIA_NEXT:Toast.makeText(context, "onReceive: 下一首", Toast.LENGTH_SHORT).show();break;case KeyEvent.KEYCODE_MEDIA_PREVIOUS:Toast.makeText(context, "onReceive: 上一首", Toast.LENGTH_SHORT).show();break;}}}}}}
}
  1. AndroidManifest.xml
<receiver android:name=".MyMediaButtonReceiver"><intent-filter><action android:name="android.intent.action.MEDIA_BUTTON" /></intent-filter>
</receiver>
  1. Activity注册广播
//获取音频服务
AudioManager audioManager = (AudioManager) this.getSystemService(AUDIO_SERVICE);
//注册接收的Receiver
ComponentName mRemoteControlClientReceiverComponent;
mRemoteControlClientReceiverComponent = new ComponentName(getPackageName(), MyMediaButtonReceiver.class.getName());
//注册MediaButton
audioManager.registerMediaButtonEventReceiver(mRemoteControlClientReceiverComponent);

registerMediaButtonEventReceiver Api21之后过时,但是两部测试机依然可以使用这个监听到蓝牙的按键事件。


Api21之后

  1. 添加依赖
implementation "androidx.media:media:1.1.0"
  1. 注册广播
ComponentName mbr = new ComponentName(getPackageName(), MediaButtonReceiver.class.getName());
mMediaSession = new MediaSessionCompat(this, "mbr", mbr, null);
//一定要设置
mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
if (!mMediaSession.isActive()) {mMediaSession.setActive(true);
}
mMediaSession.setCallback(new MediaSessionCompat.Callback() {@Overridepublic boolean onMediaButtonEvent(Intent intent) {String action = intent.getAction();if (action != null) {if (TextUtils.equals(action, Intent.ACTION_MEDIA_BUTTON)) {KeyEvent keyEvent = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);if (keyEvent != null) {if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {int keyCode = keyEvent.getKeyCode();switch (keyCode) {//可以通过广播形式通知Activity更新UIcase KeyEvent.KEYCODE_MEDIA_PLAY:Toast.makeText(MainActivity.this, "onReceive: 播放", Toast.LENGTH_SHORT).show();break;case KeyEvent.KEYCODE_MEDIA_PAUSE:Toast.makeText(MainActivity.this, "onReceive: 暂停", Toast.LENGTH_SHORT).show();break;case KeyEvent.KEYCODE_MEDIA_NEXT:Toast.makeText(MainActivity.this, "onReceive: 下一首", Toast.LENGTH_SHORT).show();break;case KeyEvent.KEYCODE_MEDIA_PREVIOUS:Toast.makeText(MainActivity.this, "onReceive: 上一首", Toast.LENGTH_SHORT).show();break;}}}}}return super.onMediaButtonEvent(intent);}
});

一定要先播放音乐事件才不会被别的播放器拦截,最好把音频焦点也获取了(焦点获取了别的播放器的逻辑里面会暂停播放)


http://www.ppmy.cn/news/347220.html

相关文章

小心!智能音箱正在监听你?

参加「CTA 核心技术及应用峰会」&#xff0c;请扫码报名 ↑↑↑ 作者 | James Vlahos 译者 | 弯月 责编 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 导语&#xff1a;无论是我们的家里还是身上或多或少都会携带智能语音设备&#xff0c;如今甚至连儿童…

22个Python的万用公式分享

在大家的日常python程序的编写过程中&#xff0c;都会有自己解决某个问题的解决办法&#xff0c;或者是在程序的调试过程中&#xff0c;用来帮助调试的程序公式。小编通过几十万行代码的总结处理&#xff0c;总结出了22个python万用公式&#xff0c;可以帮助大家解决在日常的py…

监听音箱和普通音箱有什么区别

见链接&#xff1a; http://forum.taobao.com/forum-38/show_guide---guide-5173134-.htm

专业音频设备信号电平标准 dBu dBV 主动扬声器有源监听音箱输入电平标准

标准&#xff1a;GY/T 192-2003&#xff0c; 主要内容&#xff1a; 适用对象&#xff1a;专业音频设备 0dBu0.775Vrms 0dBFS&#xff08;Balance&#xff09;24dBu&#xff08;21.78dBV&#xff0c;12.28Vrms&#xff0c;17.36Vp&#xff09;。 模拟校准电平4dBu(1.78dBV,1.228…

停车场一键求助对讲系统

停车场一键求助对讲系统 适用性高&#xff0c;保障性能强 无论是商场的停车场&#xff0c;还是社区的停车场&#xff0c;我们的系统都能轻松应对。此外&#xff0c;可靠的保障性能&#xff0c;更能为车主提供便利的服务保障。 防盗警报&#xff0c;实现车位管理 在停车场内&…

C语言:写一个函数,实现一个整型有序数组的二分查找

题目&#xff1a; 写一个函数&#xff0c;实现一个整型有序数组的二分查找&#xff0c;找出要找的数字在数组中对应的下标。 思路&#xff1a; 总体思路&#xff1a; &#xff08;一&#xff09;自定义函数部分&#xff1a; &#xff08;1&#xff09;. 参数&#xff1a; int…

5年测试岗,自动化测试经验总结(真实)他的测试之路高歌猛进...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 8年测试工程师的自…

数据在内存中的存储--浮点数

那么好了好了&#xff0c;宝子们&#xff0c;今天给大家介绍一下 “数据在内存中储存” 的来龙去脉---浮点数&#xff0c;来吧&#xff0c;开始整活&#xff01;⛳️ 一、数据类型家族&#xff08;浮点数&#xff09; 家族成员&#xff1a;float&#xff0c;double&#xf…