【问题标题】:Foolproof way to detect if developer options are enabled?检测是否启用了开发人员选项的万无一失的方法?
【发布时间】:2020-08-10 21:14:19
【问题描述】:

我使用此代码来检测手机上是否启用了开发者选项:

int developerOptions = Settings.Secure.getInt(this.getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED , 0);

但是,我对此进行了测试,但它在少数设备上返回了错误的值(一些华为手机和其他...)

是否有另一种完整的证明方法来检测设备中是否启用了开发者选项?

我试过了,但它不起作用(我不想使用那个方法,因为它不优雅,我只是在测试):

try 
{
    startActivityForResult(new Intent(android.provider.Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS), 8080);
    finishActivity(8080);
    // Developer options enabled
} 
catch (Exception e) 
{
    // Developer options disabled
}

我的应用的最低 API 级别是 21。

我查看了this question 和 SO 上的其他类似内容,但我没有找到完整的解决方案。这不是重复的问题。

【问题讨论】:

  • 如果您在华为手机上获取或记录Settings.Global.DEVELOPMENT_SETTINGS_ENABLED 的值,与其他工作手机相比,您能告诉我您得到什么String 吗?如果我是正确的,这可能是由于中国手机的本地化
  • @HarryTimothy 不幸的是,我个人没有华为,我的用户向我报告了这个问题。

标签: java android


【解决方案1】:

您无法做到比 Android 本身更万无一失:

 public static boolean isDevelopmentSettingsEnabled(Context context) {
    final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
    final boolean settingEnabled = Settings.Global.getInt(context.getContentResolver(),
            Settings.Global.DEVELOPMENT_SETTINGS_ENABLED,
            Build.TYPE.equals("eng") ? 1 : 0) != 0;
    final boolean hasRestriction = um.hasUserRestriction(
            UserManager.DISALLOW_DEBUGGING_FEATURES);
    final boolean isAdmin = um.isAdminUser();
    return isAdmin && !hasRestriction && settingEnabled;
}

您的代码很接近,但没有考虑到 Build.TYPE.equals("eng") ? 1:0)

【讨论】:

  • 你不需要那部分.. UserManagerService 并不意味着可见。你只需要: boolean settingEnabled = Settings.Global.getInt(context.getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, Build.TYPE.equals("eng") ? 1 : 0) != 0; - 如果调用用户不是管理员用户,其余的只是反转真实值。
  • 感谢您的帮助。但是,在我的模拟器(Pixel 2 API 24)上,代码没有检测到开发人员选项已启用。你可以试试看。 (转到“关于设备”并点击“内部版本号”7 次以激活开发者选项)专门在 Pixel 2 API 24 上试用。
  • 模拟器和安卓不是100%一样,所以我不会把它作为测试用例。我给你的代码实际上是来自开发人员选项设置的代码,这意味着 AOSP 本身就是这样知道是否启用了开发选项。对于不属于这种概括的特定设备(或模拟器),我建议反编译他们的设置应用程序并将其与 AOSP 源进行比较。
  • 好的,谢谢!我会和我的用户一起测试这段代码,然后我会回复你。
  • 我会给你赏金。不过,我仍在等待用户的反馈。
【解决方案2】:

在模拟器上测试的最低 API 17

public boolean isDeveloperModeEnabled(){
    if (Integer.valueOf(android.os.Build.VERSION.SDK) >= 17) {
        return android.provider.Settings.Secure.getInt(getActivity().getApplicationContext().getContentResolver(),
                android.provider.Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
    }
    return false;
}

【讨论】:

    【解决方案3】:

    试试下面的代码:

    int devOptions = Settings.Secure.getInt(this.getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED,
    Build.TYPE.equals("eng") ? 1 : 0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      相关资源
      最近更新 更多