Вопрос по android, settings, sim-card – Обнаружение изменений «Блокировка SIM-карты» в меню «Настройки» / «Безопасность» / «Настройка блокировки SIM-карты»

0

Вопрос нацеленный на 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 есть предупреждение: & quot; Попытка прочитать файл настроек /data/data/com.android.settings/shared_prefs/com.android.settings_preferences.xml без разрешения & quot ;. Карта, возвращенная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.

У кого-нибудь есть идея? Что я здесь не так делаю?

Мне удалось лучше понять, что я собираюсь сделать: я хочу запечатлеть событие класса внутренней / телефонии / IccCard EVENT_CHANGE_FACILITY_LOCK_DONE. Есть ли способ сделать это? Похоже, что один из трех списков владельцев доменов не справляется с этой задачей. slash33

Ваш Ответ

2   ответа
-1

я думаю, у меня есть простой способ определить, нужно ли вводить 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
1

ITelephony.isSimPinEnabled () также всегда возвращал false для меня. Не пробовал другие методы, которые вы описали.

Я нашел способ получить текущие настройки:

First you need to get hold of a proxyPhone Object, how this can be done can be seen here: Can a telephony.Phone object be instantiated through the sdk?

Then you can retrieve the IccCard-Object and on this execute the method 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-код включенным (случай кражи).

Я собираюсь проверить ваше предложение. Кажется, это соответствует моим требованиям, так как я использую внешний модуль, запущенный в процессе com.android.phone. На самом деле, у меня уже есть объект ITelephony там. slash33
Класс PhoneUtil все еще существует в Android SDK? Я не смог найти никакой соответствующей документации.

Похожие вопросы