Android 蓝牙电话联系人同步之蓝牙状态检测

Android BluetoothPbap Phone Book Access Profile的简称,电话本访问协议,是一种基于OBEX的上层协议,该协议可以同步手机这些具有电话本功能设备上的通讯录和通话记录等信息。PBAP协议规定两种角色:PSE:Phone Book Server Equipment,拥有电话本源数据的设备,作为服务端,比如手机。PCE:Phone Book Client Equipment,向PSE端请求电话本信息的设备,作为客户端,比如车载蓝牙。 阅读详情

最近做的一个语音项目,要求车机端可以利用蓝牙,语音打电话给手机通讯录里的联系人。

实现这个功能需要将手机端的通讯录上传到语音的远程服务器端,并且SDK要求必须把蓝牙的状态实时上报上去。

上报通讯录其实还是很简单的,只要监听车机端的联系人provider的变化就可以进行读取操作和上报。

mContactObserver = new ContactObserver(new Handler());
Uri uri = ContactsContract.Contacts.CONTENT_URI;
mResolver.registerContentObserver(uri, true, mContactObserver);

难点其实在于如何上报蓝牙的连接状态,这里和电话相关的两个蓝牙协议分别是:

  • Headset: 蓝牙打电话
  • Pbap:联系人同步

所以如果能监听蓝牙的这两个连接状态的变化就可以上报了,但是很不幸的是这两个状态在Android sdk里没有提供相应的显示的广播,这两个广播属于隐藏。如果要想监听,就必须使用“反射”大法了。

翻看源码,先找到这两个广播的定义之处,然后定义它们

 private final static String REFLECTION_HEADSETCLIENT_CLASS =
            "android.bluetooth.BluetoothHeadsetClient";

private final static String REFLECTION_PBAP_CLIENT_CLASS =
            "android.bluetooth.BluetoothPbapClient";

然后就是反射它们,这里我使用了一个反射工具类,自己写的

public String getAttributeValueOfStringType(String classPath, String attribute) {
        String value = "";
        try {
            Class clazz = Class.forName(classPath);
            Field field= clazz.getField(attribute);
            value = (String)field.get(clazz);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return value;
    }

最后就是注册监听这两个蓝牙广播

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ReflectionUtil.getInstance().getAttributeValueOfStringType(
                REFLECTION_HEADSETCLIENT_CLASS,
                REFLECTION_CONSTANT_CONNECTION_CHANGED));
intentFilter.addAction(ReflectionUtil.getInstance().getAttributeValueOfStringType(
                REFLECTION_PBAP_CLIENT_CLASS,
                REFLECTION_CONSTANT_CONNECTION_CHANGED));
mBluetoothReceiver = new BluetoothReceiver();
if (!isRegisterBT) {
            XXApplication.getContext().registerReceiver(mBluetoothReceiver, intentFilter);
            isRegisterBT = true;
}

 

 

Android7.0从蓝牙导入联系人开发的实现 Android7.0 realease版本中已经将framework/opt/bluetooth中的pbap部分移植到package/apps/Bluetooth的蓝牙应用中,所以之前用到framework/opt/bluetooth中pbap部分的代码已经无法正常使用了。但研读代码过程中发现蓝牙应用中已经提供了从蓝牙导入联系人、通话记录的服务。 这里给出调用该服务的简单方法。 一、连接服务 阅读详情

相关推荐

Android蓝牙连接状态监听与实时检测实战指南

本文详细介绍了Android蓝牙连接状态监听与实时检测的实战方法,涵盖广播接收器方案、Profile API使用、反射调用隐藏API等核心技术。针对不同Android版本的兼容性问题提供了解决方案,并分享了音乐播放器等典型场景的应用案例,帮助开发者高效实现蓝牙设备连接状态管理。

weixin_29271053的博客 491

Android9 蓝牙开发学习(5)——BluetoothPbapClient

BluetoothPbapClient 主要实现电话簿下载 电话号码簿访问协议(Phonebook Access Profile) BluetoothPbapClient初始化 // 初始化 BluetoothAdapter.getDefaultAdapter().getProfileProxy(context, mProfileListener, BluetoothProfile.PBAP_CLIENT); //还要实现BluetoothProfile.ServiceListener接口,在onServi

geniushorse的博客 2144

儿童电动牙刷BLE上报刷牙时长至家长App芯片方案详解

蓝牙低功耗(BLE)技术是物联网短距通信的核心方案,其低功耗、快速连接与移动端原生支持,使其成为智能硬件传输状态数据的首选。在智能口腔护理产品中,电动牙刷通过BLE将刷牙时长与频次上报至家长App,形成可追踪的儿童口腔健康数据闭环。方案落地的关键在于BLE芯片选型、姿态传感检测算法、GATT服务设计、数据同步确认机制以及低功耗策略的协同配合。本文围绕儿童电动牙刷的BLE上传方案,梳理从硬件选型到量产测试的完整工程路径,为智能硬件开发者提供可参考的实现思路与排错经验。

weixin_34348805的博客 392

Android 9.0 蓝牙通讯录 BluetoothPbapClient

蓝牙通讯录主要包含联系人和通话记录 一、BluetoothPbapClient功能介绍 1、主要实现电话簿下载 2、电话号码簿访问协议(Phonebook Access Profile) 二、BluetoothPbapClient的使用 public void getProfileProxy() { boolean isPbapService = mAdapter.getProfileProxy(mContext, new ProxyServiceListener(), BluetoothProfil

wq892373445的博客 5416

VLA模型(具身智能入门十)

Vision Language Action(VLA)模型VLA模型是机器人领域的“感知-理解-执行”一体化框架,通过Transformer架构融合视觉、语言、动作模态,核心目标是让机器人在自然语言驱动下,自主完成复杂操控任务。其定义的核心在于“跨模态统一”与“具象化行动”——不仅能“看懂”“听懂”,更能“做出正确的动作”,是实现通用机器人智能的关键方向。提供通用序列建模骨架,让视觉、语言、动作能以“序列”形式统一处理;ViT将视觉输入转换为序列特征,提供“看”的能力;LLMs。

weixin_39699362的博客 9928

生成式引擎优化(GEO)全景指南:技术架构、实施策略与未来趋势

生成式引擎优化(GEO)全景指南摘要 GEO(生成式引擎优化)是针对AI生成内容(如ChatGPT、文心一言等)的优化策略,通过结构化数据、权威建设与语义优化提升企业内容在AI答案中的引用优先级,实现“无点击曝光”。其核心价值在于从流量竞争转向信任构建,突破传统SEO局限。技术架构依托RAG(检索增强生成)、向量数据库及反馈学习机制,动态优化内容生成与引用逻辑。实施策略包括:部署结构化数据(如JSON-LD)、维护动态知识图谱、适配多模态内容(3D/VR)、联合权威机构发布白皮书。行业案例显示,美妆、智能家

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 1451

Android13 BluetoothPbapClient connect流程分析

5、创建PbapClientConnectionHandler对象,PbapClientConnectionHandler的作用是将线程设置为消息处理的Looper线程,用于处理Pbap客户端的连接。2、创建内部类SDPBroadcastReceiver对象,用于接收SDP广播,SDP_RECORD 是一个 BluetoothDevice 类型的广播意图,它表示设备在 Service Discovery Protocol(SDP)记录中返回了一个值。当远程设备公开服务时,可以使用 SDP 记录来描述服务。

liuning1985622的博客 1352

MAX31856高精度热电偶测温系统实战:从寄存器配置到温度读取

本文详细介绍了MAX31856高精度热电偶测温系统的实战应用。从硬件连接避坑、核心寄存器配置(如CR0、CR1),到利用中断高效读取并解析温度数据,提供了完整的驱动框架和代码示例。该方案解决了传统热电偶信号微弱、非线性及冷端补偿难题,适用于工业测温等场景,帮助开发者快速实现稳定可靠的高精度温度测量。

coffee的博客 486

蓝牙连接背后的故事:从配对到数据传输的全链路剖析

本文深入解析蓝牙连接的全生命周期,从设备发现到数据传输的完整链路,特别关注Android平台上的蓝牙设备连接状态管理。通过剖析配对与连接的本质区别、RFCOMM通道建立过程以及不同蓝牙配置文件的状态检测机制,为开发者提供构建稳定高效蓝牙应用的实用指南。

gpt4scribbler的博客 670

【制作100个unity游戏之22】3DRPG游戏开发01——项目的设置和导入及渲染管线的安装修复

如果你现在存在一些疑惑unity导入素材为什么是粉紫色的?表示他没有适配我们的URP通用渲染管线,要如何适配呢?素材渲染错误丢失要如何解决?如果你有上面3个任意的问题,那这篇文章同样适合你,我将手把手教你如何安装修复渲染管线,看完你就了解了!在Unity中,他们都是渲染管线,它们的主要区别在于性能和功能。LWRP是早期版本的URP,它专门为移动设备和低端PC设计,旨在提供更高的性能。它使用基于顶点的光照和简化的后处理效果,可以在更低的硬件要求下运行。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2429

建模simulink - 手把手教你搭建xpc平台

概述xpc半实物仿真目标是个基于RTW对低端实时仿真和开发平台,可将计算机或者工控机转变为一个实时系统,不需要第三方操作系统对支持,在计算机上配置输入输入出设备就能和外部交换信息,进行硬件...

不只会拍照的程序猿 7088

安卓用户福音!基于短信的独居应急工具Keep Alive(死了么)实操指南,免费+低功耗+精准提醒

你是否常被“突发健康问题无人知晓”“长时间失联无法预警”“现有应急工具收费且不及时”等问题影响安心感?今天分享的这款技术工具,能针对性解决这些实操难题。

inmK1的博客 1310

AMBA-CHI协议详解(二)

读事务,写事务,原子事务,Stash事务,Dataless事务,DVM事务,Retry事务。

Crazzy_M的博客 6653

Android系统服务

<!-- body, div, table, thead, tbody, tfoot, tr, th, td, p {font-family:"Liberation Sans"; font-size:x-small} --> SystemServer中启动的服务 服务类名称 作用描述 EntropyService 提

zengdaquan007的专栏 2832

实用指南:制作通用的INCA和CANape兼容A2L文件

A2L(ASAM MCD-2 Measurement and Calibration Data)文件是描述ECU(电子控制单元)测量和校准数据的标准文件格式。在标定工作中,A2L文件扮演着极为重要的角色,它定义了测量通道、校准参数等关键信息,为工程师提供了统一的描述方式。INCA和CANape是两种常见的汽车电子系统标定工具,分别由ETAS和Vector公司开发。它们在汽车电子系统的开发和调试过程中发挥着重要作用,提供了丰富的标定功能和用户友好的界面。

一直在水些技术小文 2924

知识图谱中的 Ontology(本体论)

1980年,本体论(Ontology)哲学概念“本体”被引入到人工智能领域用来刻画知识。本体概念模型、明确、形式化、共享。本体是实体存在形式的描述,往往表示为一组概念定义和概念之间的层级关系,本体框架形式树状结构,通常被用来为知识图谱定义schema。如人、公司、车等都可以在具体场景下称为本体。Ontology是(特定领域)信息组织的一种形式,是领域知识规范的抽象和描述,是表达、共享、重用知识的方法。Ontology。

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 2031

android系统framework层启动过程

基本上每个服务都有对应的Java类,从编码规范的角度来看,启动这些服务的模式可归类为三种:模式一是指直接使用构造函数构造一个服务,由于大多数服务都对应一个线程,因此,在构造函数内部就会创建一个线程并自动运行。模式二是指服务类会提供一个getInstance()方法,通过该方法获取该服务对象,这样的好处是保证系统中仅包含一个该服务对象。无论以上何种模式,当创建了服务对象后,有时可能还需要调用该服务类的init()或者systemReady()函数以完成该对象的启动。更多SystemServer见下表。

... 640

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android耳机插入检测

插入headset时,StatusBarPolicy类中能收到ACTION_HEADSET_PLUG的广播。而这个广播是在HeadsetObserver类中调用onUEvent时引发的,其父类UEventObserver建立一个线程,线程启动时会运行一个死循环,循环调用next_event阻塞等待底层的event发生。一般情况下插拨耳机next_event都会收到事件,并调用HeadsetObse

baimingyong007的专栏 2158

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android 内核初识(6)SystemServer进程

简介   SystemServer的进程名实际上叫做“system_server”,通常简称为SS。   系统中的服务驻留在其中,常见的比如WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、 PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中。 ...

banyinlve3147的博客 205

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android Framework 学习从这里开始

一、Android 系统结构 Linux 系统内核 操作系统,直接和硬件交互,包含所有硬件驱动。负责进程管理、内存管理、安全性、网络协议栈等。Linux内核也同时作为硬件和软件栈之间的抽象层。 本地函数库 本层包含一些C/C++函数库,供上层使用: libc(系统C函数库):专门为嵌入式Linux设备定制的。 媒体库:音视频录制和播放,图片的拍摄和展示。 Surface Manager :显示管理,界面渲染相关。 WebKit :web浏览器相关 SGL :底层的2D图形引擎 OpenGL|ES :3D图

hipeboy的博客 334

【转】Android 内核初识(6)SystemServer进程

简介   SystemServer的进程名实际上叫做“system_server”,通常简称为SS。   系统中的服务驻留在其中,常见的比如WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、 PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中。   SS是由Z...

weixin_34417635的博客 384

Android Framework 学习笔记

一、Android 系统结构 Linux 系统内核 操作系统,直接和硬件交互,包含所有硬件驱动。负责进程管理、内存管理、安全性、网络协议栈等。Linux内核也同时作为硬件和软件栈之间的抽象层。 本地函数库 本层包含一些C/C++函数库,供上层使用: libc(系统C函数库):专门为嵌入式Linux设备定制的。 媒体库:音视频录制和播放,图片的拍摄和展示。 Surface Manage...

刘颖聪的博客 701

飞行模式技术解析:从无线电管理到移动开发实战

在移动通信领域,网络状态管理是保障应用稳定性的基础技术之一。其核心原理在于操作系统通过统一的接口控制无线射频模块的启停,实现对蜂窝网络、Wi-Fi、蓝牙等通信功能的集中管控。这一机制的技术价值在于为应用提供了模拟网络异常、进行边界测试的标准化环境,是开发高质量移动应用的关键环节。在工程实践中,开发者常利用该功能测试应用的离线处理能力、网络请求重试机制以及数据一致性保障,特别是在处理网络切换和信号弱等复杂场景时。本文以飞行模式为例,深入探讨其作为系统级无线电管理工具在移动开发中的应用,涵盖网络状态监听、异常模

weixin_33860528的博客 295

Framework学习笔记

# Framework简介 # ![](https://i.imgur.com/HHQUkoi.png) # 系统服务 #       SystemServer 是framework中非常重要的一个进程,它是在虚拟机启动后运行的第一个java进程,SystemServer启动其他系统服务,这些系统服务都是以一个线程的方式存在于SystemServer进程中。  a) EntropyService ...

xingye813的博客 388

SystemServer进程

简介   SystemServer的进程名实际上叫做“system_server”,通常简称为SS。   系统中的服务驻留在其中,常见的比如WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、 PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中。   SS是由Z...

Linux and C 1127
上一篇: Android-Service端和Clinet端通讯-如果client被杀了
下一篇: [Android追忆]CTS测试中的原生Setting和开发setting的切换
T-Quake
博客等级 码龄20年 103粉丝 46原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值