一, 概述
本次分析是基于 Android7.0 的源码.
二, 自动配对分析过程
首先, 我们分析一下源码的自动配对过程, packages/apps/Settings/src/com/Android/settings/bluetooth/DeviceListPreferenceFragment.java
当我们在手机的设置中点击配对某个设备后做了如下事情:
然后我们查看 btPreference(BluetoothDevicePreference.java) 的 onClicked() 方法, 在同目录下 BluetoothDevicePreference.java 中
mCachedDevice 是 CachedBluetoothDevice.java 的实例, 它的位置在: frameworks/base/packages/SettingsLib/src/com/Android/settingslib/bluetooth/CachedBluetoothDevice.java
最终, 执行了蓝牙设备的 createBond() 方法, 所以进行自动配对的思路形成.
1) 注册监听 BluetoothDevice.ACTION_FOUND 广播;
2) 调用 bluetoothAdapter.startDiscovery() 方法搜索附近的蓝牙设备;
3) 当收到广播后, 执行 intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) 方法获取蓝牙设备实例, 筛选出需要配对的设备, 然后通过反射调用 BluetoothDevice 的 createBond() 方法;
三, 隐藏对话框分析过程
既然要隐藏对话框, 那么我们研究一下对话框何时弹出? 以及弹出后确认配对做了什么? 通过查看源码发现: package/apps/Settings/src/com/Android/settings/bluetooth/BluetoothPairingRequest.java
我们可以看到在这个类中, 通过注册监听 BluetoothDevice.ACTION_PAIRING_REQUEST 广播, 当接收到该广播后启动对话框. 然后我们在查看一下 BluetoothPairingDialog 类中做了什么? 在同目录下的的 BluetoothPairingDialog.java 类中:
可以看到, 点击确认后, 调用 onPair() 方法.
之后执行了 mDevice.setPairingConfirmation(true), 这个方法我们可以通过获得的蓝牙设备实例进行反射调用.
所以, 我们的思路就形成了:
1) 注册监听 BluetoothDevice.ACTION_PAIRING_REQUEST 广播, 设置高的优先级, 接收到广播后执行 abortBroadcast() 方法, 防止广播的继续传播;
2) 接收到广播后, 执行 intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) 方法获取蓝牙设备实例, 然后通过反射调用 BluetoothDevice 的 setPairingConfirmation(true);
四, 遇到的问题
1) 关于 setPairingConfirmation(true) 方法.
我们查看一下这个方法的源码 frameworks/base/core/Android/bluetooth/bluetoothDevice.java
此方法需要 BLUETOOTH_PRIVILEGED 权限, 但是这个权限是系统级应用才有的, 所以我们需要对应用进行系统签名, 做成系统应用.
到此, 蓝牙自动配对与隐藏对话框的分析结束.
来源: https://www.cnblogs.com/doubleWin/p/10330686.html