1.Android自帶的pin解鎖部份在framework/base/policy/src/com/android/internal/policy/impl/SimUnlockScreen.java

Sim鎖定后開機,會調用這個類,show出“請輸入pin”的解鎖介面,輸入pin密碼后,點擊“ok”,調用checkPin( )

通过启动一个线程CheckSimPin来调用TelephonyManager的supplyPin()接口,并注册一个类似于Callback的虚函数onSimLockChangedResponse()并实现之,这样当supplyPin()调用返回时,触发该Callback函数。

privatevoidcheckPin() {

//…….//

new CheckSimPin(mPinText.getText().toString()) {

void onSimLockChangedResponse(boolean success) {

if (mSimUnlockProgressDialog != null) {

mSimUnlockProgressDialog.hide();

}

if (success) {

mUpdateMonitor.reportSimPinUnlocked();

mCallback.goToUnlockScreen();

} else {

mHeaderText.setText(R.string.keyguard_password_wrong_pin_code);

mPinText.setText("");

mEnteredDigits = 0;

}

mCallback.pokeWakelock();

}

}.start();

}

privateabstractclassCheckSimPinextends Thread {

privatefinal String mPin;

protected CheckSimPin(String pin) {

mPin = pin;

}

abstractvoid onSimLockChangedResponse(boolean success);

@Override

publicvoid run() {

try {

finalboolean result = ITelephony.Stub.asInterface(ServiceManager

.checkService("phone")).supplyPin(mPin);//result返回的值來自PhoneInterfaceManager中

                post(new Runnable() {

publicvoid run() {

onSimLockChangedResponse(result);

}

});

} catch (RemoteException e) {

post(new Runnable() {

publicvoid run() {

onSimLockChangedResponse(false);

}

});

}

}

}

2.supplyPin()接口的具体实现在PhoneInterfaceManager中,代码位置在packages/apps/Phone/src/com/android/phone/PhoneInterfaceManager.java。

首先创建一个线程并启动来维护一个Handler用于接收RIL上来的消息(SUPPLY_PIN_COMPLETE)。随后调用IccCard的supplyPin()方法并将Handler注册上去,此后一直wait,直到Hander收到指定消息后将其唤醒返回,并将操作结果传给其调用者。

publicboolean supplyPin(String pin) {

enforceModifyPermission();

final CheckSimPin checkSimPin = new CheckSimPin(mPhone.getIccCard());

checkSimPin.start();

return checkSimPin.checkPin(pin);

}

privatestaticclass CheckSimPin extends Thread {

privatefinal IccCard mSimCard;

privatebooleanmDone = false;

privatebooleanmResult = false;

// For replies from SimCard interface

private Handler mHandler;

// For async handler to identify request type

privatestaticfinalintSUPPLY_PIN_COMPLETE = 100;

public CheckSimPin(IccCard simCard) {

mSimCard = simCard;

}

@Override

publicvoid run() {

Looper.prepare();

synchronized (CheckSimPin.this) {

mHandler = new Handler() {

@Override

publicvoid handleMessage(Message msg) {

AsyncResult ar = (AsyncResult) msg.obj;

switch (msg.what) {

caseSUPPLY_PIN_COMPLETE:

Log.d(LOG_TAG, "SUPPLY_PIN_COMPLETE");

synchronized (CheckSimPin.this) {

mResult = (ar.exception == null);//若ar.exception為null,則說明驗證通過mResult = true

mDone = true;

CheckSimPin.this.notifyAll();

}

break;

}

}

};

CheckSimPin.this.notifyAll();

}

Looper.loop();

}

synchronizedboolean checkPin(String pin) {

while (mHandler == null) {

try {

wait();

} catch (InterruptedException e) {

Thread.currentThread().interrupt();

}

}

Message callback = Message.obtain(mHandler, SUPPLY_PIN_COMPLETE);

mSimCard.supplyPin(pin, callback);

while (!mDone) {

try {

Log.d(LOG_TAG, "wait for done");

wait();

} catch (InterruptedException e) {

// Restore the interrupted status

Thread.currentThread().interrupt();

}

}

Log.d(LOG_TAG, "done");

Log.d(LOG_TAG, "mResult : "+mResult);

returnmResult;

}

}

3.接下來IccCard.java在frameworks/base/telephony/java/com/android/internal/telephony/IccCard.java

調用RIL.java的supplyPin()見第4條。

創建一個Handler來接受EVENT_PINPUK_DONE,當Handler接收到EVENT_PINPUK_DONE,

publicvoid supplyPin (String pin, Message onComplete) {

mPhone.mCM.supplyIccPin(pin, mHandler.obtainMessage(EVENT_PINPUK_DONE, onComplete));

Log.i("IccCard!!!","supplyPin");

}

protected Handler mHandler = new Handler() {

@Override

publicvoid handleMessage(Message msg){

AsyncResult ar;

int serviceClassX;

serviceClassX = CommandsInterface.SERVICE_CLASS_VOICE +

CommandsInterface.SERVICE_CLASS_DATA +

CommandsInterface.SERVICE_CLASS_FAX;

if (!mPhone.mIsTheCurrentActivePhone) {

Log.e(mLogTag, "Received message " + msg + "[" + msg.what

+ "] while being destroyed. Ignoring.");

return;

}

switch (msg.what) {

//………//

caseEVENT_PINPUK_DONE:

ar = (AsyncResult)msg.obj;

// TODO should abstract these exceptions

AsyncResult.forMessage(((Message)ar.userObj)).exception

= ar.exception;

mPhone.mCM.getIccCardStatus(

obtainMessage(EVENT_REPOLL_STATUS_DONE, ar.userObj));

break;

caseEVENT_REPOLL_STATUS_DONE:

ar = (AsyncResult)msg.obj;

getIccCardStatusDone(ar);

((Message)ar.userObj).sendToTarget();

break;

//…………………….//

default:

Log.e(mLogTag, "[IccCard] Unknown Event " + msg.what);

}

}

};

4. frameworks/base/telephony/java/com/android/internal/telephony/RIL.java中的supplyIccPin()

@Overridepublicvoid

supplyIccPin(String pin, Message result) {

supplyIccPinForApp(pin, null, result);

}

@Overridepublicvoid

supplyIccPinForApp(String pin, String aid, Message result) {

//Note: This RIL request has not been renamed to ICC,

//       but this request is also valid for SIM and RUIM

RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PIN, result);

if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));

rr.mp.writeInt(2);

rr.mp.writeString(pin);

rr.mp.writeString(aid);

send(rr); //通过socket 向 rild 发送 RIL_REQUEST_ENTER_SIM_PIN 请求

}

後面的c实现部分,目前沒有去看。

android Sim卡鎖定 pin解鎖流程學習相关推荐

  1. android app unlock sim pin,android Sim卡锁定 pin解锁流程学习

    1.Android自帶的pin解鎖部份在framework/base/policy/src/com/android/internal/policy/impl/SimUnlockScreen.java ...

  2. android Sim卡锁定 pin解锁流程学习

    1.Android自帶的pin解鎖部份在framework/base/policy/src/com/android/internal/policy/impl/SimUnlockScreen.java ...

  3. SIM卡的密码PIN与PUK密码PIN

    SIM卡(Subscriber Identity Module) ,即用户识别卡,是全球通数字移动电话的一张个人资料卡.它采用A 级加密方法制作,存储着用户的数据.鉴权方法及密钥,可供GSM系统对用户 ...

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

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

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

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

  6. Android sim卡 pin码解锁流程.

    sim卡 pin码解锁流程 1. PIN码解锁界面属于Phone Policy的一部分,代码位置在 \frameworks\base\policy\src\com\android\internal\p ...

  7. android sim卡分析,Android 判断SIM卡属于哪个移动运营商详解及实例

    Android 判断SIM卡属于哪个移动运营商 第一种方法: 获取手机的IMSI码,并判断是中国移动\中国联通\中国电信 TelephonyManager telManager = (Telephon ...

  8. android sim卡槽,包教包会,十分钟让你搞定与或卡槽

    包教包会,十分钟让你搞定与或卡槽 2016-04-29 11:48:20 27点赞 83收藏 35评论 前言:很多手机厂商为了节省成本都会选择与或卡槽,美其名曰节省内部空间,让你的手机更薄,也有华为m ...

  9. Android SIM 卡信息加载流程

    在PhoneAPP启动关系类初始化中,我们提到监听处理SIM卡状态的两个关键类UiccController和IccCardProxy UiccController:整个UICC事务处理的入口,负责对外 ...

最新文章

  1. 详解zabbix中文版安装部署
  2. java wait定时_java定时器的使用(Timer)
  3. python财务报表分析-浅谈利用Python分析财报找到值得投资的好公司的想法
  4. python编写购物程序_Python实现购物程序思路及代码
  5. Symfony2Book03:使用Symfony2创建页
  6. 吴裕雄 19-Mysql 连接的使用
  7. Visual Studio 2019 preview中体验C# 8.0新语法
  8. dosbox edit.exe 如何使用_宅家30天,2万字节java高级工程师面试题解析,如何斩获阿里p7...
  9. Spring与Struts框架整合
  10. linux mtp设备,这么烂的MTP 为何现在所有Android设备都不能不用
  11. masaic 数据增强代码
  12. 优化Nginx的处理性能
  13. 【论文】哈工大SCIR Lab | EMNLP 2019 基于BERT的跨语言上下文相关词向量在零样本依存分析中的应用...
  14. 基于RFID的图书馆管理
  15. 尚学堂马士兵java多线程部分笔记
  16. 数学建模基础理论【二】(定积分)
  17. 8月第2周基金排行榜 | TokenInsight
  18. 天宝数字水准仪数据格式转换
  19. ​​商朝是广西骆越人北上建立的政权,是骆越文化的延续
  20. yahoo,hotmail邮箱无法收到邮件

热门文章

  1. 三菱FX3U PLC计米轮功能块(完整ST代码)
  2. curle(curley)
  3. 【面试宝典】软件测试工程师2021烫手精华版(第三章Mysql基础篇)
  4. 【剑指Offer】个人学习笔记_32_从上到下打印二叉树 IIIIII
  5. SWAN之ikev2协议farp配置测试
  6. 51单片机独立按键数码管可调时钟显示程序
  7. 【自定义】抢妹子大作战
  8. 计算机专业成长计划书,计算机专业学习计划书
  9. C语言知识学习归纳总结(逐梦篇专栏合集)
  10. WDS部署Windows