前面有一篇说了导卡上的信息(android 信息(mms)的故事(七)-- sim卡短信),sim卡上还有一类非常重要的信息,就是卡上的联系人。不知道大家注意到没有,android手机,尤其是那些带有运营商标识的手机开机都比较慢,这个和开机导卡上的联系人和信息不无关系,运营商是要求开机必须导卡的,不过要说句公道话,开机慢和导卡有关但也不能完全归咎于它(android手机启动时加载的东西本身也很多),当然如果你的手机开机不导卡也慢那肯定是另有原因的。

当然Android源码开机是不导卡,如果我们需要查看卡上的联系人需要手动导入,从联系人Contact应用ContactsListActivity.java这个类的menu菜单找到导入导出,选择导入sim卡联系人,进入SimContactsSelectActivity.java这个类,在这个类里会执行query()方法,对应的provider和uri分别是IccProvider.java与uri.parse(content://icc/adn),进入IccProvider.java后的代码是本文要关注的部分,从query()方法看起

      public Cursor query(Uri url, String[] projection, String selection,String[] selectionArgs, String sort) {ArrayList<ArrayList> results;switch (URL_MATCHER.match(url)) {case ADN:results = loadFromEf(IccConstants.EF_ADN);break;

我们关心这个loadFromEf()方法,IccConstants.EF_AND这个值是6F3A,这是告诉告诉我们要先去查找卡上这个位置的内容。

    private ArrayList<ArrayList> loadFromEf(int efType) {ArrayList<ArrayList> results = new ArrayList<ArrayList>();List<AdnRecord> adnRecords = null; try {IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(//Binder来了                    ServiceManager.getService("simphonebook"));if (iccIpb != null) {adnRecords = iccIpb.getAdnRecordsInEf(efType);//proxy模式}} …省略次要代码….        }

接下来代码走到IccPhoneBookInterfaceManager.java这个类的getAdnRecordsInEf(intefid)方法,其中涉及了代理模式,IccPhoneBookInterfaceManagerProxy.java在中间做了个转换。在getAdnRecordsInEf(intefid)方法里调用了下updateEfForIccType(efid),判断是sim卡还是usim卡,确定下面的efid是用IccConstants.EF_AND还是IccConstants.EF_PBR,真正的查询是requestLoadAllAdnLike()是这个方法,这里要注意EVENT_LOAD_DONE这个标志,要用它来接收查询结果的。

    requestLoadAllAdnLike (int efid, int extensionEf, Message response) {ArrayList<Message> waiters;ArrayList<AdnRecord> result;if (efid == EF_PBR) {  //usim卡,这里我们看这个方法result = mUsimPhoneBookManager.loadEfFilesFromUsim();} else {//sim卡result = getRecordsIfLoaded(efid);}。

看下loadEfFilesFromUsim()方法,循环读取直到所有file读完后再返回,里面又分了两种,一种是电话号码的联系人,一种是邮箱地址的联系人,邮箱的相比电话号码还要麻烦点。

   public ArrayList<AdnRecord> loadEfFilesFromUsim() {synchronized (mLock) {//…省略次要代码….numRecs = mPbrFile.mFileIds.size();for (int i = 0; i < numRecs; i++) {readAdnFileAndWait(i);readEmailFileAndWait(i);} // All EF files are loaded, post the response.}

readAdnFileAndWait(i)和readEmailFileAndWait(i)最后都会调用mPhone.getIccFileHandler().loadEFLinearFixedAll()方法,只不过具体的参数不同。看下loadEFLinearFixedAll()的代码。

    public void loadEFLinearFixedAll(int fileid, Message onLoaded) {Message response = obtainMessage(EVENT_GET_RECORD_SIZE_DONE,new LoadLinearFixedContext(fileid,onLoaded));phone.mCM.iccIO(COMMAND_GET_RESPONSE, fileid, getEFPath(fileid),0, 0, GET_RESPONSE_EF_SIZE_BYTES, null, null, response);}

iccIO()方法显示代码跑到RIL.java了, 之前读卡上的信息代码也是走这里

    public void iccIO (int command, int fileid, String path, int p1, int p2, int p3,String data, String pin2, Message result) {      RILRequest rr = RILRequest.obtain(RIL_REQUEST_SIM_IO, result);//关注这个TAG标志rr.mp.writeInt(command);rr.mp.writeInt(fileid);rr.mp.writeString(path);rr.mp.writeInt(p1);rr.mp.writeInt(p2);rr.mp.writeInt(p3);rr.mp.writeString(data);rr.mp.writeString(pin2);send(rr);}根据上面那个TAG,可以在Reference-ril.c找到这个分支。case RIL_REQUEST_SIM_IO:requestSIM_IO(data,datalen,t);break;

阅读requestSIM_IO()方法可以看到android源码是如何读取sim卡上的联系人的,源码使用了AT +CRSM命令,关于AT命令可以看3gpp 27.007这个文档。读取完成时会收到EVENT_PBR_LOAD_DONE这个消息,在里面createPbrFile()方法中完成字符串的解析得到联系人信息。

public void handleMessage(Message msg) {…省略代码….    switch (msg.what) {case EVENT_PBR_LOAD_DONE:if (ar.exception == null) {createPbrFile((ArrayList<byte[]>) ar.result);}…省略代码….               break;

到这里,卡联系人导入大部分流程就走完了,后面还有些写入联系人数据库的操作比较简单就不写了,总体上流程还算清晰,只是循环比较多,远程调试的时候并不是很方便,通常一个sim卡可以存250个联系人,一个usim卡能存的联系人要多些,但数量不固定,其中读写联系人的邮箱地址要麻烦一些,由于存储空间的限制需要多次找对应的索引能找到我们想要的东西。至于读写卡联系人的具体例子,后续单独补充吧。最后贴图一张,有图有真相。

android -- sim/usim卡导联系人相关推荐

  1. Android 源码开发系列(二)Android SIM/USIM

    随着手机的普及,大家从非智能机到智能机的转变,从没有操作系统的定制机到智能手机,但唯一没有变的是,手机中的SIM,今天我们就来谈谈手机中SIM卡相关的内容.在日常生活中,SIM卡就是一张很小的卡片,但 ...

  2. android 联系人 --- 读取usim卡的邮箱

           本文主要关于usim卡上邮箱地址分析实例的,同时也附带了一个联系人号码的例子,之前分别写过读取sim/usim卡上短信息和联系人信息的文章,偏向代码调用流程,这次把重点放在具体解析过程. ...

  3. android+sim卡短信,android 信息(mms)开发(七)-- sim卡短信

    这篇关于android源码是如何操作sim卡上的信息说明,sim\usim卡的信息说起来这算是比较特别的一部分,由于android源码的信息是没有开机自动导卡信息和联系人的,所以有时会忘掉它的存在应该 ...

  4. android sim卡联系人存储格式,如何在Android设备上将联系人复制到SIM卡

    如何将联系人复制到SIM卡 以下部分是将联系人从计算机和Android手机存储卡复制到Android上的SIM卡的简单步骤.准备?让我们开始吧. 步骤1.安装并运行此Android管理器 开始时,在您 ...

  5. android sim卡联系人存储格式,Android SIM卡联系人的增删改查操作

    手机在存储联系人时支持存储到手机或者sim卡,本文主要讲述Android的sim卡中联系人是如何操作的. 1.权限 由于操作联系人的信息,所以联系人的读取和写入是必不可少的. 2.URI URI的创建 ...

  6. android+已移除sim卡,如何从Android SIM卡中删除/删除/擦除联系人

    作者:Selena Komez11月更新了20,2017 "我的兄弟是一个空白的经理,他在他的Android SIM卡上保存了数千个客户名称和电话号码.但是,现在为了保护客户的隐私,他需要将 ...

  7. android如何读取sim卡联系人信息,Android上如何获取手机和sim卡的联系人信息

    需求很明确,获取手机和sim的联系人信息.接口设计也很简介 public interface OnFetchContactsListener { void onFetcherContactsCompl ...

  8. android2.2应用开发之IccCard(sim卡或USIM卡)第一篇

    如果要做android通讯录的联系人的机卡混排显示,由于手机卡类型的不同,导致手机卡存储容量以及可以存储信息不同,就要涉及到android去读Icc卡的信息. 一般的sim卡只能存储姓名跟一个电话号码 ...

  9. android2.2应用开发之IccCard(sim卡或USIM卡)

    如果要做android通讯录的联系人的机卡混排显示,由于手机卡类型的不同,导致手机卡存储容量以及可以存储信息不同,就要涉及到android去读Icc卡的信息. 一般的sim卡只能存储姓名跟一个电话号码 ...

最新文章

  1. Python 机器学习之项目实践
  2. Redis根据是否存在设置值
  3. Mac OS X 安装教程
  4. 使用MarkDown+mermaid-JS绘制简单图形
  5. DES加密/解密类。
  6. 关闭 kali 警报音
  7. UBLOX配置/GPS配置设置/u-center使用
  8. 挂茶馆热血传奇私服辅助开发教程
  9. 古琴十大名曲——唐畅古琴
  10. 相机变焦与对焦方法及原理
  11. RSA+AES混合加密实例
  12. 每日一词——@FUnctionalInterface
  13. 哪款笔记本电脑最适合程序员学习写代码?结果我竟无言以对
  14. tomcat点击startup.bat闪退
  15. Alibaba Cloud Linux 3京东青龙面板搭建踩坑
  16. 《组织能力的杨三角》——企业持续成功的秘诀(杨国安)读书摘要
  17. 每个Web开发者都应读的文章:HTML5设计原理
  18. 少儿Python编程6-计算机数据结构和算法
  19. python小工具:文件批量改名
  20. 证件类型为身份证号时进行身份证校验

热门文章

  1. dom4j解析数组类型XML
  2. Avi与Kubernetes集成
  3. 【组合数学】排列组合与各种计数数列
  4. 【C语言】字符串(main函数参数)
  5. Linux下在程序中如何进行繁体中文和简体中文的转换
  6. mysql怎么截取时分秒_mysql中的截取函数及其实例
  7. 马斯克要干翻人工智能,“神经蕾丝”能让每个人都能当钢铁侠
  8. Python - struct模块、partical模块
  9. 专家剖析“绿色IT”和“绿色距离”
  10. clang-format