Android中PIN和PUK碼解鎖研究

由於目前手頭沒有真機,只是在模擬器上修改部分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

發佈了23 篇原創文章 · 獲贊 5 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章