0

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

$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

有人有想法吗?我在这里做错了什么?

4

2 回答 2

1

必须实施一种方法来确定今天是否启用了 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 真的有点失望。可以想象,公司希望确保他们的员工保持 sim pin 处于启用状态(被盗的情况)。

于 2012-10-05T14:40:39.480 回答
-1

好吧,我想我有一个简单的方法来检测是否必须输入 Sim 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
于 2012-11-08T21:26:46.920 回答