【问题标题】:Changing Android Device Admin Settings更改 Android 设备管理员设置
【发布时间】:2013-08-02 15:51:21
【问题描述】:

如果你进入你的安卓设备设置->安全,在设备管理部分有一些验证应用的设置。

在开发 AOSP 时,我试图让一些测试软件工作。因此,其中一部分需要我启用和禁用此功能。我已经有了禁用其他一些功能的代码,它们看起来像这样:

    //Allow mock locations
    Settings.Secure.putInt(getContentResolver(),
            Settings.Secure.ALLOW_MOCK_LOCATION, 
            1);

    //Stay on while plugged in
    Settings.Global.putInt(getContentResolver(),
            Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 
            BatteryManager.BATTERY_PLUGGED_USB);

注意* 我以 root 身份运行,因此我可以更改这些设置。所以澄清一下,我的问题是如何更改设置验证应用程序,它位于哪里?

【问题讨论】:

    标签: android root android-source


    【解决方案1】:

    您正在寻找Settings.Global.PACKAGE_VERIFIER_ENABLE。它似乎没有出现在文档站点上,但您可以在源代码中看到它。

    定义:

    android.provider.Settings.java

    默认设置应用的使用示例:

    com.android.settings.SecuritySettings.java

    【讨论】:

    • 你明白了。我只是在查看源代码,就是这样。它被列为 HIDE,因此您无法访问它,但如果您可以从构建中获取框架 jar 的副本,则可以访问所有隐藏的内容。
    【解决方案2】:

    感谢(赞成)@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 之后,它的值和定义的类发生了变化。它的值在android.provider.Settings.Global 下变成了"package_verifier_enable"

    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;
        }
    }
    

    【讨论】:

    • 嗨@Devrim,我有问题,发在这里stackoverflow.com/questions/42132239。我检查了您在此处建议的内容,以了解是否启用或禁用了包验证设置。但看起来没什么用。它总是返回 1。您是否有任何解决方法来禁用/启用应用验证程序?
    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多