android Sim卡鎖定 pin解鎖流程學習
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解鎖流程學習相关推荐
- android app unlock sim pin,android Sim卡锁定 pin解锁流程学习
1.Android自帶的pin解鎖部份在framework/base/policy/src/com/android/internal/policy/impl/SimUnlockScreen.java ...
- android Sim卡锁定 pin解锁流程学习
1.Android自帶的pin解鎖部份在framework/base/policy/src/com/android/internal/policy/impl/SimUnlockScreen.java ...
- SIM卡的密码PIN与PUK密码PIN
SIM卡(Subscriber Identity Module) ,即用户识别卡,是全球通数字移动电话的一张个人资料卡.它采用A 级加密方法制作,存储着用户的数据.鉴权方法及密钥,可供GSM系统对用户 ...
- android sim卡联系人存储格式,如何在Android设备上将联系人复制到SIM卡
如何将联系人复制到SIM卡 以下部分是将联系人从计算机和Android手机存储卡复制到Android上的SIM卡的简单步骤.准备?让我们开始吧. 步骤1.安装并运行此Android管理器 开始时,在您 ...
- android+已移除sim卡,如何从Android SIM卡中删除/删除/擦除联系人
作者:Selena Komez11月更新了20,2017 "我的兄弟是一个空白的经理,他在他的Android SIM卡上保存了数千个客户名称和电话号码.但是,现在为了保护客户的隐私,他需要将 ...
- Android sim卡 pin码解锁流程.
sim卡 pin码解锁流程 1. PIN码解锁界面属于Phone Policy的一部分,代码位置在 \frameworks\base\policy\src\com\android\internal\p ...
- android sim卡分析,Android 判断SIM卡属于哪个移动运营商详解及实例
Android 判断SIM卡属于哪个移动运营商 第一种方法: 获取手机的IMSI码,并判断是中国移动\中国联通\中国电信 TelephonyManager telManager = (Telephon ...
- android sim卡槽,包教包会,十分钟让你搞定与或卡槽
包教包会,十分钟让你搞定与或卡槽 2016-04-29 11:48:20 27点赞 83收藏 35评论 前言:很多手机厂商为了节省成本都会选择与或卡槽,美其名曰节省内部空间,让你的手机更薄,也有华为m ...
- Android SIM 卡信息加载流程
在PhoneAPP启动关系类初始化中,我们提到监听处理SIM卡状态的两个关键类UiccController和IccCardProxy UiccController:整个UICC事务处理的入口,负责对外 ...
最新文章
- 详解zabbix中文版安装部署
- java wait定时_java定时器的使用(Timer)
- python财务报表分析-浅谈利用Python分析财报找到值得投资的好公司的想法
- python编写购物程序_Python实现购物程序思路及代码
- Symfony2Book03:使用Symfony2创建页
- 吴裕雄 19-Mysql 连接的使用
- Visual Studio 2019 preview中体验C# 8.0新语法
- dosbox edit.exe 如何使用_宅家30天,2万字节java高级工程师面试题解析,如何斩获阿里p7...
- Spring与Struts框架整合
- linux mtp设备,这么烂的MTP 为何现在所有Android设备都不能不用
- masaic 数据增强代码
- 优化Nginx的处理性能
- 【论文】哈工大SCIR Lab | EMNLP 2019 基于BERT的跨语言上下文相关词向量在零样本依存分析中的应用...
- 基于RFID的图书馆管理
- 尚学堂马士兵java多线程部分笔记
- 数学建模基础理论【二】(定积分)
- 8月第2周基金排行榜 | TokenInsight
- 天宝数字水准仪数据格式转换
- ​​商朝是广西骆越人北上建立的政权,是骆越文化的延续
- yahoo,hotmail邮箱无法收到邮件