-->

检测设置“锁定SIM卡”的更改/安全性/设置SIM卡锁(Detect changes of “Loc

2019-06-25 19:13发布

旨在Android的一个问题优选4.0.x的。

我想立即检测,或几秒钟后,所做的任何变更,以Lock SIM cardSettings > 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,即使在SIM PIN启用并设定。 所以会出现更改设置有绝对无关,与这个接口。 我想查询的接口,但是这是没有不太妙。

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文件,如下所示:

$亚行外壳猫/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

有没有人有一个想法? 我在做什么错在这里?

Answer 1:

不得不实施办法FINDE出来,如果SimPin今天启用。 该ITelephony.isSimPinEnabled()返回总是对我假了。 没有尝试你所描述的其他方法。

我找到了一种方法来获得当前设置:

  • 首先,你需要获得一个proxyPhone对象,如何可以做到这一点可以看到这里的保持: 能否在telephony.Phone对象通过SDK进行实例化?

  • 然后你可以检索IccCard-对象,并在此执行方法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(+?),但在其他线程提到的,你必须运行此代码为手机用户/作为电话的过程。

真的有点失望的是,没有公共API / deviceAdmin的API,用于这一点。 可以想像,公司的希望,以确保他们聘用过的员工保持启用SIM卡的PIN(盗窃的情况下)。



Answer 2:

嗯,我想我有一个简单的方法来检测一个SIM卡的PIN必须输入。 最重要是的是通过SDK avaliable。 你可以在运行这个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


文章来源: Detect changes of “Lock SIM card” in Settings/Security/Set up SIM card lock