一、概述

本次分析是基于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权限,但是这个权限是系统级应用才有的,所以我们需要对应用进行系统签名,做成系统应用。

到此,蓝牙自动配对与隐藏对话框的分析结束。

Android-蓝牙自动配对与隐藏对话框的更多相关文章

  1. Android蓝牙自动配对Demo,亲测好使!!!

    蓝牙自动配对,即搜索到其它蓝牙设备之后直接进行配对,不需要弹出配对确认框或者密钥输入框. 转载请注明出处http://blog.csdn.net/qq_25827845/article/details ...

  2. Android蓝牙自动配对Demo,亲测好使!!!(转)

    蓝牙自动配对,即搜索到其它蓝牙设备之后直接进行配对,不需要弹出配对确认框或者密钥输入框. 转载请注明出处http://blog.csdn.net/qq_25827845/article/details ...

  3. android 实现蓝牙自动配对连接

    BluetoothConnectActivityReceiver.java:监听蓝牙配对的广播 代码: package com.imte.Broadcast; import com.imte.util ...

  4. Android 蓝牙开发之搜索、配对、连接、通信大全

            蓝牙( Bluetooth®):是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据 交换(使用2.4-2.485GHz的ISM波段的UHF无线电波).蓝牙设备最 ...

  5. Android 蓝牙 BLE 开发笔记

    最近公司头戴换了一块蓝牙4.0 BLE模块,所以我们Android组要适配 BLE.Android BLE 需要 4.3 以上系统,api 还是非常简单的, 第一步就是扫描, 扫描到设备后就可以连接了 ...

  6. 如何实现android蓝牙开发 自动配对连接,并不弹出提示框

    之前做一个android版的蓝牙 与血压计通讯的项目,遇到最大的难题就是自动配对. 上网查资料说是用反射createBond()和setPin(),但测试时进行配对还是会出现提示,但配对是成功了 我就 ...

  7. audio与video控件/标签的隐藏,iso/Android下自动全屏播放,短暂黑屏问题

    (一)audio音频标签 <audio src="xxx.mp3"></audio> (二)video视频标签 <video src="xx ...

  8. Android蓝牙学习笔记

    一 Bluetooth基本概念 蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备.计算机及其终端设备.各种数字数据系统.甚至家用电器采用无线方式联接起来.它的传输距离为10cm-10m,如果增加 ...

  9. Android蓝牙

    代码地址如下:http://www.demodashi.com/demo/12772.html 前言:最近,新换了一家公司,公司的软件需要通过蓝牙与硬件进行通讯,于是趁此机会将Android蓝牙详细的 ...

随机推荐

  1. WebWorker 简单使用方式

    WebWorker 一定程度上可以算得上是浏览器中的多线程技术了,在项目中适当使用 Worker 来做一些耗时的操作能大大提高页面整体流畅度. Worker的使用也是非常简单的,通过向 Worker ...

  2. 学习 JavaScript (八) 引用类型之 Object

    在JavaScript中,引用类型是一种数据结构.包括对象(Obejct).数组(Array).日期(Date).正则表达式(RegExp).函数(Function).基本包装类型(new Boole ...

  3. 微信小游戏爆款秘笈 数据库MongoDB攻略篇

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB 发表于云+社区专栏 随着微信小游戏的爆发,越来越多开发者关注到MongoDB与小游戏业务的契合度. ...

  4. C#编写扫雷游戏

    翻看了下以前大学学习的一些小项目,突然发现有个项目比较有意思,觉得有必要把它分享出来.当然现在看来,里面有很多的不足之处,但因博主现在已经工作,没有时间再去优化.这个项目就是利用C#编写一个Windo ...

  5. swagger Failed to load Api definition 的问题

    这个问题是由于Tomcat乱码问题导致的,修改server.xml文件的编码格式修改成UTF-8

  6. css实现发光文字,以及一点点js特效

    效果图: 代码如下: </head> <style> body{ background-color:#000; } .textArea{ font-size:100px; co ...

  7. Android Aop日志

    Android在许多情况下需要知道一些方法的耗时,然后对与这些耗时进行一些处理和优化.当然我们可以在方法的开头和结尾分别来打一行日志来解决这个问题.但是这个方式侵入性强,而且比较难以修改和删除这些日志 ...

  8. bug生命周期&bug跟踪处理

    一.BUG BUG:软件的缺陷 1.BUG的定义:----与软件测试的目的对应 软件的BUG,狭义概念是指软件程序的漏洞或缺陷,广义概念除此之外还包括测试工程师或用户所发现和提出的软件可改进的细节.或 ...

  9. Chrome内核浏览器打开网页报 错误代码: ERR_TIMED_OUT

    升级win10之后如果出现chrome内核的浏览器网页总是打不开 打开很慢  而ie和edge是可以正常访问的 用这个方法可以  我弄了几天终于 搞好了我直接转载过来了近期,工程师收到大量反馈360浏 ...

  10. python 基础语法梳理(二)

    1.gevent使用 # -*- coding: utf-8 -*- import gevent import platform from gevent import subprocess def _ ...