最好是针对Android 4.0.x的问题。
我想立即或几秒钟后检测对Lock SIM card
所做的任何更改 Settings > 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/com.android.settings/shared_prefs/com.android.settings_preferences.xml"。getAll()
返回的地图为空。
2) ITelephony.isSimPinEnabled()
始终返回 false,即使启用并设置了 SIM 码也是如此。因此,更改设置似乎与此界面完全无关。我正在考虑轮询界面,但这也不好。
3)创建观察Settings.Secure
ContentObserver
在这里不起作用。实际上,使用 sqlite 读取settings.db
的内容会显示在更改此设置时没有修改任何记录。以下代码也证实了这一点:
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首选项.xml文件,如下所示:
$adb贝壳猫 /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
。
有人有想法吗?我在这里做错了什么?
必须实现一种方法来确定 SimPin 是否今天已启用。ITelephony.isSimPinEnabled() 也总是为我返回 false。没有尝试您描述的其他方法。
我找到了一种获取当前设置的方法:
-
首先,您需要掌握一个代理电话对象,如何做到这一点可以在这里看到:可以打电话。手机对象是否通过 SDK 实例化?
-
然后你可以检索 IccCard-Object,并在此执行方法 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卡引脚启用(盗窃情况)。
好吧,我想我有一个简单的方法来检测是否必须输入 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