4

I'm trying to enable ADB (USB debugging) only when my application is running and disabling it when my application is not. I have full access to the phone and it is rooted, su available, etc., but I cannot find a way to do the toggling.

What I've tried so far:

Process proc = Runtime.getRuntime().exec(new String [] { "su", "-c", "setprop", "persist.service.adb.enable", "0"});
proc.waitFor();
Process proc2 = Runtime.getRuntime().exec(new String [] { "su", "-c", "stop", "adbd"});
proc2.waitFor();

This however causes the phone to enter a reboot loop instantaneously.

4

4 回答 4

12

有效的代码很简单:

Settings.Secure.putInt(getContentResolver(),Settings.Secure.ADB_ENABLED, 0); // 0 to disable, 1 to enable

编辑/更新:感谢@MohanT 提供以下更新:

Settings.Global.putInt(getContentResolver(),Settings.Global.ADB_ENABLED, 0); // 0 to disable, 1 to enable

但是,该应用程序必须是系统应用程序才能使用它。为了摆脱对它的签名,构建一个自定义的 rom 等等。我做了以下事情来让它成为一个系统应用程序。

首先,我使用 eclipse 定期安装它,然后使用 adb shell:

> su
# mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
# cat /data/app/filename.apk > /system/app/filename.apk
# mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system
# reboot
于 2012-07-11T15:18:24.433 回答
5

您可以通过以下步骤来实现:

  1. 检查当前是否启用了 ADB。为此,您可以使用相关的全局常量:

  2. 使用隐式Intent操作Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS打开开发人员选项,用户可以在其中启用或禁用 ADB。

代码示例:

爪哇

public static final int API = Build.VERSION.SDK_INT;
public static final int ENABLED=1, DISABLED=0;

public static boolean adbEnabled(Context context){
    if(API>16)
       return ENABLED == Settings.Global.getInt(context.getContentResolver(), Settings.Global.ADB_ENABLED,DISABLED);
    else 
       return ENABLED == Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.ADB_ENABLED,DISABLED);
}

public void checkAdb(Context context){
    //if ADB disabled
    if(!adbEnabled(context)){
        //open developer options settings 
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
        context.startActivity(intent);
    }
}

科特林

val API = Build.VERSION.SDK_INT
val ENABLED = 1
val DISABLED = 0

fun adbEnabled(context: Context): Boolean {
    return if (API > 16)
        ENABLED == Settings.Global.getInt(context.contentResolver, Settings.Global.ADB_ENABLED, DISABLED)
    else
        ENABLED == Settings.Secure.getInt(context.contentResolver, Settings.Secure.ADB_ENABLED, DISABLED)
}
fun checkAdb(context: Context) {
    //if ADB disabled
    if (!adbEnabled(context)) {
        //open developer options settings
        val intent = Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS)
        context.startActivity(intent)
    }
}

仅供参考:

在 API 3 之前(可能不再相关)Settings.System.ADB_ENABLED被使用。

于 2017-01-09T06:26:12.467 回答
3

克里斯的回答是正确的,除了 Secure 类中的 ADB_EN​​ABLED 字段已被贬值并且字符串已移至 Global 类。所以你可以使用下面的命令 -

Settings.Global.putInt(getContentResolver(),Settings.Global.ADB_ENABLED, 0); // 0 to disable, 1 to enable
于 2014-08-29T22:12:14.883 回答
2

根据我使用 setprop 的经验,它并不总是可靠的,甚至可能与 Settings > Applications > Development > USB Debugging 选项发生冲突。除此之外,如果启用了 USB 调试但 adb 不起作用等,这可能会很烦人。因此,使用 Settings.Secure.ADB_EN​​ABLED 是首选方式......另外,您总是在状态面板中看到通知。

如果您不想在仅尝试访问 Settings.Secure.ADB_EN​​ABLED 时在系统分区上安装应用程序的麻烦,那么您可以依赖另一个已经在执行此工作的应用程序:

这个应用程序叫做 ADB Toggle。您可以在 Google Play 中找到它:

https://play.google.com/store/apps/details?id=com.ramdroid.adbtoggle

通过 ADB Toggle 访问 USB 调试设置的库可在此处获得:

https://github.com/ramdroid/AdbToggleAccessLib

于 2012-09-25T07:46:35.470 回答