1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > android连接蓝牙控制音乐播放器播放暂停/上一曲/下一曲 且断开蓝牙暂停音乐

android连接蓝牙控制音乐播放器播放暂停/上一曲/下一曲 且断开蓝牙暂停音乐

时间:2023-06-08 18:36:36

相关推荐

android连接蓝牙控制音乐播放器播放暂停/上一曲/下一曲 且断开蓝牙暂停音乐

客户需求要蓝牙设备可以控制音乐播放器的暂停等操作,当时只做了蓝牙的权限配置,未对这些操作做处理。

1、配置清单文件

<serviceandroid:name=".PlayerService"android:exported="false" />.........................................................<receiver android:name="com.apps.utils.HeadsetButtonReceiver"><intent-filter><action android:name="android.intent.action.MEDIA_BUTTON" /></intent-filter></receiver>

2、配置蓝牙相关的一些广播

注:在配置蓝牙相关功能的时候,遇到一些问题,比如点击蓝牙耳机的下一首切换按键,会直接切换两首歌,比如当前播放第5首,会直接跳到第七首,蓝牙的播放暂停无效,断开蓝牙不暂停等bug。后找到问题时按键有一个按下弹起的过程,在按下的时候,它切换了一首歌,没有做弹起的处理。默认的弹起又点击了下一首歌,所以会跳两首;播放暂停键也是相当于做了两次处理,所以暂停无效。

所以在每个事件后加上“&& keyEvent.getAction() == KeyEvent.ACTION_UP”做事件处理。

public class HeadsetButtonReceiver extends BroadcastReceiver {private Timer timer = new Timer();private static int clickCount;private static onHeadsetListener headsetListener;public HeadsetButtonReceiver(){super();}@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();Log.e("xxx","----------onReceive------------"+action);if(action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)){int bluetoothState = intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE, 0);//蓝牙断开if( bluetoothState==BluetoothAdapter.STATE_DISCONNECTED){handler.sendEmptyMessage(4);}}if(action.equals("android.intent.action.HEADSET_PLUG")){if (intent.hasExtra("state")) {if (intent.getIntExtra("state", 2) == 0){//拔出handler.sendEmptyMessage(4);}else if (intent.getIntExtra("state", 2) == 1) {//插入}}}if(Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {KeyEvent keyEvent = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_HEADSETHOOK && keyEvent.getAction() == KeyEvent.ACTION_UP) {clickCount = clickCount + 1;if(clickCount == 1){HeadsetTimerTask headsetTimerTask = new HeadsetTimerTask();timer.schedule(headsetTimerTask,1000);}} else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_MEDIA_NEXT && keyEvent.getAction() == KeyEvent.ACTION_UP) {handler.sendEmptyMessage(2);} else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_MEDIA_PREVIOUS && keyEvent.getAction() == KeyEvent.ACTION_UP) {handler.sendEmptyMessage(3);}else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_MEDIA_PAUSE && keyEvent.getAction() == KeyEvent.ACTION_UP) {handler.sendEmptyMessage(4);}else if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_MEDIA_PLAY && keyEvent.getAction() == KeyEvent.ACTION_UP) {handler.sendEmptyMessage(5);}}}class HeadsetTimerTask extends TimerTask {@Overridepublic void run() {try{if(clickCount==1){handler.sendEmptyMessage(1);}else if(clickCount==2){handler.sendEmptyMessage(2);}else if(clickCount>=3){handler.sendEmptyMessage(3);}clickCount=0;}catch (Exception e){e.printStackTrace();}}}Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);try {if (msg.what == 1) {headsetListener.playOrPause();}else if(msg.what == 2){headsetListener.playNext();}else if(msg.what == 3){headsetListener.playPrevious();}else if(msg.what == 4){headsetListener.receiverPause();} else if(msg.what == 5){headsetListener.receiverPlay();}}catch (Exception e){e.printStackTrace();}}};public interface onHeadsetListener{void receiverPlay();void receiverPause();void playOrPause();void playNext();void playPrevious();}public void setOnHeadsetListener(onHeadsetListener newHeadsetListener){headsetListener = newHeadsetListener;}}

3、在整个音乐播放器的广播操作中做简单的注册,在onrecieve中注销监听,进行一些播放的操作处理。(只摘取中其中的相关代码来,各位可以根据自己的相应的工程文件位置放置代码,代码中的play(),next()方法, 等是音乐播放器的一些操作暂不贴代码。)

public class PlayerService extends IntentService implements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener,MediaPlayer.OnBufferingUpdateListener,HeadsetButtonReceiver.onHeadsetListener {private HeadsetButtonReceiver bluetoothReceiver;//注册 注销public void registerHeadsetReceiver() {AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);ComponentName name = new ComponentName(getPackageName(), HeadsetButtonReceiver.class.getName());audioManager.registerMediaButtonEventReceiver(name);}public void unregisterHeadsetReceiver(){AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);ComponentName name = new ComponentName(getPackageName(), HeadsetButtonReceiver.class.getName());audioManager.unregisterMediaButtonEventReceiver(name);}@Overridepublic void onCreate() {super.onCreate();dbHelper = new DBHelper(Constant.context);registerReceiver(onCallIncome, new IntentFilter("android.intent.action.PHONE_STATE"));//注册蓝牙广播接收器bluetoothReceiver = new HeadsetButtonReceiver();bluetoothReceiver.setOnHeadsetListener(this);IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);intentFilter.addAction("android.intent.action.HEADSET_PLUG");registerReceiver(bluetoothReceiver,intentFilter);registerHeadsetReceiver();}/*** 对蓝牙 播放*/@Overridepublic void receiverPlay() {play();}/*** 对蓝牙 暂停*/@Overridepublic void receiverPause() {if(Constant.isPlaying) {pause();}}/*** 对蓝牙 播放-暂停*/@Overridepublic void playOrPause() {if(Constant.isPlaying) {pause();} else {if(!Constant.isOnline || JsonUtils.isNetworkAvailable(Constant.context)) {play();} else {Toast.makeText(Constant.context, getResources().getString(R.string.internet_not_conn), Toast.LENGTH_SHORT).show();}}}/*** 对蓝牙 下一首*/@Overridepublic void playNext() {if(!Constant.isOnline || JsonUtils.isNetworkAvailable(Constant.context)) {next();} else {Toast.makeText(Constant.context, getResources().getString(R.string.internet_not_conn), Toast.LENGTH_SHORT).show();}}/*** 对蓝牙 上一首*/@Overridepublic void playPrevious() {if(!Constant.isOnline || JsonUtils.isNetworkAvailable(Constant.context)) {previous();} else {Toast.makeText(Constant.context, getResources().getString(R.string.internet_not_conn), Toast.LENGTH_SHORT).show();}}}

整个功能暂时这么多,希望帮到各位。

特别感谢我无敌帅气厉害的师傅提供技术支持。

PS:蓝牙对接的一些思路感谢一些博主:

断开蓝牙暂停播放

线控耳机播放/上一曲/下一曲

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。