Android中PIN和PUK码解锁研究

来源:互联网 发布:下周美国经济数据 编辑:程序博客网 时间:2024/05/02 04:38
由于目前手头没有真机,只是在模拟器上修改部分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