客户需求要蓝牙设备可以控制音乐播放器的暂停等操作,当时只做了蓝牙的权限配置,未对这些操作做处理。
1、配置清单文件
<service
android: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();
}
@Override
public 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 {
@Override
public 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() {
@Override
public 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);
}
@Override
public 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();
}
/**
* 对蓝牙 播放
*/
@Override
public void receiverPlay() {
play();
}
/**
* 对蓝牙 暂停
*/
@Override
public void receiverPause() {
if(Constant.isPlaying) {
pause();
}
}
/**
* 对蓝牙 播放-暂停
*/
@Override
public 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();
}
}
}
/**
* 对蓝牙 下一首
*/
@Override
public 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();
}
}
/**
* 对蓝牙 上一首
*/
@Override
public 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:蓝牙对接的一些思路感谢一些博主:
断开蓝牙暂停播放
线控耳机播放/上一曲/下一曲