安卓源码避坑指南5——获取通话记录或通讯录的数量为负值

本文主要是介绍安卓源码避坑指南5——获取通话记录或通讯录的数量为负值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

安卓源码避坑指南5——获取通话记录或通讯录的数量为负值

在这里插入图片描述

通过蓝牙PBAP协议同步通讯录、通话记录时,想必对其数量大小也是很感兴趣的,因此一般的设计思路都是先获取到同步对象的总大小,然后再同步该对象的具体数据。

想法是美好的,然而现实却很魔幻。获取同步对象的总数量这块最近就遇到个奇怪问题——获取到的总数量为负值,今天就和大家一探究竟,详解此类问题。

测试环境:android-9车机系统(高通安卓源码)

测试步骤

  1. 车机蓝牙配对连接手机
  2. 车机同步通讯录、通话记录等(手机授权通讯录权限)

测试现象:获取到的通话记录数量为负值,由于应用内部逻辑,错误的负值不再同步该对象,通话记录为空。

What?怎么会获取到一个负值呢?带着疑问开始接下来的分析。

首先根据HCI层的交互,可以确定手机回复的数据是正确的,也就是说手机给的通话记录的size是个正数:
在这里插入图片描述

当我看到这个数量时,我心里萌生出这个想法:我艹,这哥们这么能打电话嘛…

而蓝牙服务层在接收到OBEX的回复消息后解析成了负值:
在这里插入图片描述

根据OBEX协议定义,同步对象的size大小使用两字节表示,所以 41708 的二进制表示法为:0b1010 0010 1110 1100,而 -23828 的二进制表示法也为:0b1010 0010 1110 1100

对正负数在计算机中存储形式还不清楚的同学可以打电话给自己的大学计算机老师了(哈哈),这样就可以解释通话记录变为负值的原因了。java中的数据是有符号区分的,两个字节的short类型数据的范围为:-2^15 ~ 2^15-1。而 41708 这个数值很明显已经超出 short类型值的范围,因此溢出被解析成负值。

安卓源码中解析该数据的方法为:com.android.bluetooth.pbapclient.ObexAppParameters. getShort(),当byte型数组中存储的两字节数据超出short类型值的范围就会解析成异常值。
在这里插入图片描述

解决方案:获取到负值肯定不是我们所希望的,那如何才能正确获取某个同步对象的size大小值呢?java中没有提供相关方法来获取无符号的数值,但是我们可以通过数值操作间接获取到该数据对应的无符号值。

以上方法获取到的short类型值按位与上0xFFFF后赋值给到一个int类型的变量,则该int类型变量表示的值则为正确的short类型无符号值:
在这里插入图片描述

问题延伸
此类问题就是没有考虑到数值类型中有符号和无符号数据在值范围上的差异,同样地获取通讯录数量大小也是存在该风险的。最后的总结:数值由无符号转化为有符号时需注意数值是否有溢出风险

感兴趣的小伙伴欢迎私信留言一起讨论,源码避坑,永无止境,共同学习,一起进步!

更多互联互通技术,欢迎关注微信公众号:Connectivity
在这里插入图片描述

这篇关于安卓源码避坑指南5——获取通话记录或通讯录的数量为负值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/316820

相关文章

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编