博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android连接蓝牙耳机播放音乐
阅读量:5776 次
发布时间:2019-06-18

本文共 12412 字,大约阅读时间需要 41 分钟。

参考:

具体实现:

private static final String TAG = "BluetoothA2DPTest";    private BroadcastReceiver mBroadcastReceiver;    private BluetoothA2dp mBluetoothA2dp;    private BluetoothAdapter mBluetoothAdapter;    private String DEVICE_NAME = "KUWO_K1";    private BluetoothDevice mBluetoothDevice;    private MediaPlayer mMediaPlayer;    private void initParameters(){        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();        if(mBluetoothAdapter == null){            Log.e(TAG,"have no bluetooth adapter.");            return;        }        if(!mBluetoothAdapter.isEnabled()){            mBluetoothAdapter.enable();        }else{            //开始搜索附近蓝牙            startDiscovery();            //绑定BluetoothA2DP,获得service            getBluetoothA2DP();        }        //监听广播        mBroadcastReceiver = new BroadcastReceiver() {            @Override            public void onReceive(Context context, Intent intent) {                BluetoothDevice device;                switch (intent.getAction()) {                    case BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED:                        //
switch (intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, -1)) { case BluetoothA2dp.STATE_CONNECTING: device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); Log.i(TAG, "device: " + device.getName() +" connecting"); break; case BluetoothA2dp.STATE_CONNECTED: device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); Log.i(TAG, "device: " + device.getName() +" connected"); //连接成功,开始播放 startPlay(); break; case BluetoothA2dp.STATE_DISCONNECTING: device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); Log.i(TAG, "device: " + device.getName() +" disconnecting"); break; case BluetoothA2dp.STATE_DISCONNECTED: device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); Log.i(TAG, "device: " + device.getName() +" disconnected");// setResultPASS(); break; default: break; } //
break; case BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED: //
int state = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, -1); switch (state) { case BluetoothA2dp.STATE_PLAYING: Log.i(TAG, "state: playing."); break; case BluetoothA2dp.STATE_NOT_PLAYING: Log.i(TAG, "state: not playing"); break; default: Log.i(TAG, "state: unkown"); break; } //
break; case BluetoothDevice.ACTION_FOUND: //
device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); int deviceClassType = device.getBluetoothClass().getDeviceClass(); //找到指定的蓝牙设备 if ((deviceClassType == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET || deviceClassType == BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES) && device.getName().equals(DEVICE_NAME)) { Log.i(TAG, "Found device:" + device.getName()); mBluetoothDevice = device; //start bond,开始配对 createBond(); } //
break; case BluetoothDevice.ACTION_BOND_STATE_CHANGED: //
int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,BluetoothDevice.BOND_NONE); device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); switch (bondState){ case BluetoothDevice.BOND_BONDED: //配对成功 Log.i(TAG,"Device:"+device.getName()+" bonded."); mBluetoothAdapter.cancelDiscovery(); //取消搜索 connect(); //连接蓝牙设备 break; case BluetoothDevice.BOND_BONDING: Log.i(TAG,"Device:"+device.getName()+" bonding."); break; case BluetoothDevice.BOND_NONE: Log.i(TAG,"Device:"+device.getName()+" not bonded."); //不知道是蓝牙耳机的关系还是什么原因,经常配对不成功 //配对不成功的话,重新尝试配对 createBond(); break; default: break; } //
break; case BluetoothAdapter.ACTION_STATE_CHANGED: //
state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1); switch (state) { case BluetoothAdapter.STATE_TURNING_ON: Log.i(TAG, "BluetoothAdapter is turning on."); break; case BluetoothAdapter.STATE_ON: Log.i(TAG, "BluetoothAdapter is on."); //蓝牙已打开,开始搜索并连接service startDiscovery(); getBluetoothA2DP(); break; case BluetoothAdapter.STATE_TURNING_OFF: Log.i(TAG, "BluetoothAdapter is turning off."); break; case BluetoothAdapter.STATE_OFF: Log.i(TAG, "BluetoothAdapter is off."); break; } //
break; default: break; } } }; IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED); filter.addAction(BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED); filter.addAction(BluetoothDevice.ACTION_FOUND); filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); registerReceiver(mBroadcastReceiver, filter); }private void startDiscovery(){ Log.i(TAG,"mBluetoothAdapter startDiscovery."); if(mBluetoothAdapter!=null && mBluetoothAdapter.isEnabled() && !mBluetoothAdapter.isDiscovering()){ mBluetoothAdapter.startDiscovery(); } } private void getBluetoothA2DP(){ Log.i(TAG,"getBluetoothA2DP"); if(mBluetoothAdapter == null){ return; } if(mBluetoothA2dp != null){ return; } mBluetoothAdapter.getProfileProxy(this, new BluetoothProfile.ServiceListener() { @Override public void onServiceConnected(int profile, BluetoothProfile proxy) { if(profile == BluetoothProfile.A2DP){ //Service连接成功,获得BluetoothA2DP mBluetoothA2dp = (BluetoothA2dp)proxy; } } @Override public void onServiceDisconnected(int profile) { } },BluetoothProfile.A2DP); } private void createBond() { Log.i(TAG, "createBond"); mBluetoothDevice.createBond(); } //connect和disconnect都是hide方法,普通应用只能通过反射机制来调用该方法 private void connect(){ Log.i(TAG,"connect"); if(mBluetoothA2dp == null){ return; } if(mBluetoothDevice == null){ return; } try { Method connect = mBluetoothA2dp.getClass().getDeclaredMethod("connect", BluetoothDevice.class); connect.setAccessible(true); connect.invoke(mBluetoothA2dp,mBluetoothDevice); } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { Log.e(TAG,"connect exception:"+e); e.printStackTrace(); } } private void startPlay(){ Log.i(TAG, "startPlay"); AudioManager mAudioManager= (AudioManager)getSystemService(AUDIO_SERVICE); if(mAudioManager!=null){ int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC,maxVolume,0); } Uri uri = Uri.parse("android.resource://"+getPackageName()+"/"+ R.raw.speaker_test); mMediaPlayer = new MediaPlayer(); mMediaPlayer.reset(); try { mMediaPlayer.setDataSource(this,uri); mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { //播放完成,可以考虑断开连接 disconnect(); } }); mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Log.e(TAG, "Playback error."); return false; } }); mMediaPlayer.prepare(); mMediaPlayer.start(); } catch(IllegalStateException|IOException e) { Log.e(TAG, "Exception: prepare or start mediaplayer"); setResultFAIL(); } } //程序退出前,要release播放器 private void stopPlay(){ Log.i(TAG,"stopPlay"); if(mMediaPlayer!=null){ mMediaPlayer.stop(); mMediaPlayer.release(); mMediaPlayer = null; } } private void disconnect(){ Log.i(TAG,"disconnect"); if(mBluetoothA2dp == null){ return; } if(mBluetoothDevice == null){ return; } try { Method disconnect = mBluetoothA2dp.getClass().getDeclaredMethod("disconnect", BluetoothDevice.class); disconnect.setAccessible(true); disconnect.invoke(mBluetoothA2dp,mBluetoothDevice); } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { Log.e(TAG,"connect exception:"+e); e.printStackTrace(); } } //取消配对 private void unPairAllDevices(){ Log.i(TAG,"unPairAllDevices"); for(BluetoothDevice device:mBluetoothAdapter.getBondedDevices()){ try { Method removeBond = device.getClass().getDeclaredMethod("removeBond"); removeBond.invoke(device); } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { e.printStackTrace(); } } } //注意,在程序退出之前(OnDestroy),需要断开蓝牙相关的Service //否则,程序会报异常:service leaks private void disableAdapter(){ Log.i(TAG,"disableAdapter"); if(mBluetoothAdapter == null){ return; } if(mBluetoothAdapter.isDiscovering()){ mBluetoothAdapter.cancelDiscovery(); } //关闭ProfileProxy,也就是断开service连接 mBluetoothAdapter.closeProfileProxy(BluetoothProfile.A2DP,mBluetoothA2dp); if(mBluetoothAdapter.isEnabled()){ boolean ret = mBluetoothAdapter.disable(); Log.i(TAG,"disable adapter:"+ret); } }

 

转载于:https://www.cnblogs.com/tt2015-sz/p/5616607.html

你可能感兴趣的文章
卡特兰数
查看>>
006_mac osx 应用跨屏幕
查看>>
nginx中配置文件的讲解
查看>>
MindNode使用
查看>>
HTTP库Axios
查看>>
CentOS7下安装python-pip
查看>>
左手坐标系和右手坐标系 ZZ
查看>>
陀螺仪主要性能指标
查看>>
Linux 目录结构和常用命令
查看>>
Linux内存管理之mmap详解 (可用于android底层内存调试)
查看>>
Android开发中ViewStub的应用方法
查看>>
gen already exists but is not a source folder. Convert to a source folder or rename it 的解决办法...
查看>>
遍历Map的四种方法
查看>>
Altium Designer 小记
查看>>
赵雅智:js知识点汇总
查看>>
20个Linux服务器性能调优技巧
查看>>
填坑记:Uncaught RangeError: Maximum call stack size exceeded
查看>>
SpringCloud之消息总线(Spring Cloud Bus)(八)
查看>>
DLA实现跨地域、跨实例的多AnalyticDB读写访问
查看>>
实时编辑
查看>>