Android Bluetooth

Android 蓝牙启动流程(以及设置蓝牙为作为sink模式 & 接收端模式)

时光毁灭记忆、已成空白 提交于 2020-09-30 14:32:55
本文以Android 7.1为基础 最近在做蓝牙开发,研究了一下蓝牙的启动流程,总结一下 Google在Android源码中推出了它和博通公司一起开发的BlueDroid以替代BlueZ。BlueZ的创始者,高通公司也将在基于其芯片的Android参考设计中去除BlueZ,支持BlueDroid。相比BlueZ,BlueDroid最值得称道的地方就是其框架结构变得更为简洁和清晰。对我们工程师来说这也是个不错的福利,清晰、简洁的架构使我们在debug过程中思路更清晰; 蓝牙的总体流程图 从流程图我们可以看出来 蓝牙应用通过binder和系统蓝牙Service进行通讯 ,然后通过Jin与蓝牙HAL层进行通讯. 按层级划分 Bluetooth Service(Java层)代码路径 frameworks/base/core/java/Android/Bluetooth: Bluetooth 应用层代码路径 packages/apps/Bluetooth Bluetooth协议层代码 system/bt/ 涉及的总共路径: frameworks/base/core/java/android/bluetooth/BluetoothAdapter.java frameworks/base/core/java/android/bluetooth/BluetoothManagerService

Android中连接蓝牙设备时遇到createRfcommSocketToServiceRecord的UUID问题和BluetoothSocket的connect失败

瘦欲@ 提交于 2020-05-09 15:57:23
【问题】 折腾: 【记录】编写Android中的蓝牙模块驱动和底层HART设备 期间,参考: Bluetooth | Android Developers – ManagingAConnection 参考“Connecting as a client”中的: tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 遇到UUID不懂的问题。 然后随便去 http://www.guidgenerator.com/online-guid-generator.aspx 弄了个UUID: e214d9ae-c3ba-4e25-abb5-299041353bc3 结果运行到: try { // Connect the device through the socket. This will block // until it succeeds or throws an exception mmSocket.connect(); } catch (IOException connectException) { // Unable to connect; close the socket and get out try { mmSocket.close(); } catch (IOException closeException) { }

android bluetooth——蓝牙的开启、搜索、配对与连接

假如想象 提交于 2020-04-11 18:01:21
android 的blt仅仅支持api 18 android4.3以上,有的功能甚至需要api 19 android4.4; 所以我们在做blt项目之前一定要清楚可用的版本范围。 我要讲述的是打开blt大门的操作。这些操作就是如何打开blt、如何搜索到其他设备、如何配对选中设备、如何通过mac地址连接之前已经配对过的设备以及连接成功的两个(或一对多个)设备如何通讯。 在学习blt知识前要先搞清楚,blt是如何让两个设备之间通讯的。我们先来看一下基本步骤: 1,打开blt。 ——1)权限 ——2)监听设备是否打开blt ——3)操作,打开或者关闭blt 2,搜索附近设备&让附近设备搜索到 ——1)让自身设备可以被附近搜索到,时间最长300s;(随着api的逐渐升级可能不止300s,做了一定的优化处理) ——2)搜索附近可连接的设备;过时的api在接口中回调搜索结果,新的api则要求用广播接收搜索结果。(我们这里使用广播接收结果) 3,与目标设备配对 ——1)对于目标设备进行配对,android系统本身会完成配对动作,并且将已经成功配对的设备的mac地址保存起来,以供下次进行自动配对使用。 ——2)对进行配对过的设备自动配对。这个动作也是系统帮我们完成的,我们只需要根据系统给我们的状态来判断这个是否已经配对就行了。 4,与成功配对的设备进行连接 ——1)如果要对成功配对的设备进行连接

Android蓝牙开发【七】hfp音频连接

只愿长相守 提交于 2019-12-07 04:08:11
接着上一篇hfp连接继续,查看蓝牙通话时如何进行处理的。hfp连接有两个连接,一个是hfp连接(在设置界面显示的是手机音频),另一个是蓝牙通话时进行的音频连接。这篇说下第二个连接,音频连接处理过程。 该文章是基于Android源码4.3的 1 连接音频 在手机音频正常连接时,接通电话,并选择蓝牙通话。从系统应用Phone开始分析。 代码路径:packages/apps/Phone/src/com/Android/phone/InCallScreen.Java 手机通话可以选择扬声器、听筒、蓝牙,我们选择蓝牙。 public void switchInCallAudio(InCallAudioMode newMode) { switch (newMode) { case SPEAKER: break; //扬声器 case BLUETOOTH: //蓝牙 // 检查hfp是否连接着(蓝牙耳机是否连接可用),检查蓝牙耳机的音频是否连接 if (isBluetoothAvailable() && !isBluetoothAudioConnected()) { if (PhoneUtils.isSpeakerOn(this)) { //关闭扬声器 PhoneUtils.turnOnSpeaker(this, false, true); } connectBluetoothAudio();

Android蓝牙开发【六】hfp连接

我的未来我决定 提交于 2019-12-06 14:20:51
HFP (Hands-free Profile),让蓝牙设备(如蓝牙耳机)可以控制电话,如接听、挂断、拒接、语音拨号等,拒接、语音拨号要看蓝牙耳机及电话是否支持。 HFP定义了音频网关(AG)和免提组件(HF)两个角色: 音频网关(AG) – 该设备为音频(特别是手机)的输入/输出网关。 免提组件(HF) – 该设备作为音频网关的远程音频输入/输出机制,并可提供若干遥控功能。 2 手机音频连接 对于手机音频的使用,首先连接的蓝牙设备需要支持hfp协议,并且需要与该设备进行配对,如何进行蓝牙配对这里就不细说了,可以参照我的其他文章。主要分析下其连接过程。 对于系统自带应用Settings中已配对的蓝牙设备界面(如下图所示), 其对应文件路径: packages/apps/Settings/src/com/android/settings/bluetooth/DeviceProfilesSettings.java 点击手机音频进行连接,调用onPreferenceChange。 public boolean onPreferenceChange(Preference preference, Object newValue) { if (preference == mDeviceNamePref) { //重命名 mCachedDevice.setName((String)

Android蓝牙开发【八】hfp接听、挂断电话

痞子三分冷 提交于 2019-12-05 19:56:52
继续研究hfp相关功能。蓝牙耳机可以控制手机接听、拒接、挂断电话,拨打电话等功能。本文主要分析下起这些操作的大致流程。 在系统应用Bluetooth中com_android_bluetooth.cpp提供了多个回调方法,由hardware、协议栈回调过来。蓝牙耳机的一些控制命令都会发到这里。 本文基于Android4.3源码。 1 接通电话 蓝牙耳机控制手机接通电话,回掉com_android_bluetooth.cpp中的answer_call_callback()函数,该函数主要操作是调用HeadsetStateMachine的onAnswerCall()函数,代码如下: 在onAnswerCall()中发送消息(消息类型STACK_EVENT,StackEvent事件类型EVENT_TYPE_ANSWER_CALL)向状体机,此时通话尚未接通,audio没有连接,所以此时处于Connected状态。状态机收到该消息后调用processAnswerCall()函数。processAnswerCall()代码如下: private void processAnswerCall() { if (mPhoneProxy != null) { try { //mPhoneProxy是通过bindservice 获取的。 mPhoneProxy.answerCall(); } catch