Обнаружение изменений "Блокировка SIM-карты" в меню "Настройки" / "Безопасность" / "Настройка блокировки SIM-карты"
Вопрос нацеленный на Android 4.0.x желательно.
Я хочу немедленно или через несколько секунд обнаружить любые изменения, внесенные в Lock SIM card
в Settings > Security > Set up SIM card lock
,
Я попробовал 3 метода:
1) доступ только для чтения com.android.settings
общие предпочтения.
Context settings = getApplicationContext().createPackageContext("com.android.settings", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences prefSettings = settings.getSharedPreferences("com.android.settings_preferences", MODE_WORLD_READABLE);
Map<String, ?> allSettings = prefSettings.getAll();
for(String s : allSettings.keySet()){
//do somthing like String value=allSettings.get(s).toString());
}
В logcat есть предупреждение: "Попытка прочитать файл настроек /data/data/com.android.settings/shared_prefs/com.android.settings_preferences.xml без разрешения". Карта, возвращенная getAll()
пустой.
2) ITelephony.isSimPinEnabled()
всегда возвращает false, даже если PIN-код SIM-карты включен и установлен. Таким образом, изменение настроек не имеет абсолютно никакого отношения к этому интерфейсу. Я думал об опросе интерфейса, но это тоже не хорошо.
3) создание ContentObserver
наблюдения Settings.Secure
здесь не работает На самом деле, читая содержание settings.db
с sqlite показывает, что ни одна запись не была изменена при изменении этого параметра. Это также было подтверждено следующим кодом:
try {
int lockPattern = android.provider.Settings.Secure.getInt(getContentResolver(), android.provider.Settings.Secure.LOCK_PATTERN_ENABLED);
// check lock Pattern: 0=disabled, 1=enabled
} catch (SettingNotFoundException e) {
e.printStackTrace(); // on run, we reach this line.
}
Единственное, что я уверен, это то, что изменение SIM PIN enabled
настройка переписывает файл com.android.settings preferences.xml, как показано ниже:
$ adb shell cat /data/data/com.android.settings/shared_prefs/com.android.settings_preferences.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="sim_toggle" value="true" />
<string name="sim_pin"></string>
</map>
Тег, затронутый изменением, sim_toggle
,
У кого-нибудь есть идея? Что я здесь не так делаю?
2 ответа
Пришлось реализовать способ выяснить, включен ли SimPin сегодня. ITelephony.isSimPinEnabled() всегда возвращал мне и ложь. Не пробовал другие методы, которые вы описали.
Я нашел способ получить текущие настройки:
Во-первых, вам нужно получить объект proxyPhone, как это можно сделать, можно увидеть здесь: Может ли объект telephony.Phone быть реализован через SDK?
Затем вы можете извлечь IccCard-Object и выполнить для этого метод getIccLockEnabled.
Код:
Object proxyPhone = PhoneUtil.getProxyPhoneInstance(this);
Class<?> phone = Class.forName("com.android.internal.telephony.Phone");
Method getIccCardMethod = phone.getDeclaredMethod("getIccCard");
Object iccCard = getIccCardMethod.invoke(proxyPhone);
Class<?> iccCardClass = Class.forName("com.android.internal.telephony.IccCard");
Method getIccLockEnabled = iccCardClass.getDeclaredMethod("getIccLockEnabled");
Boolean isIccLockEnabled = (Boolean) getIccLockEnabled.invoke(iccCard);
у меня работает на Android 2.3(+?), но, как уже упоминалось в другом потоке, вы должны запускать этот код как phone-user/ как phone-process.
Действительно разочарован тем, что для этого нет общедоступного API / устройства Admin-Api. Могли бы представить, что компании хотят, чтобы их сотрудники оставляли SIM-код включенным (случай кражи).
Ну, я думаю, у меня есть простой способ определить, нужно ли вводить PIN-код сима. Лучше всего это доступно через SDK. Вы можете запустить это в PhoneStateListener
...
public static boolean isSimPinRequired(){
TelephonyManager m = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (m.getSimState() == TelephonyManager.SIM_STATE_PIN_REQUIRED) return true;
return false;
}//end method