Detectar alterações de "Bloquear cartão SIM" em Configurações / Segurança / Configurar bloqueio do cartão SIM

Uma pergunta destinada a Android 4.0.x, de preferência.

Quero detectar imediatamente, ou após alguns segundos, qualquer alteração feitaLock SIM card emSettings > Security > Set up SIM card lock.

Eu tentei 3 métodos:

1) acesso somente leituracom.android.settings Preferências Compartilhadas.

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());
}

Há um aviso no logcat: "Tente ler o arquivo de preferências /data/data/com.android.settings/shared_prefs/com.android.settings_preferences.xml sem permissão". O mapa retornado porgetAll() está vazia.

2)ITelephony.isSimPinEnabled() sempre retorna falso, mesmo quando o PIN do SIM está ativado e definido. Então parece que mudar a configuração não tem absolutamente nada a ver com essa interface. Eu estava pensando em pesquisar a interface, mas isso não é bom também.

3) criar umContentObserver observandoSettings.Secure não está funcionando aqui. Na verdade, lendo o conteúdo desettings.db com o sqlite mostra que não há nenhum registro modificado ao alterar essa configuração. Isto também foi confirmado pelo seguinte código:

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.
}

A única coisa que tenho certeza é que modificar oSIM PIN enabled configuração reescreve o arquivo com.android.settings preferences.xml como mostrado abaixo:

$ 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>

A tag afetada pela alteração ésim_toggle.

Alguém tem alguma ideia? O que eu estou fazendo errado aqui?

questionAnswers(2)

yourAnswerToTheQuestion