5 Stimmen

Aktivieren und Deaktivieren (Umschalten) von ADB oder USB-Debugging über die Befehlszeile oder in der Anwendung

Ich versuche, ADB (USB-Debugging) nur zu aktivieren, wenn meine Anwendung läuft, und es zu deaktivieren, wenn meine Anwendung nicht läuft. Ich habe vollen Zugriff auf das Telefon und es ist verwurzelt, su verfügbar usw., aber ich kann keine Möglichkeit finden, die Umschaltung vorzunehmen.

Was ich bis jetzt ausprobiert habe:

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

Dies führt jedoch dazu, dass das Telefon sofort eine Neustartschleife durchläuft.

12voto

Chris Punkte 733

Der Code, der funktioniert, ist einfach:

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

Bearbeiten/Aktualisieren: Dank an @MohanT für das folgende Update:

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

Allerdings muss die App eine System-App sein, um dies nutzen zu können. Um aus mit zu unterzeichnen, bauen eine benutzerdefinierte rom, usw. zu bekommen. Ich habe das Folgende getan, um es zu einer System-App zu machen.

Zuerst habe ich es regelmäßig mit eclipse installiert, dann mit 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

5voto

Nikita Kurtin Punkte 5299

Dies können Sie mit den folgenden Schritten erreichen:

  1. Prüfen Sie, ob ADB derzeit aktiviert ist. Dazu können Sie eine entsprechende globale Konstante verwenden:

  2. Implizit verwenden Intent con Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS um die Entwickleroptionen zu öffnen, in denen der Benutzer ADB aktivieren oder deaktivieren kann.

Code-Beispiel:

Java

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

Kotlin

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

Nur zur Information:

Vor API 3 (wahrscheinlich nicht mehr relevant) Settings.System.ADB_ENABLED verwendet wurde.

3voto

mohan.t Punkte 257

Die Antwort von Chris ist korrekt, außer dass das Feld ADB_ENABLED in der Klasse Secure veraltet ist und die Zeichenfolge in die Klasse Global verschoben wurde. Sie können also den folgenden Befehl verwenden -

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

2voto

ramdroid Punkte 6598

Nach meinen Erfahrungen funktioniert setprop nicht immer zuverlässig und kann sogar mit der Option Einstellungen > Anwendungen > Entwicklung > USB-Debugging in Konflikt geraten. Außerdem kann es irritierend sein, wenn z.B. USB-Debugging aktiviert ist, aber adb nicht funktioniert usw. Daher ist die Verwendung von Settings.Secure.ADB_ENABLED der bessere Weg... und man hat immer eine Benachrichtigung in der Statusleiste.

Wenn Sie sich nicht die Mühe machen wollen, Ihre Anwendung auf der Systempartition zu installieren, wenn Sie nur auf Settings.Secure.ADB_ENABLED zugreifen wollen, können Sie sich stattdessen auf eine andere Anwendung verlassen, die diese Arbeit bereits erledigt:

Diese Anwendung heißt ADB Toggle. Sie können es in Google Play finden:

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

Die Bibliothek für den Zugriff auf USB-Debug-Einstellungen über ADB Toggle ist hier verfügbar:

https://github.com/ramdroid/AdbToggleAccessLib

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X