我正在尝试仅在我的应用程序运行时启用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();
然而,这会导致手机瞬间进入重启循环。
答案 0 :(得分: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
答案 1 :(得分:4)
您可以通过以下步骤来实现:
检查ADB当前是否已启用。为此,您可以使用相关的全局常量:
Settings.Global.ADB_ENABLED
。Settings.Secure.ADB_ENABLED
。使用隐式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
。
答案 2 :(得分:3)
Chris的答案是正确的,但Secure类中的ADB_ENABLED字段已被折旧且字符串已移至Global类。所以你可以使用下面的命令 -
Settings.Global.putInt(getContentResolver(),Settings.Global.ADB_ENABLED, 0); // 0 to disable, 1 to enable
答案 3 :(得分:2)
根据我使用setprop的经验并不总是可靠,甚至可能与设置&gt;冲突。应用程序&gt;开发&gt; USB调试选项。除此之外,如果启用了USB调试但adb不能正常工作等,它可能会很烦人。因此,使用Settings.Secure.ADB_ENABLED是首选方式...此外,您始终在状态面板中显示通知。
如果您只想尝试访问Settings.Secure.ADB_ENABLED而不想在系统分区上安装应用程序时遇到麻烦,那么您可以依赖另一个已经完成此项工作的应用程序:
此应用程序称为ADB Toggle。您可以在Google Play中找到它:
https://play.google.com/store/apps/details?id=com.ramdroid.adbtoggle
可通过ADB Toggle访问USB调试设置的库: