Android 检测设置/安全/设置SIM卡锁定中“锁定SIM卡”的更改

Android 检测设置/安全/设置SIM卡锁定中“锁定SIM卡”的更改,android,settings,sim-card,Android,Settings,Sim Card,最好是针对安卓4.0.x的问题 我想立即或几秒钟后,在“设置”>“安全”>“设置SIM卡锁定”中检测对锁定SIM卡所做的任何更改 我尝试了3种方法: 1访问只读com.android.settings共享首选项 Context settings = getApplicationContext().createPackageContext("com.android.settings", Context.CONTEXT_IGNORE_SECURITY); SharedPreferences pref

最好是针对安卓4.0.x的问题

我想立即或几秒钟后,在“设置”>“安全”>“设置SIM卡锁定”中检测对锁定SIM卡所做的任何更改

我尝试了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());
}
我唯一确定的是,修改SIM PIN启用设置会重写com.android.settings preferences.xml文件,如下所示:

$adb贝壳猫 /data/data/com.android.settings/shared_prefs/com.android.settings_preferences.xml

受更改影响的标签为sim_toggle


有人有主意吗?我在这里做错了什么?

必须实现一种方法来确定SimPin是否在今天启用。 对于我来说,ITelephony.isSimPinEnabled也总是返回false。没有尝试你描述的其他方法

我找到了获取当前设置的方法:

首先,您需要获得proxyPhone对象,这里可以看到如何实现这一点:

然后,您可以检索IccCard对象,并在此对象上执行getIccLockEnabled方法

代码:

在Android 2.3+上对我有效,但正如在另一个线程中提到的,您必须以电话用户/电话进程的身份运行此代码


真的有点失望,没有公共api/设备管理员api。可以想象,公司希望确保他们的员工保持sim pin码的启用状态,以防被盗。

好吧,我想我有一个简单的方法来检测是否必须输入sim pin码。最重要的是,它可以通过SDK提供。你可以在一个


我对我的目标有了更好的了解:我想捕捉内部/电话/IccCard类事件事件\u更改\u设施\u锁定\u完成。有办法做到这一点吗?三个注册人名单中似乎没有一个能胜任这项工作。我将测试你的提案。它似乎符合我的要求,因为我使用的是运行在进程com.android.phone中的外部模块。事实上,我已经有一个ITelephony对象在里面了。PhoneUtil类在Android SDK中还存在吗?我找不到任何相关文件。
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.
}
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="sim_toggle" value="true" />
<string name="sim_pin"></string>
</map>
  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);
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