Android6.0来电匹配电话薄联系人解析

0 下载量 142 浏览量 更新于2024-08-28 收藏 140KB PDF 举报
"Android6.0来电号码与电话薄联系人匹配流程分析" 在Android系统中,来电处理是一项关键功能,它涉及到系统如何识别并显示来电者的相关信息。在Android 6.0(Marshmallow)中,当电话服务接收到一个新的来电时,会有一系列的步骤来确定这个号码是否与电话薄中的联系人相匹配。以下是对这一过程的详细解释: 首先,当电话服务接收到一个来电,`handleCreateConnectionSuccess`方法会被调用。在这个方法中,我们看到`setHandle`函数被调用,传入了`connection.getHandle()`和`connection.getHandlePresentation()`。`getHandle`方法返回的是一个代表来电号码的Parcel对象,通常是一个字符串形式的电话号码。`getHandlePresentation`则提供关于电话号码显示的指示,比如是否应该隐藏或者显示号码。`setHandle`函数在这里的作用是初始化Call对象,并关联来电的电话号码。 接着,`setCallerDisplayName`被调用,用于设置来电者的显示名称。如果电话簿中有对应的联系人,这个名称会是联系人的名字;否则,可能是原始的电话号码。 在处理来电时,Android系统可能会等待一段时间,以查询来电者是否已设置为直接转到语音邮件。这通过`mDirectToVoicemailQueryPending`标志实现,表示查询是否正在进行。为了防止查询超时,系统会使用`mHandler.postDelayed`方法设置一个延迟执行的任务,即`mDirectToVoicemailRunnable`,这个任务会在指定的时间(由`Timeouts.getDirectToVoicemailMillis`计算得出)后运行,检查来电是否应直接转到语音邮件,而不是展示给用户。 为了匹配来电号码与电话薄中的联系人,Android系统会使用ContentResolver发起一个Cursor查询。查询通常针对`ContactsContract.Data`表进行,该表包含了联系人的所有数据项,包括电话号码。查询条件可能包含来电号码,以便找到与之匹配的联系人记录。`Uri`对象,如`ContactsContract.CommonDataKinds.Phone.CONTENT_URI`,可以作为查询的起点,而`cursor`则用于存储查询结果。 查询过程中,`id`和`token`是两个重要的参数。`id`通常是指联系人的ID,它是联系人在数据库中的唯一标识。`token`可能用于追踪特定查询的上下文,例如在多线程环境下的并发查询。 一旦查询完成,系统会检查结果。如果Cursor中有匹配的记录,那么来电者的信息就会显示为联系人的名字和照片等详细信息。如果没有匹配,来电显示将仅包含电话号码。此外,系统还会考虑联系人的优先级和用户设置,决定是否显示来电通知、振动或播放特定的铃声。 Android 6.0在处理来电时,通过获取和解析来电号码,启动查询联系人数据,然后匹配和显示相应的联系人信息。这个过程涉及到了RIL框架层、电话服务、ContentResolver和数据查询等多个组件,确保了来电显示的准确性和用户体验。