Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 希望使用命令行或应用程序内启用和禁用(切换)ADB或USB调试_Android_Adb - Fatal编程技术网

Android 希望使用命令行或应用程序内启用和禁用(切换)ADB或USB调试

Android 希望使用命令行或应用程序内启用和禁用(切换)ADB或USB调试,android,adb,Android,Adb,我试图仅在应用程序运行时启用ADB USB调试,在应用程序未运行时禁用ADB USB调试。我可以完全访问手机,并且它是根目录的,su可用,等等,但是我找不到切换的方法 到目前为止,我所尝试的: Process proc = Runtime.getRuntime().exec(new String [] { "su", "-c", "setprop", "persist.service.adb.enable", "0"}); proc.waitFor(); Process proc2 = Runt

我试图仅在应用程序运行时启用ADB USB调试,在应用程序未运行时禁用ADB USB调试。我可以完全访问手机,并且它是根目录的,su可用,等等,但是我找不到切换的方法

到目前为止,我所尝试的:

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();

但是,这会导致手机立即进入重新启动循环。

有效的代码很简单:

Settings.Secure.putInt(getContentResolver(),Settings.Secure.ADB_ENABLED, 0); // 0 to disable, 1 to enable
编辑/更新: 感谢@MohanT提供以下更新:

但是,应用程序必须是系统应用程序才能使用此功能。为了摆脱必须签署它,建立一个自定义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

根据我的经验,使用setprop并不总是可靠的,甚至可能与设置>应用程序>开发>USB调试选项相冲突。此外,如果启用USB调试但adb不工作等,可能会令人恼火。因此,使用Settings.Secure.adb_enabled是首选方法。。。另外,您总是在状态面板中显示通知

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

此应用程序称为ADB切换。您可以在Google Play中找到它:

此处提供了通过ADB切换访问USB调试设置的库:


Chris的回答是正确的,除了安全类中启用ADB_的字段已贬值,字符串已移动到全局类。所以你可以使用下面的命令-

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

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

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

适用于API 17及以上。 在API 17之前。 使用implicit with action打开开发者选项,用户可以在其中启用或禁用ADB

代码示例:

爪哇

科特林

仅供参考:

API 3之前可能不再适用


问题是,当设置>应用程序>开发>USB调试可用时,为什么要这样做?不要认为您可以实现这一点,因为我已经说过启用USB调试的设置选项。。。只是说,这是一个ROM功能,有人可以很容易地打开它。。。您的应用不必覆盖整个方面:我的应用程序需要打开adb才能正常工作,我只想避免adb因安全风险而全天候运行。如果用户我是唯一的用户,并且在我的应用程序不工作的其他时间,使用根目录、未锁定和su'd手机想要手动打开它,那就没关系了。有人可以使用adb在我的手机上抓取/做任何事情,绕过锁屏,等等,应用程序的目的和我正在尝试做的就是在我的应用程序需要时打开adb,然后在完成时关闭它。如果另一个应用程序或手动切换将其重新打开,则完全没有问题。另外添加:
Settings.Global.putInt(getContentResolver(),Settings.Global.ADB_ENABLED, 0); // 0 to disable, 1 to enable
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)
    }
}