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

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

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:蓝牙对接的一些思路感谢一些博主:
断开蓝牙暂停播放
线控耳机播放/上一曲/下一曲

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值