この質問と回答の組み合わせで@Paradopolisと@Geobitsに感謝します(賛成票を投じて)。@Geobits が正しい答えを出しました。誰かが詳細な要約とそのオプションのステータスを取得/設定する方法を必要とする場合、私は私のものを投稿しています。
PACKAGE_VERIFIER_ENABLE
は API レベル 14 で最初に定義され、"verifier_enable"
値は 未満android.provider.Settings.Secure
です。
API レベル 14 (4.0.1_r1):
public static final String PACKAGE_VERIFIER_ENABLE = "verifier_enable";
API レベル 17 以降、その値と定義クラスが変更されました。その値は"package_verifier_enable"
以下になりました。android.provider.Settings.Global
API レベル 17 (4.2_r1):
public static final String PACKAGE_VERIFIER_ENABLE = "package_verifier_enable";
PACKAGE_VERIFIER_ENABLE
プロパティはパブリックに定義されていますが、その定義で注釈によって隠されています。Settings.Secure.PACKAGE_VERIFIER_ENABLE
したがって、またはとして使用することはできませんSettings.Global.PACKAGE_VERIFIER_ENABLE
が、その値を使用することはできます。
パッケージの検証がチェックされているかチェックされていないか、またはプログラムでチェック/チェック解除されているかどうかを判断する必要がある場合は、以下のクラスを使用できます。
public abstract class DeviceSettings {
public enum SettingsCheckStatus {
CHECKED, UNCHECKED, UNDEFINED
}
public static SettingsCheckStatus isVerifyAppsChecked(Context context) {
// PACKAGE_VERIFIER_ENABLE is added after API level 14.
// Its value changed at API level 17
int packageVerifierEnabledAsInt = -1;
if (Build.VERSION.SDK_INT >= 17) {
packageVerifierEnabledAsInt = Settings.Global.getInt(context.getContentResolver(), "package_verifier_enable", -1);
} else if (Build.VERSION.SDK_INT >= 14) {
packageVerifierEnabledAsInt = Settings.Secure.getInt(context.getContentResolver(), "verifier_enable", -1);
} else {
// No package verification option before API Level 14
}
SettingsCheckStatus settingsCheckStatus = SettingsCheckStatus.UNDEFINED;
switch (packageVerifierEnabledAsInt) {
case 0:
settingsCheckStatus = SettingsCheckStatus.UNCHECKED;
break;
case 1:
settingsCheckStatus = SettingsCheckStatus.CHECKED;
break;
default:
break;
}
return settingsCheckStatus;
}
/**
*
* @param context
* @param checked
* @return
*
* You must add <b>android.permission.WRITE_SECURE_SETTINGS</b> to your application's manifest file to use this method.
* Keep in mind, lint error checking may show an error on your manifest. <a href="http://stackoverflow.com/questions/13801984/permission-is-only-granted-to-system-app">See link to solve it.</a> <br>
* Note that, this method <b>can only work on rooted devices or if your application is going to be a system app.<b>
*
*/
public static boolean setVerifyAppsChecked(Context context, boolean checked) {
boolean operationCompletedSuccessfully = false;
int packageVerifierEnabledAsInt = checked ? 1 : 0;
try {
if (Build.VERSION.SDK_INT >= 17) {
operationCompletedSuccessfully = Settings.Global.putInt(context.getContentResolver(), "package_verifier_enable", packageVerifierEnabledAsInt);
} else if (Build.VERSION.SDK_INT >= 14) {
operationCompletedSuccessfully = Settings.Secure.putInt(context.getContentResolver(), "verifier_enable", packageVerifierEnabledAsInt);
} else {
// No package verification option before API Level 14
}
} catch (Throwable t) {
// Your device is not rooted or your app is not a system app.
}
return operationCompletedSuccessfully;
}
}