检测开发者选项是否已启用的绝佳方法?

huangapple go评论113阅读模式
英文:

Foolproof way to detect if developer options are enabled?

问题

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

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);
    // 开发者选项已启用
} 
catch (Exception e) 
{
    // 开发者选项已禁用
}

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

我查看了这个问题和其他类似的Stack Overflow问题,但我没有找到一个绝对可靠的解决方案。这不是重复问题。

英文:

I use this code to detect if developer options are enabled on a phone or not:

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

However, I tested this and it returns the wrong value on a small number devices (some Huawei phones and others...)

Is there another full proof way to detect if developer options are enabled in a device?

I tried this but it doesn't work (I don't want to use that method anyway because it's not elegant, I'm just testing around):

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

My app's minimum API level is 21.

I've taken a look at this question and other similiar ones on SO but I didn't find a fullproof solution. This is not a duplicate question.

答案1

得分: 7

你无法做得比Android本身更加 foolproof:

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) 部分。

英文:

You can't do it any more foolproof than Android itself does it:

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

Your code was close, but didn't account for
Build.TYPE.equals("eng") ? 1 : 0)

答案2

得分: 0

Here's the translated code:

Min 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;
}
英文:

Min API 17 tested on emulator

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

得分: 0

尝试以下代码:

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

Try the code below:

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

huangapple
  • 本文由 发表于 2020年8月11日 05:14:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/63348116.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定