MTK安卓sim卡相关源码分析

原文地址:http://m.blog.csdn.net/article/details?id=50039589

最近由于一个sim卡相关的需求,就去了解了一下Android Sim卡相关的一些代码.在此记录一下.

简要说一下需求吧,需要在插拔卡的时候弹出对话框,提供界面让用户选择开启默认卡数据链接或者转移到另一张卡开启数据链接.
这个主要就是监听sim卡的状态.sim卡的状态.一般网上搜到的都是广播--"android.intent.action.SIM_STATE_CHANGED"

 
  1. public void onReceive(Context context, Intent intent) {

  2. System.out.println("sim state changed");

  3. if (intent.getAction().equals(ACTION_SIM_STATE_CHANGED)) {

  4. TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);

  5. int state = tm.getSimState();

  6. switch (state) {

  7. case TelephonyManager.SIM_STATE_READY :

  8. simState = SIM_VALID;

  9. break;

  10. case TelephonyManager.SIM_STATE_UNKNOWN :

  11. case TelephonyManager.SIM_STATE_ABSENT :

  12. case TelephonyManager.SIM_STATE_PIN_REQUIRED :

  13. case TelephonyManager.SIM_STATE_PUK_REQUIRED :

  14. case TelephonyManager.SIM_STATE_NETWORK_LOCKED :

  15. default:

  16. simState = SIM_INVALID;

  17. break;

  18. }

  19. }

  20. }

上面的代码是引用网上的一段,接受到SIM_STATE_CHANGED广播后,调用TelephoneManager 的getsinstate()函数获取广播的参数,上面的一些有些旧了,我参考了一下安卓
5.1的源码:

 
  1. * These are the ordinal value of IccCardConstants.State.

  2. */

  3. public static final int SIM_STATE_UNKNOWN = 0;

  4. /** SIM card state: no SIM card is available in the device */

  5. public static final int SIM_STATE_ABSENT = 1;

  6. /** SIM card state: Locked: requires the user's SIM PIN to unlock */

  7. public static final int SIM_STATE_PIN_REQUIRED = 2;

  8. /** SIM card state: Locked: requires the user's SIM PUK to unlock */

  9. public static final int SIM_STATE_PUK_REQUIRED = 3;

  10. /** SIM card state: Locked: requires a network PIN to unlock */

  11. public static final int SIM_STATE_NETWORK_LOCKED = 4;

  12. /** SIM card state: Ready */

  13. public static final int SIM_STATE_READY = 5;

  14. /** SIM card state: SIM Card is NOT READY

  15. *@hide

  16. */

  17. public static final int SIM_STATE_NOT_READY = 6;

  18. /** SIM card state: SIM Card Error, permanently disabled

  19. *@hide

  20. */

  21. public static final int SIM_STATE_PERM_DISABLED = 7;

  22. /** SIM card state: SIM Card Error, present but faulty

  23. *@hide

  24. */

  25. public static final int SIM_STATE_CARD_IO_ERROR = 8;

一共9种状态,每种都有解释,但是可以发现其中有代表没插卡的SIM_STATE_ABSENT,代表卡正常的SIM_STATE_READY,但是没有代表插入卡的广播.不符合我的需求啊.无奈继续找.

而我这里需要监听插卡弹出提示框,所以我查看了framework相关源码.一般和通讯相关源码都在frameworks/opt/telephony/,frameworks/base/telephony/,frameworks/base/telecom/这三个模块下.

但是我发现sim卡相关的很多都在frameworks/opt/telephony/这个目录下.

由于之前做过数据连接相关的工作,而数据链接又和sim卡挂钩,所以我直接找到了frameworks/opt/telephony/src/java/com/mediatek/internal/telephony/dataconnection/DataSubSelector.java这个文件.

这个文件是控制插卡,设置默认卡为卡一或者卡二,同时也控制数据连接的开关.这部分功能和我的需求还是很类似的.

进入这个文件可以发现他就是一个接收广播的文件,而接收的广播就是TelephonyIntents.ACTION_SUBINFO_RECORD_UPDATED.

查看这个广播

 
  1. public static final String ACTION_SUBINFO_RECORD_UPDATED

  2. = "android.intent.action.ACTION_SUBINFO_RECORD_UPDATED";

源码中对他的解释就是:It indicates subinfo record update is completed when SIM inserted state change.

可以发现这才是监听sim卡插入的广播.找到这个广播,于是可以做起来了.

补充:后来我又深入的查看一些文件,发现frameworks/opt/telephony/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java文件,从文件名就可以知道这是sim卡信息更新的文件.

既然sim卡信息更新,那肯定和插卡,拔卡有关.果然在这个文件我发现了一个数组:

 
  1. /**

  2. * int[] sInsertSimState maintains all slots' SIM inserted status currently,

  3. * it may contain 4 kinds of values:

  4. * SIM_NOT_INSERT : no SIM inserted in slot i now

  5. * SIM_CHANGED : a valid SIM insert in slot i and is different SIM from last time

  6. * it will later become SIM_NEW or SIM_REPOSITION during update procedure

  7. * SIM_NOT_CHANGE : a valid SIM insert in slot i and is the same SIM as last time

  8. * SIM_NEW : a valid SIM insert in slot i and is a new SIM

  9. * SIM_REPOSITION : a valid SIM insert in slot i and is inserted in different slot last time

  10. * positive integer #: index to distinguish SIM cards with the same IccId

  11. */

这个数组详细的介绍了插卡的sim卡状态的变化.

于是把原来的代码优化,放弃之前的广播,在这个文件中只有sInsertSimState = SIM_NEW,才触发我的代码发出自己的广播来弹出提示框(这里这样修改是为了防止每次插重复的卡都要弹出框,因为android自动会把之前的卡的状态,数据的开关写入系统的SettingProvider之中记录下来 .).所以只有新卡插入才会提示用户设置.

Ansroid系统(262)---MTK安卓sim卡相关源码分析相关推荐

  1. MTK安卓sim卡相关源码分析

    最近由于一个sim卡相关的需求,就去了解了一下Android Sim卡相关的一些代码.在此记录一下. 简要说一下需求吧,需要在插拔卡的时候弹出对话框,提供界面让用户选择开启默认卡数据链接或者转移到另一 ...

  2. 安卓9.0trim相关源码分析

    1.trim是什么?          一条ATA指令,由操作系统发送给SSD主控制器,告诉它哪些数据占有的地址是"无效的". 其实就是操作系统将一部分的控制权交给了SSD主控制器 ...

  3. freeRTOS滴答时钟相关源码分析

    最近学习白问网韦东山老师在B站开源的freeRTOS课程,网址:韦东山直播公开课:RTOS实战项目之实现多任务系统 第1节:裸机程序框架和缺陷_哔哩哔哩_bilibili和7天物联网训练营[第2期]7 ...

  4. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | 任务检查 | 任务执行 )

    文章目录 一.回调 StateChangedListener 接口 二.JobHandler 处理 ( 任务检查 ) 三.maybeRunPendingJobsH 方法 四.assignJobsToC ...

  5. kafka-分区重分配及相关源码分析

    tips:本文源码对应的kafka版本是2.3.1,源码分支2.3 分区重分配及相关源码分析 简单示例 kafka消费者分区重分配 消费者分区重分配简介 分区重分配的策略 RangeAssignor ...

  6. H5即时通讯IM聊天APP系统 带原生/安卓苹果端APP源码

    介绍: 带原生/安卓苹果端APP源码+详细视频教程 朋友互站4000+购买来的通讯,全原生,并不是视酷或酷信的二开版本,从底层开始结构就完全不一样, mongodb的库,uniapp混编手端,二开难度 ...

  7. 详述 Spring MVC 启动流程及相关源码分析

    文章目录 Web 应用部署初始化过程(Web Application Deployement) Spring MVC 启动过程 Listener 的初始化过程 Filter 的初始化 Servlet ...

  8. 【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )

    文章目录 一.ConnectivityController 连接控制器引入 二.ConnectivityController 构造方法解析 ( 注册接收者 ) 三.mConnectivityRecei ...

  9. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | Android 源码在线网址推荐 )

    文章目录 一.JobScheduler 提交任务 schedule 方法源码分析 二.schedule(JobInfo job, int uId) 方法 三.scheduleAsPackage 方法 ...

最新文章

  1. 项目经理怎么运用思维导图
  2. 精通JavaScript攻击框架:AttackAPI
  3. F# -- TCP/IP小测试
  4. [na]华为acl(traffic-filter)和dhcp管理
  5. Google Android 平台正式开源
  6. 好用的记事本_分类记事本软件哪个好用?大家推荐一个苹果手机用的分类记事本便签呗...
  7. Qt文档阅读笔记-Qt跨平台库(Qt基本库)
  8. linux mp4box安装,mp4box安装备忘
  9. HTML+Jquery实现2022跨年烟花特效,除夕最炫烟花代码,跨年怎能没有烟花
  10. Python函数式编程小案例:文本加密
  11. js Math对象属性和方法
  12. Android的JNI【实战教程】1⃣️--java和c/c++的那些事
  13. Java的成员变量(全局变量)和局部变量以及构造方法的使用以及详解
  14. oss 私有云访问 获取临时图片地址
  15. 又一恶意软件:1000多名受害者均在韩国,不排除其他地区被攻击的可能
  16. php pear pecl 区别,pecl 简单介绍
  17. mysql索引的子部分_Mysql索引数据结构详解及性能调优
  18. go语言视频教程_ go语言入门视频教程_go语言实战视频教程
  19. 实例003输出名言 实例说明 是否能够成为真正的编程高手,主要是在于是否有毅力坚持学习和练习。本实例要求输出名言“贵有恒,何必三更起五更睡:最无益,只怕一日曝十日寒。”主要是想让读者激励自己,坚持学习
  20. 湖人VS爵士!!科比4月14日最后一战,本赛季最高得分!狂得60分!!完美大逆转!!!...

热门文章

  1. Keil(MDK-ARM-STM32)系列教程(七)菜单
  2. oracle行锁 查询等待,Oracle 的for update行锁语法
  3. RTMP流媒体播放过程
  4. Linux输入子系统:输入设备编程指南 -- input-programming.txt
  5. IAR常用快捷键及使用小技巧
  6. java manager.apk_java实现静默安装apk
  7. vc可以实现对话框里显示html文档内容,也可以显示word内容吗,VC6中使用CHtmlView在对话框控制中显示HTML文档...
  8. MySQL事务和索引
  9. 【高校宿舍管理系统】第六章 用户管理和年级管理
  10. linux 日志管理、系统启动和备份恢复