由于目前手头没有真机,只是在模拟器上修改部分telephony代码来调出请求输入PIN码的界面。具体方法:修改external/qemu/telephony/sim_card.c中的asimcard_create()函数,将card->status = A_SIM_STATUS_READY改为card->status = A_SIM_STATUS_PIN,然后重新编译代码生成image,启动模拟器就直接进入PIN码解锁界面。
 
         PIN码解锁界面属于Phone Policy的一部分,代码位置在
framework/base/policy/src/com/android/internal/policy/SimUnlockScreen.java。当用户输入PIN码按下OK键时,会调用checkPin()函数,通过启动一个线程CheckSimPin来调用TelephonyManager的supplyPin()接口,并注册一个类似于Callback的虚函数onSimLockChangedResponse()并实现之,这样当supplyPin()调用返回时,触发该Callback函数。
 
         supplyPin()接口的具体实现在PhoneInterfaceManager中,代码位置在
packages/apps/Phone/src/com/android/phone/PhoneInterfaceManager.java。首先创建一个线程并启动来维护一个Handler用于接收RIL上来的消息(SUPPLY_PIN_COMPLETE)。随后调用IccCard的supplyPin()方法并将Handler注册上去,此后一直wait,直到Hander收到指定消息后将其唤醒返回,并将操作结果传给其调用者。
 
         如果成功,返回值为true,代表PIN码验证成功。 此时SimUnlockScreen中的onSimLockChangedResponse()方法会被调用,它会通知KeyguardUpdateMonitor去更新SimState的状态为IccCard.State.READY,并通知锁屏程序解锁成功。
 
         如果失败,SimUnlockScreen界面会一直存在,直到连续输入三次失败后,IccCard.java会发出一个Action为”ACTION_SIM_STATE_CHANGED_LOCKED”的广播,由于KeyguardUpdateMonitor对它进行了监听,所以它的onReceive()会被触发,并根据Intent携带的Extras进行SIMState的修改,此时由于reason为“PUK”,故将SIMState置为PUK_ REQUIRED,并触发所有注册监听SIM状态改变的Callback。KeyguardViewMediator的onSimStateChanged()被调用,由于SIMState状态为PUK_ REQUIRED,所以屏幕Mode被设置为LockScreen此时会进入锁屏界面按道理此时需要输入PUK码进行PIN码的修改。但是由于目前的流程中没有对PUK码的请求输入进行处理,所以导致锁屏界面解锁后整个界面不可操作,具体原因可能要调查现有的锁屏程序,不过据我所知目前Android原生态的锁屏都有这个问题,即一旦PIN码锁住之后,手机使用不了,必须将SIM拔出在支持PUK解锁的手机上解锁之后才可以继续使用。
 
         另外目前底层包括framework中均已支持PUK码的解锁,所以工作量都集中在应用程序及锁屏的部分代码中,有些问题可能还需要锁屏来支持。其实目前PUK解锁方式可以通过在紧急拨号盘中输入”**05*PUK*PIN*PIN#”来完成,只不过一般用户根本不知道和使用这个功能。所以需要自己来实现一套PUK码解锁界面,从目前来看放在Keyguard中比较合适。

经验呀
原文链接:http://blog.sina.com.cn/s/blog_6c1b75e70100tk2p.html

Android中PIN和PUK码解锁研究相关推荐

  1. 手机PIN、PUK码之谜

    起因: 最近好多钱不翼而飞的事件发生,偶然看到一个小新闻,如果把SIM卡锁上,那么手机被偷之后第一层密码通过 刷机可以破解,你的手机卡不会被莫名的利用进行贷款消费之类的活动. 过程: 打开手机的设置- ...

  2. Android中ICS4.0源码Launcher启动流程分析【android源码Launcher系列一】

    最近研究ICS4.0的Launcher,发现4.0和2.3有稍微点区别,但是区别不是特别大,所以我就先整理一下Launcher启动的大致流程.Launcher其实是贯彻于手机的整个系统的,时时刻刻都在 ...

  3. Ubuntu 14.04 64bit上curl-7.37源码包中的sample 源码示例研究

    curl是Linux平台上(本人不考虑其他平台)很好用的一个工具软件,它有命令行,有C接口API,更常见的编程用途是php和python版本.如果在C/C++平台上使用curl,可以直接去官网 htt ...

  4. Android中的二维码生成与扫描

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/51260428 本文出自:[顾林海的博客] 前言 月底离开公司,准备月底 ...

  5. java toast_详解Android中的Toast源码

    Toast源码实现 Toast入口    我们在应用中使用Toast提示的时候,一般都是一行简单的代码调用,如下所示: [java] view plaincopyprint?在CODE上查看代码片派生 ...

  6. android中Zing二维码扫描,二维码生成

    Android中二维码扫描的最常用库是zxing和zbar,zxing项目地址为https://github.com/zxing/zxing,目前还有多个人在维护.zbar主要用C来写的,对速度有要求 ...

  7. android获取按键键值,android中按键的扫描码和键值

    kernel中的按键驱动通过input子系统上报的键值叫做扫描码(ScanCode),对应头文件在 kernel/include/uapi/linux/input.h andorid中的用到的按键才叫 ...

  8. Android开发——Android中的二维码生成与扫描

    0. 前言 今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描.本篇旨在帮助有需求的同学快速完成二维 ...

  9. android 中的二维码生成与去除白边

    现在二维码应用越来越广泛,把一个url转换为二维码图片,让后去扫描,应用太多了.现在 zxing:core 包也用的相当广泛,android studio 使用也很方便,在 gradle 中加入配置, ...

最新文章

  1. 谷歌推出情境感知API
  2. 如何有效使用每一点脑力总结_如何更有效地节省脑力和编码
  3. 为什么 HashMap 的加载因子是0.75?
  4. 【自动驾驶】定位方式:RTK定位与激光融合定位
  5. Ryu oslo学习总结
  6. php basic syntax
  7. linux查看指定用户的所有进程
  8. hazelcast入门教程_Hazelcast入门指南第3部分
  9. 2022年轻人潮流爱好报告:被朋友圈高赞的神秘爱好,不烧钱还能脱单
  10. linux配置caffe环境,ubuntu14.04环境下配置caffe
  11. sql示例_PARSEONLY SQL命令概述和示例
  12. R语言转换并保存json文件--使用jsonlite包
  13. promoter:启动子预测程序(PPPs)软件现状及分析
  14. 预定系统 mysql_Jsp+Ssm+Mysql实现的酒店预定管理系统毕设指导思路模板
  15. POI导出 Excel 加水印支持 SXSSFWorkbook 和 XSSFWorkbook 模式
  16. 电子协会 C语言 1级 34 、分段函数
  17. virtualbox安装mac os x雪豹
  18. Python爬虫:查国家安全信息库
  19. 【转】小玄子和小桂子
  20. 软件测试中系统的功能测试,软件测试中的43个功能测试点(下)

热门文章

  1. 《Java 后端面试经》Java 基础篇
  2. scrapy 项目实战(一)----爬取雅昌艺术网数据
  3. Leetcode PHP题解--D35 876. Middle of the Linked List
  4. java 四则运算_四则运算————javaweb版
  5. C++ 贪心算法 摇摆序列
  6. Biological Pathways 生物途径(通路)
  7. 软件测试--白盒测试、黑盒测试、α测试、β测试
  8. 联发科技嵌入式_【MTK联发科技嵌入式驱动工程师面试】面试官人很好,问的问题很基础。-看准网...
  9. 23种设计模式-单一原则
  10. GMO宣布聘用高级管理人员Amy Shang来领导公司在大中华区的工作