0

できれば Android 4.0.x を対象とした質問です。

Lock SIM cardin に加えられた変更をすぐに、または数秒後に検出したい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 に次の警告があります。によって返されるマップgetAll()は空です。

2) ITelephony.isSimPinEnabled()SIM PIN が有効で設定されている場合でも、常に false を返します。したがって、設定を変更しても、このインターフェイスとはまったく関係がないようです。インターフェースをポーリングしようと思っていましたが、これもダメです。

3)ContentObserver観測の作成Settings.Secureはここでは機能しません。実際、settings.dbsqlite の内容を読むと、この設定を変更したときに変更されたレコードがないことがわかります。これは、次のコードでも確認されました。

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を返しました。あなたが説明した他の方法を試しませんでした。

現在の設定を取得する方法を見つけました:

  • まず、proxyPhoneオブジェクトを取得する必要があります。これを行う方法については、次のとおりです。telephony.Phoneオブジェクトを 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(+?)で動作しますが、他のスレッドで説明されているように、このコードをphone-user/phone-processとして実行する必要があります。

このためのパブリックAPI/deviceAdmin-Apiがないことに本当にちょっとがっかりしました。企業が、従業員がSIMピンを有効にしておくことを保証したいと考えていると想像できます(盗難の場合)。

于 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 に答える