Cevap kaynakta yatıyor ... Görünüşe göre pin kilidi talep etme özelliği build.prop
ya da içine yerleştirilmiş default.prop
.
TelephonyManager kaynağında 735 ve 755 satırları arasında bulunan referanslara göz atın.
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;
}
}
Anahtar, başka bir yerde , 94 ve 98 satırları arasında TelephonyProperties.PROPERTY_SIM_STATE
atıfta bulunulan anahtardır .
//****** 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";
Makinemdeki kaynak kodunu aradıktan sonra, size bu yöntemin ne sıklıkta getSimState
çağrıldığı fikrini vereceğim , sadece Telefon katmanında değil, Android'de nasıl entegre edildiğine dair ipucu vermek için java kaynağının adlarına dikkat edeceğim. başka yerde.
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() {
Bu dosya adları kilit ekranında ipucu veriyor mu?
teori
Bu, bu noktada kökü gerektirir, çağırarak adb shell
ve çağırarak getprop
ve setprop
bunu yapmak için, tek parça bu, çağırarak
adb shell getprop
ilgili bilgileri aşağıda gösterildiği gibi geri alacak
sh-4.1# getprop
[gsm.sim.state]: [READY]
Bu ince özellik, açılış anından itibaren dinamik olarak bir destek mülk deposunda kalıyor gibi görünüyor ve buna bağlı olarak, şeylerin sayısına, hizmete ve sim kartını devreden çıkarabilecek ahizeyi yanlışlıkla düşürmekten bahsetmiyor. kartın durumunu " hazır değil " veya " bilinmeyen " olarak değiştirecek olan okuyucu . ( ref: sistem / çekirdek / include / cutils / properties.h ve sistem / çekirdek / araç kutusu / [ getprop | setprop ] .c)
Şimdi bu noktada, teorik olarak, ekranı kilitlemeden önce setprop'u çağırarak, geçici olarak atlatılabilir, ancak daha sonra, telefon katmanı tarafından sıfırlanabilir! Bunu denemedim! Hangi buna yol açar ...
Sonuç
Bunun kapatılabilmesinin tek yolu , gerçek sim karttaki pin kilidi talebini etkin bir şekilde devre dışı bırakmaktır . Telefonun RIL katmanının onu özel htc / samsung / qualcomm kütüphanesi aracılığıyla okuduğu ve "PIN_REQUIRED" mülkünün devam etmesini engelleyecek "sihirli" bit bayrağı burada saklanır. Android katmanları.
Yalnızca Android Geliştiricileri için olası bir çözüm :)
Bu, kaynağı hacklemeyi ve yeniden derlemeyi gerektirir.
Uçak modu için, bu moda girerken ve uçak modundan ayrılırken, özellik gsm.sim.state , olduğu gibi bırakılabilir, ancak gsm.sim.state gibi başka bir özellik tasarlayabilir . airplane.mode öğesinin satırları boyunca bir değer atayın SIM_STATE_PIN_NOT_REQUIRED
ve bu özelliği okumak için uçak modu kontrolünü değiştirin ve buna ayarlanmışsa, raptiye iletişim kutusunu göstermeyin, aksi takdirde genellikle olduğu gibi, sor.