答えはソースにあります...ピンロックを要求するプロパティはbuild.prop
またはに組み込まれているようdefault.prop
です。
TelephonyManager sourceの行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
が呼び出される頻度について説明します。テレフォニーレイヤーだけでなく、Android内でどのように統合されているかを知るためのJavaソースの名前に注目してください。他の場所。
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]
この微妙なプロパティは、電源投入の瞬間から動的にバッキングプロパティストアに永続化されているようであり、物事やサービスに基づいてそれに応じて調整されています。カードの状態を「未準備」または「不明」に変更するリーダー。(ref: system / core / include / cutils / properties.h and system / core / toolbox / [ getprop | setprop ] .c)
この時点で、理論的には、画面をロックする前にsetpropを呼び出すことで、一時的に回避できますが、テレフォニーレイヤーによってリセットされる可能性があります。試したことはありません!これはこれにつながります...
結論
唯一の方法これをオフにすることができますが、効果的にすることで、実際のSIMカード上のピンロック要求を無効にします。ここに「マジック」ビットフラグが格納されます。テレフォニーのRILレイヤーは、独自のhtc / samsung / qualcommのライブラリを介してそれを読み取ります。これにより、プロパティ「PIN_REQUIRED」の永続化の伝播が妨げられます。 Androidのレイヤー。
可能な回避策は、Androidデベロッパーのみです:)
これには、ソースをハッキングして再コンパイルする必要があります。
機内モードの場合、そのモードに入ると機内モードを終了するときに、プロパティを2つに分割して、gsm.sim.stateをそのままにすることができますが、このようなgsm.sim.stateなどの別のプロパティを考案できます。 planet.modeとの行に沿って値を割り当てSIM_STATE_PIN_NOT_REQUIRED
、飛行機モードのチェックを変更してそのプロパティを読み取り、それが設定されている場合はピンダイアログボックスを表示しません。それ以外の場合は通常、ダイアログボックスを表示します。