答案在于源……似乎是请求锁定的属性内置于build.prop
或中default.prop
。
看看在TelephonyManager 源中找到的参考,在第735和755行之间。为简便起见,
public int getSimState() {
String prop = SystemProperties.get(TelephonyProperties.PROPERTY_SIM_STATE);
if ("ABSENT".equals(prop)) {
return SIM_STATE_ABSENT;
}
else if ("PIN_REQUIRED".equals(prop)) {
return SIM_STATE_PIN_REQUIRED;
}
else if ("PUK_REQUIRED".equals(prop)) {
return SIM_STATE_PUK_REQUIRED;
}
else if ("NETWORK_LOCKED".equals(prop)) {
return SIM_STATE_NETWORK_LOCKED;
}
else if ("READY".equals(prop)) {
return SIM_STATE_READY;
}
else {
return SIM_STATE_UNKNOWN;
}
}
关键是在94和98行之间的其他TelephonyProperties.PROPERTY_SIM_STATE
位置引用的。
//****** SIM Card
/**
* One of <code>"UNKNOWN"</code> <code>"ABSENT"</code> <code>"PIN_REQUIRED"</code>
* <code>"PUK_REQUIRED"</code> <code>"NETWORK_LOCKED"</code> or <code>"READY"</code>
*/
static String PROPERTY_SIM_STATE = "gsm.sim.state";
在我的机器上搜索了源代码之后,我将为您提供getSimState
调用此方法的频率的想法,注意一下Java源代码的名称,以了解如何将其集成到Android中,而不仅仅是在Telephony层中,别处。
services/java/com/android/server/am/BatteryStatsService.java 219: int simState = TelephonyManager.getDefault().getSimState();
telephony/java/android/telephony/TelephonyManager.java 523: public int getSimState() { 551: * @see #getSimState 562: * @see getSimState
policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java 478: public IccCard.State getSimState() {
policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java 545: final IccCard.State state = mUpdateMonitor.getSimState();
policy/src/com/android/internal/policy/impl/LockPatternKeyguardViewProperties.java 57: final IccCard.State simState = mUpdateMonitor.getSimState();
policy/src/com/android/internal/policy/impl/LockScreen.java 273: mStatus = getCurrentStatus(updateMonitor.getSimState());
policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java 173: && (mUpdateMonitor.getSimState() == IccCard.State.ABSENT); 217: final IccCard.State simState = mUpdateMonitor.getSimState(); 469: && (mUpdateMonitor.getSimState() != IccCard.State.PUK_REQUIRED)) { 512: secure = mUpdateMonitor.getSimState() == IccCard.State.PIN_REQUIRED 513: || mUpdateMonitor.getSimState() == IccCard.State.PUK_REQUIRED; 643: final IccCard.State simState = mUpdateMonitor.getSimState(); 662: final IccCard.State simState
= mUpdateMonitor.getSimState();
policy/tests/src/com/android/internal/policy/impl/LockPatternKeyguardViewTest.java 49: public IccCard.State getSimState() {
在锁定屏幕上,这些文件名是否有提示?
理论
这需要根在这一点上,通过调用adb shell
和调用getprop
,并setprop
要做到这一点,只有一部分是这样的,通过调用
adb shell getprop
将会取回相关信息,如下所示
sh-4.1# getprop
[gsm.sim.state]: [READY]
从上电之时起,这种微妙的属性似乎就动态地保留在了后备属性存储中,并且根据事物,服务的数量进行了相应的调整,更不用说意外掉下手机了,这可能会使SIM卡退出它的读卡器会将卡的状态更改为“ 未就绪 ”或“ 未知 ”。(ref: system / core / include / cutils / properties.h和system / core / toolbox / [ getprop | setprop ] .c)
现在,从理论上讲,此时,在锁定屏幕之前调用setprop可以暂时绕开它,但是话又可以通过电话层将其重置!还没有尝试过!这导致了...
结论
可以关闭此功能的唯一方法是有效禁用实际sim卡上的密码锁定请求。那是存储“魔术”位标志的地方,电话的RIL层通过专有的htc / samsung / qualcomm的库将其读入,这将阻止扩展“ PIN_REQUIRED”属性的持久性Android的各层。
可能的解决方法,仅适用于Android开发人员:)
这将需要破解并重新编译源代码。
对于飞行模式,进入该模式并离开飞行模式时,可以将属性拆分为两个,可以按原样保留gsm.sim.state,但可以设计另一个属性,例如gsm.sim.state。 aircraft.mode并沿的方向分配一个值SIM_STATE_PIN_NOT_REQUIRED
,然后修改飞行器模式检查以读取该属性,如果设置为该属性,则不显示“销钉”对话框,否则通常会提示该对话框。