Android实现蓝牙耳机连接 矫情吗;* 2022-05-12 08:26 563阅读 0赞 > 代码地址如下: > [http://www.demodashi.com/demo/13259.html][http_www.demodashi.com_demo_13259.html] ### 前言 ### 讲讲android对于蓝牙耳机连接技术的实现 今天涉及的内容有: 1. 流程讲解 2. 新建广播BluetoothReceiver,用于监听处理蓝牙连接过程中各状态 3. 在MainActivity中调用 4. 注意的点 5. 项目结构图和效果图 下面做以讲解 #### 一. 流程讲解 #### 在实现蓝牙耳机链接的时候,需要做一些前期工作,第一步,判断设备是否支持蓝牙。 ##### 1.1 设备是否支持蓝牙 ##### /**设备是否支持蓝牙**/ public boolean isSupportBluetooth() { mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter != null) { return true; } return false; } 若支持蓝牙,则需要判断设备蓝牙是否打开 ##### 1.2 设备蓝牙是否开启 ##### /**蓝牙是否已经启动**/ public boolean isBluetoothOpen() { if (mBluetoothAdapter != null) { return mBluetoothAdapter.isEnabled(); } return false; } 如果蓝牙没有开启,则需要请求开启蓝牙 ##### 1.3 请求开启蓝牙 ##### /**请求启动蓝牙**/ public void requestStartBluetooth(int requestCode,Context context) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); ((MainActivity)context).startActivityForResult(enableBtIntent, requestCode); } 当然,蓝牙还有一个强制开启的方法: /**强制打开蓝牙**/ public void openBluetooth(){ if(isSupportBluetooth()){ mBluetoothAdapter.enable(); } } 蓝牙开启后,接下来是查询已配对过的设备 ##### 1.3 获取配对过的设备列表 ##### /**查询配对设备**/ public List<BluetoothDevice> checkDevices() { List<BluetoothDevice> devices=new ArrayList<>(); if(mBluetoothAdapter!=null){ Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); if (pairedDevices != null && pairedDevices.size() > 0) { for (BluetoothDevice device : pairedDevices) { devices.add(device); } } } return devices; } 若已配对列表中没有你的蓝牙耳机设备,则需要搜索 ##### 1.4 搜索新设备 ##### /**发现新设备**/ public void findBluetoothDevice() { //其实是启动了一个异步线程,该方法将立即返回一个布尔值,指示发现是否已成功启动。 // 发现过程通常涉及大约12秒的查询扫描,随后是每个找到的设备的页面扫描以检索其蓝牙名称 if(mBluetoothAdapter!=null && mBluetoothAdapter.isEnabled() && !mBluetoothAdapter.isDiscovering()){ if (mBluetoothAdapter.startDiscovery()) { LogUtil.i("=======已成功启动寻找新设备的异步线程======="); } else { LogUtil.i("=======启动寻找新设备的异步线程失败======="); } } } 然后便是进行蓝牙耳机的配对,连接。 以上基本的蓝牙方法,我已经封装到BluetoothManager类中。 在蓝牙耳机的搜索,配对,连接等过程中,我们需要新建一个广播,对各个过程做一个监听。 #### 二. 新建广播BluetoothReceiver,用于监听处理蓝牙连接过程中各状态 #### 下面给出BluetoothReceiver中主要代码: @Override public void onReceive(Context context, Intent intent){ LogUtil.i("=========蓝牙接收处理广播========"+intent.getAction()); 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); LogUtil.i("device: " + device.getName() +" connecting"); break; case BluetoothA2dp.STATE_CONNECTED: device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); LogUtil.i("device: " + device.getName() +" connected"); mOnBluetoothListener.deviceConnected(device); break; case BluetoothA2dp.STATE_DISCONNECTING: device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); LogUtil.i("device: " + device.getName() +" disconnecting"); break; case BluetoothA2dp.STATE_DISCONNECTED: device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); LogUtil.i("device: " + device.getName() +" disconnected"); break; default: break; } break; case BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED: int state = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, -1); switch (state) { case BluetoothA2dp.STATE_PLAYING: LogUtil.i("state: playing."); break; case BluetoothA2dp.STATE_NOT_PLAYING: LogUtil.i("state: not playing"); break; default: LogUtil.i("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) { LogUtil.i("Found device:" + device.getName()+" address:"+device.getAddress()); if(StringUtil.isNotEmpty(device.getName())){ //添加到设备列表 mOnBluetoothListener.deviceFound(device); } }else{//找到可用蓝牙 if(StringUtil.isNotEmpty(device.getName())){ LogUtil.i("=====Found device====11===" + device.getName()+" address:"+device.getAddress()); //添加到设备列表 mOnBluetoothListener.deviceFound(device); } } 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: //配对成功 LogUtil.i("Device:"+device.getName()+" bonded."); //取消搜索,连接蓝牙设备 mOnBluetoothListener.deviceBonded(device); break; case BluetoothDevice.BOND_BONDING: LogUtil.i("Device:"+device.getName()+" bonding."); break; case BluetoothDevice.BOND_NONE: LogUtil.i("Device:"+device.getName()+" not bonded."); //不知道是蓝牙耳机的关系还是什么原因,经常配对不成功 //配对不成功的话,重新尝试配对 mOnBluetoothListener.deviceBondNone(device); break; default: break; } break; case BluetoothAdapter.ACTION_STATE_CHANGED: state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1); switch (state) { case BluetoothAdapter.STATE_TURNING_ON: LogUtil.i("BluetoothAdapter is turning on."); break; case BluetoothAdapter.STATE_ON: LogUtil.i("BluetoothAdapter is on."); // //蓝牙已打开,开始搜索并连接service // findBluetoothDevice(); // getBluetoothA2DP(); mOnBluetoothListener.blootoothStateOn(); break; case BluetoothAdapter.STATE_TURNING_OFF: LogUtil.i("BluetoothAdapter is turning off."); break; case BluetoothAdapter.STATE_OFF: LogUtil.i("BluetoothAdapter is off."); break; } break; default: break; } } #### 三. 在MainActivity中调用 #### #### 3.1 初始化时注册广播,扫描设备列表 #### //注册广播 registerReceiver(); //初始化设备列表 initDeviceList(); //发现新设备 findDevices(); 其中registerReceiver方法为: /**注册广播**/ private void registerReceiver(){ mBluetoothReceiver=new BluetoothReceiver(); IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 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); mContext.registerReceiver(mBluetoothReceiver, filter); } findDevices方法为: /**发现新设备**/ private void findDevices(){ if(BluetoothManager.getInstance().isSupportBluetooth()&&BluetoothManager.getInstance().isBluetoothOpen()){ //强制打开蓝牙 BluetoothManager.getInstance().openBluetooth(); List<BluetoothDevice>list=BluetoothManager.getInstance().checkDevices(); LogUtil.i("====list=====list=="+list.size()); Iterator<BluetoothDevice> it = list.iterator(); while (it.hasNext()) { BluetoothDevice device = it.next(); if (device != null&& StringUtil.isEmpty(device.getName())) { it.remove(); } } mDevices.addAll(list); myAdapter.notifyDataSetChanged(); } } #### 3.2 点击设备列表去连接蓝牙耳机或者开启蓝牙扫描 #### myAdapter.setOnRecyclerItemClickListener(new MyAdapter.OnRecyclerItemClickListener() { @Override public void onRecyclerClick(View view, int position) { BluetoothDevice device= mDevices.get(position); if(!BluetoothManager.getInstance().isSupportBluetooth()){ ToastUtil.showShortToast(mContext,"本设备不支持蓝牙"); return; } if(!BluetoothManager.getInstance().isBluetoothOpen()){ //去启动蓝牙 BluetoothManager.getInstance().requestStartBluetooth(REQUEST_ENABLE_BT,mContext); }else{ LogUtil.i("====开始配对======="); //绑定BluetoothA2DP,获得service BluetoothManager.getInstance().getBluetoothA2DP(mContext); //开始配对 BluetoothManager.getInstance().createBond(device); } } }); #### 3.3 关闭资源 #### 退出app的时候需要关闭蓝牙耳机连接 //注销蓝牙链接 BluetoothManager.getInstance().disableAdapter(); 注销广播 //注销广播 if(mBluetoothReceiver!=null){ mContext.unregisterReceiver(mBluetoothReceiver); } 当然,你还可以考虑是否需要关闭蓝牙 //关闭蓝牙 BluetoothManager.getInstance().closeBluetooth(); #### 四. 注意的点 #### 蓝牙耳机的连接需要蓝牙权限,所以你得在你的mainfast.xml中以下权限设置: <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> #### 五. 项目结构图和效果图 #### > 项目结构图 ![6aEWsXpPLUg7mUke8Sy.png][] > 运行效果图 ![o6eMLucno0cB3a7Hbc6.gif][] Android实现蓝牙耳机连接 > 代码地址如下: > [http://www.demodashi.com/demo/13259.html][http_www.demodashi.com_demo_13259.html] > > 注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权 [http_www.demodashi.com_demo_13259.html]: http://www.demodashi.com/demo/13259.html [6aEWsXpPLUg7mUke8Sy.png]: /images/20220512/184232b009eb4605a1e3a95aee58d1cc.png [o6eMLucno0cB3a7Hbc6.gif]: /images/20220512/48cf9ee3726b45f5bedb501a99364dde.png
相关 百款 TWS蓝牙耳机 蓝牙天线拆机分析与仿真 上一篇:[贴片陶瓷天线原理 与 HFSS模型建立和仿真分析总结][_ HFSS] (原创文章,转载请与作者联系) 0.前言 TWS是英文True Wirele 野性酷女/ 2023年05月22日 05:59/ 0 赞/ 60 阅读
相关 炬力蓝牙芯片_蓝牙耳机方案商和具体BOM成本结构 ![d4fce6dbde817f1896a5f4401e12749c.png][] ![16a4182ae5ab45460c054366accaa94e.png][] 自苹 布满荆棘的人生/ 2023年01月07日 14:24/ 0 赞/ 133 阅读
相关 实现链接蓝牙耳机_我,从未见过,如此超长续航的蓝牙耳机 蓝牙耳机,我想大家都接触过,具体实现方式在这里就不用多做介绍了。蓝牙耳机有多少类型呢?其实这个问题可以根据佩戴方式区分,比如头戴式,入耳式,颈挂式,双耳独立式和骨传导式,耳塞式 叁歲伎倆/ 2023年01月07日 02:30/ 0 赞/ 187 阅读
相关 魅族EP51蓝牙耳机拆解 魅族EP51蓝牙运动耳机 上市年份:2016年。 官方发布价格:269元。 音质在同价位中算可以,但是长时间佩戴耳朵不大舒服。 <table> <thead 待我称王封你为后i/ 2022年12月10日 06:00/ 0 赞/ 304 阅读
相关 android 连接已配对蓝牙耳机,连接/配对蓝牙耳机和Android 我想创建一个简单的程序,扫描蓝牙耳机(我正在测试一个PS3耳机),然后连接到它。我正在使用bluetooth chat program example中的代码。但是我无法将它连 港控/mmm°/ 2022年10月16日 07:41/ 0 赞/ 232 阅读
相关 Android实现蓝牙耳机连接 > 代码地址如下: > [http://www.demodashi.com/demo/13259.html][http_www.demodashi.com_demo_132 矫情吗;*/ 2022年05月12日 08:26/ 0 赞/ 564 阅读
相关 Android 实现蓝牙录音 \Android 实现蓝牙录音 本文实现使用AudioRecord 来进行蓝牙录音。 主要是通过打开蓝牙SCO通路实现。 这里不考虑连接蓝牙问题,要确保蓝牙连接成功。 客官°小女子只卖身不卖艺/ 2022年04月25日 03:02/ 0 赞/ 1038 阅读
相关 Android蓝牙A2DP连接实现 > 代码地址如下: > [http://www.demodashi.com/demo/14624.html][http_www.demodashi.com_demo_146 我不是女神ヾ/ 2022年03月10日 08:49/ 0 赞/ 524 阅读
相关 降噪蓝牙耳机_降噪耳机如何工作? ![降噪蓝牙耳机][00a59c710c81fa4170d70efbeb4e1861.png] 降噪蓝牙耳机 ![banner][] Passive noise redu ゝ一世哀愁。/ 2021年07月26日 16:47/ 0 赞/ 535 阅读
还没有评论,来说两句吧...