Detect "Lock SIM card" changes in "Settings / Security" / "Lock SIM card lock"

A question focused on Android 4.0.x is desirable.

I want to immediately or after a few seconds detect any change made Lock SIM cardto Settings > Security > Set up SIM card lock.

I tried 3 methods:

1) read-only access to general settings 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());
}

There is a warning in logcat: "Try to read the settings file /data/data/com.android.settings/shared_prefs/com.android.settings_preferences.xml without permission." Card returned getAll()is empty.

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.

- ? ?

0
2

, SimPin . ITelephony.isSimPinEnabled() false . , .

:

:

  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 (+?), , , -/ .

, , api/deviceAdmin-Api. , , - ( ).

+1

, , , PIN- Sim. 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

All Articles