Câu trả lời nằm ở nguồn ... có vẻ như là thuộc tính để yêu cầu khóa pin được tích hợp vào build.prop
hoặc default.prop
.
Hãy xem tham chiếu được tìm thấy trong nguồn TelephonyManager , giữa các dòng 735 và 755. Để cho ngắn gọ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;
}
}
Chìa khóa được TelephonyProperties.PROPERTY_SIM_STATE
đề cập ở nơi khác , giữa các dòng 94 và 98.
//****** 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";
Sau khi tìm kiếm thông qua mã nguồn ở đây trên máy của tôi, tôi sẽ cho bạn biết mức độ thường xuyên của phương thức getSimState
này, hãy chú ý tên của nguồn java để tìm hiểu về cách nó được tích hợp trong Android, không chỉ trong lớp Telephony mà là nơi khác
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() {
Những tên tập tin đó có cho một manh mối, yup, trong màn hình khóa ...
Học thuyết
Điều này đòi hỏi root vào thời điểm này, bằng cách gọi adb shell
và gọi getprop
và setprop
để làm điều này, phần duy nhất là cái này, bằng cách gọi
adb shell getprop
sẽ lấy lại thông tin thích hợp như hình dưới đây
sh-4.1# getprop
[gsm.sim.state]: [READY]
Tài sản tinh tế này dường như vẫn tồn tại một cách linh hoạt trong một cửa hàng tài sản sao lưu, kể từ thời điểm bật nguồn và được điều chỉnh cho phù hợp, dựa trên số lượng vật phẩm, dịch vụ và không đề cập đến việc vô tình làm rơi chiếc điện thoại có thể làm mất thẻ sim đầu đọc của nó sẽ thay đổi trạng thái của thẻ thành " chưa sẵn sàng " hoặc " chưa biết ". ( ref: system / core / include / cutils / property.h và system / core / toolbox / [ getprop | setprop ] .c)
Bây giờ, về mặt lý thuyết, bằng cách gọi setprop trước khi khóa màn hình, nó có thể bị phá vỡ tạm thời, nhưng sau đó, một lần nữa, điều đó có thể được đặt lại bởi lớp điện thoại! Đừng thử điều đó! Điều này dẫn đến điều này ...
Phần kết luận
Cách duy nhất có thể tắt, là vô hiệu hóa yêu cầu khóa pin trên thẻ sim thực tế . Đó là nơi lưu trữ cờ bit "ma thuật" trên đó, trong đó lớp RIL của điện thoại đọc nó thông qua thư viện htc / samsung / Qualcomm độc quyền và điều đó sẽ ngăn chặn sự tồn tại của tài sản "PIN_REQUIRED" thông qua các lớp của Android.
Một cách giải quyết khả thi, chỉ dành cho Nhà phát triển Android :)
Điều này sẽ yêu cầu hack và biên dịch lại nguồn.
Đối với chế độ máy bay, khi vào chế độ đó và rời khỏi chế độ máy bay, tài sản có thể được tách ra thành hai, GSM.sim.state có thể được giữ nguyên, nhưng nghĩ ra một thuộc tính khác, như thế này, GSM.sim.state. Airplane.mode và gán một giá trị dọc theo các dòng SIM_STATE_PIN_NOT_REQUIRED
và sửa đổi kiểm tra chế độ máy bay, để đọc thuộc tính đó và nếu được đặt thành đó, không hiển thị hộp thoại pin, nếu không, thường sẽ nhắc nó.