Android蓝牙-设备类型之getMajorDeviceClass

news/2025/2/19 8:47:45/

做蓝牙framework已经一年多了,前段时间不太忙,自己做了一个蓝牙demo,遇到坑也不少,在这里记录一下,以便以后碰到能迅速查阅
设备连接的时候需要通过设备的类型来创建不同的profile:
int deviceType = device.getBluetoothClass().getMajorDeviceClass();
下面来一步步分析底层是怎么得到这个deviceType

先看device.getBluetoothClass(),
找到framework/base/core/java/android/bluetooth/BluetoothDevice.java

图一
这个方法返回一个BluetoothClass
找到 framework/base/core/java/android/Bluetooth/BluetoothClass.java

图二
返回了一个mClass&Device.Major.BITMASK
接下来先看Device.Major.BITMASK是哪里来的,都是些设备类型computer,phone …,感兴趣可以看看下面还有具体的类型computer,phone等都又做了细分,都是16进制的数

图三
接下来找mClass是从哪里来的
图四
很明显是构造方法传过来的,回头上去看第一个图,从new BluetoothClass(classInt) 传过来的,
Int classInt = sService.getRemoteClass(this)而classInt是从sService.getRemoteClass(this),
接下来找到sService是谁,是AdapterService,怎么来的特别复杂,涉及到跨进程,
可以专门写一篇来解释,如果有空的话,
下面打开
package/apps/Bluetooth/src/com/android/Bluetooth/btservice/AdapterService.java
图五
Return service.getRemoteClass(device),这个service就是它自己,继续看
图六
又出来一个DeviceProperties,从RemoteDevices里get来的,接着打开
package/apps/Bluetooth/src/com/android/Bluetooth/btservice/RemoteDevices.java

图七
图八
DeviceProperties是通过device的address从集合里面取的,而上上上张图片上RemoteClass
是通过deviceProperties.getBluetoothClass()来的,下面看看DeviceProperties里面都有啥

图九
可以看到getBluetoothClass返回了一个mBluetoothClass,继续追寻,这个mBluetoothClass是在什么地方赋值的

图10
由于这个方法特别长,只截取一部分,方法名为devicePropertyChangedCallback(),
此方法是底层扫描到设备同过jni回调上来的,只要扫描到设备,底层会回调2个方法,devicePropertyChangedCallback()和deviceFoundCallback(),以下是方法的截图,

图11
图12
从deviceFoundCallback()方法可以看出,framework收到底层驱动的回调就会发送一个
ACTION_FOUND广播,携带着扫描到的设备的信息,而devicePropertyChangedCallback()中将底层返回来的设备信息解析存入DeviceProperties供调用,以下是扫描到单个设备后的打印信息

图13
可以看出扫描到设备,先调用的是devicePropertyChangedCallback,将设备信息解析储存,然后调用的
deviceFoundCallback将携带设备信息的广播发出去

经过测试OPPO R11s的MajorDeviceClass是512,电脑的是256,
从上面的截图上看Phone和computer分别是0x0200和0x0100,他们&上Device.Major.BITMASK的
0x1f00 ,转换成10进制,正好是512和256


http://www.ppmy.cn/news/859059.html

相关文章

根据userAgent获取浏览器/操作系统/设备类型等信息

文章目录 根据userAgent获取浏览器/操作系统/设备类型等信息一、背景二、效果展示Android:userAgent解析出来的信息ios:userAgent解析出来的信息windows:userAgent解析出来的信息 三、准备工具3.1 导入UserAgentUtils 到pom.xml 四、解析出us…

h5中移动设备类型的判断

在下载app的时候,往往IOS端和安卓端的下载地址链接是不一样的,这个时候就需要判断当前设备是IOS还是安卓: downLoad() { var u navigator.userAgent; var isAndroid u. indexOf( "Android") > - 1 || u. indexOf( "Adr") > …

Zigbee设备类型选择

1)设备类型选择: 在IAR编译器由f8wCoord.cfg(f8wRouter.cfg、f8wdevice.cfg) 2)组网方式: 在nwk_global.h中的NWK_MODE定义。 有三种网络: #define NWK_MODE_STAR 0 #define NWK_M…

Android 获取蓝牙设备类型

之前我们分析了如何获取已连接的蓝牙设备地址 http://blog.csdn.net/jasonwang18/article/details/61214431 本篇我们分析如何获取对应蓝牙设备的类型,这个类型和profile不是同一个东西,而是具体蓝牙的设备类型,比如手机、电脑、手柄、蓝牙…

USB设备类型汇总

USB设备类型汇总 Mr_Michael 0.1792020.07.29 16:44:47字数 1,859阅读 7,494 参考:usb wiki、USB 一、USB概述 1.USB 版本 2.USB 接口 [站外图片上传中...(image-2f523-1596012258374)] 3.USB Class Codes ​ USB定义了设备类的类别码信息,它的功能…

java判断访问设备类型

目的:用java判断当前请求设备的类型(pc、手机、平板) 业务类型:例如在电商系统中,用户买商品下单时,平台需要判断该订单是从那个类型的设备中来的,以便后变得统计工作。 实现方法: import jav…

Android 扫描蓝牙设备并获取设备类型

目前流行的蓝牙4.0标准包括传统的蓝牙(BT)和低功耗蓝牙模块(BLE)。 这里扫描的是传统蓝牙模块,先给出扫描结果: 一,扫描 Android扫描蓝牙设备是通过BluetoothAdapter启动蓝牙搜索,然后通过广播接收扫描的结果,其主…

如何判断蓝牙设备类型

我们在开发Android的蓝牙应用时,可能需要知道扫描到的蓝牙设备是什么类型,然后过滤掉不符合要求的设备,只保留符合要求的设备,例如我们在车载系统上开发蓝牙电话应用时,我们希望只显示手机蓝牙设备,那么如何…