SIM卡 --- 联系人查询过程分析

本文详细分析了Android系统中SIM卡联系人查询的过程,从IccProvider的query方法开始,深入到UiccPhoneBookController、IccPhoneBookInterfaceManager、AdnRecordCache和AdnRecordLoader等组件,描述了如何通过子线程同步和RIL请求来获取SIM卡的ADN记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6.3 联系人操作

在前面已经论述过, SIM卡中的联系人是保存在单独的数据库中,其对应的Provider为IccProvider,在packages\services\Telephony 路径下,也就是phone进程中。并且,增删改查直接看jar包中的IccProvider类就可以了, IccProvider路径如下,

frameworks/opt/telephony/src/java/com/android/internal/telephony/IccProvider.java

IccProvider中对应的4个增删改查的方法分别对应, query/ insert/ delete/ update 方法。

其中insert/ delete/ update 三个方法都是调用updateIccRecordInEf方法实现。

3.1 查询

IccProvider中有3种类型的电话本,分别是ADN/FDN/SDN, FDN/SDN 用的比较少, sim卡上的电话本就是ADN。当然,处理过程也是大同小异,只看AND的处理。

IccProvider的query方法主要逻辑就是根据不同类型分别调用loadFromEf方法进行处理。

对AND的处理如下,

case ADN:  //默认SIM卡
    return loadFromEf(IccConstants.EF_ADN, SubscriptionManager.getDefaultSubId());
case ADN_SUB: // 双卡双待
    return loadFromEf(IccConstants.EF_ADN, getRequestSubId(url));

调用流程图如下,


loadFromEf方法主要逻辑如下,

1,调用UiccPhoneBookController的getAdnRecordsInEfForSubscriber方法进行查询,将结果封装成AdnRecord,

List<AdnRecord> adnRecords = null;
try {
   IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
       ServiceManager.getService("simphonebook"));
   if (iccIpb != null) {
       adnRecords = iccIpb.getAdnRecordsInEfForSubscriber(subId, efType)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值