Android sim卡 pin码解锁流程.

sim卡 pin码解锁流程


1、 PIN码解锁界面属于Phone Policy的一部分,代码位置在
\frameworks\base\policy\src\com\android\internal\policy\impl\SimUnlockScreen.java。
当用户输入PIN码按下OK键时,会调用checkPin()函数通过启动一个线程CheckSimPin来调用TelephonyManager的supplyPin()接口,
并注册一个类似于Callback的虚函数onSimLockChangedResponse()并实现之,这样当supplyPin()调用返回时,触发该Callback函数。
通过 CheckSimPin 线程 run()方法ITelephony.Stub.asInterface(ServiceManager.checkService("phone")).supplyPin(mPin);


2、supplyPin()接口的具体实现在PhoneInterfaceManager中,代码位置在packages/apps/Phone/src/com/android/phone/PhoneInterfaceManager.java
supplyPin(string pin)调用==》checkSimPin.unlockSim(null, pin);==》》unlockSim(String puk, String pin)==》》mSimCard.supplyPin(pin, callback);

3、mSimCard 就是\frameworks\base\telephony\java\com\android\internal\telephony\IccCard.java 里调用 supplyPin (String pin, Message onComplete)
==》mPhone.mCM.supplyIccPin(pin, mHandler.obtainMessage(EVENT_PINPUK_DONE, onComplete));
mCM其实就是(\frameworks\base\telephony\java\com\android\internal\telephony\RIL.java)Ril.java文件====》
supplyIccPin(String pin, Message result)===》supplyIccPinForApp(pin, null, result); 这样就可通过RILSender 把命令发给AT,等待RILReciver 响应。


--------------------------------------------------------------------

AT+CPIN?
OK
+CPIN: SIM PIN

AT+CPIN=1234
OK
+CPIN: READY

====================


AT+CPIN=1234,(null) 这个是不对的。4.0上
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要监听 Android 设备的 SIM 卡状态,可以使用 `PhoneStateListener` 类。以下是一个示例代: ```java import android.content.Context; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; public class SimStateReceiver { private static final String TAG = "SimStateReceiver"; private Context mContext; private TelephonyManager mTelephonyManager; private PhoneStateListener mPhoneStateListener; public SimStateReceiver(Context context) { mContext = context; mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); mPhoneStateListener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String phoneNumber) { super.onCallStateChanged(state, phoneNumber); Log.d(TAG, "onCallStateChanged: state = " + state + ", phoneNumber = " + phoneNumber); } @Override public void onServiceStateChanged(ServiceState serviceState) { super.onServiceStateChanged(serviceState); Log.d(TAG, "onServiceStateChanged: serviceState = " + serviceState); } @Override public void onSimStateChanged(int state) { super.onSimStateChanged(state); Log.d(TAG, "onSimStateChanged: state = " + state); switch (state) { case TelephonyManager.SIM_STATE_ABSENT: // SIM 卡不存在或未插入 break; case TelephonyManager.SIM_STATE_NETWORK_LOCKED: // SIM 卡已被网络锁定 break; case TelephonyManager.SIM_STATE_PIN_REQUIRED: // SIM 卡需要 PIN 解锁 break; case TelephonyManager.SIM_STATE_PUK_REQUIRED: // SIM 卡需要 PUK 解锁 break; case TelephonyManager.SIM_STATE_READY: // SIM 卡已准备好 break; case TelephonyManager.SIM_STATE_UNKNOWN: // SIM 卡状态未知 break; } } }; } public void start() { mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIM_STATE); } public void stop() { mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); } } ``` 在上面的代中,我们创建了一个 `SimStateReceiver` 类,它有一个 `start()` 方法和一个 `stop()` 方法,用于开始和停止监听 SIM 卡状态。在 `SimStateReceiver` 的构造方法中,我们创建了一个 `PhoneStateListener` 对象,并重写了其中的 `onSimStateChanged()` 方法,用于监听 SIM 卡状态的变化。在 `onSimStateChanged()` 方法中,我们根据不同的 SIM 卡状态打印不同的日志信息。最后,在 `start()` 方法中,我们通过 `TelephonyManager` 的 `listen()` 方法注册了 `PhoneStateListener` 对象,开始监听 SIM 卡状态。在 `stop()` 方法中,我们通过 `TelephonyManager` 的 `listen()` 方法取消了 `PhoneStateListener` 对象的注册,停止监听 SIM 卡状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值