대답은 출처에 있습니다 ... 핀 잠금을 요청하는 속성이 build.prop
또는에 내장되어있는 것 같습니다 default.prop
.
전화선 735와 755 사이 의 TelephonyManager 소스 에있는 참조를 살펴보십시오 .
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 소스의 이름을 주목하십시오. 다른 곳.
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 카드를 떨어 뜨릴 수있는 실수로 핸드셋을 떨어 뜨릴 수 있습니다. 카드 상태를 " 준비 안 됨 "또는 " 알 수 없음 "으로 변경하는 리더 (참고 : system / core / include / cutils / properties.h 및 system / core / toolbox / [ getprop | setprop ] .c)
이제이 시점에서 이론적으로 화면을 잠그기 전에 setprop를 호출하면 일시적으로 우회 될 수 있지만 다시 전화 계층에 의해 재설정 될 수 있습니다! 시도하지 않았습니다! 어느 것이 이것을 이끌고 있습니까?
결론
유일한 방법 이 꺼지고 효과적이다 수 실제로 SIM 카드에 핀 로크 요청을 해제 . 여기에는 전화의 RIL 레이어가 독점적 인 htc / samsung / qualcomm의 라이브러리를 통해이를 읽고 "PIN_REQUIRED"속성이 지속되는 것을 막는 "마법"비트 플래그가 저장되어 있습니다. 안드로이드의 레이어.
가능한 해결 방법은 Android 개발자에게만 해당됩니다. :)
이를 위해서는 소스를 해킹하고 재 컴파일해야합니다.
비행기 모드의 경우 해당 모드로 들어가 비행기 모드를 나갈 때 속성을 2 개로 나눌 수 있으며 , gsm.sim.state 는 그대로 남겨 둘 수 있지만 gsm.sim.state 와 같은 다른 속성을 고안 할 수 있습니다 . airplane.mode 및의 행을 따라 값을 지정 SIM_STATE_PIN_NOT_REQUIRED
하고 비행기 모드 확인을 수정하여 해당 속성을 읽은 다음 속성을 설정 한 경우 핀 대화 상자를 표시하지 마십시오.