Ist es möglich, mit ADB in die Zwischenablage eines Geräts zu schreiben?

Ich möchte lernen, wie man in die Zwischenablage eines gerooteten Android-Geräts schreibt (und wenn möglich liest).

Ich hoffe, dies mit ADB über USB zu tun, und ich bin nicht daran interessiert, Apps zu installieren, die mir dabei helfen, da ich dies selten vorhabe.

Irgendwelche Vorschläge oder Hilfe, die mich in die richtige Richtung führt, würde sehr geschätzt werden.

Für alle, die nach einfacheren Ansätzen für Emulatoren suchen, siehe hier: stackoverflow.com/questions/3391160/…

Antworten (5)

Ja, das kann man tatsächlich. Es sieht etwas klobig aus, wenn Sie die Zwischenablage untersuchen, aber es funktioniert einwandfrei.

Zunächst einmal können Sie den aktuellen Inhalt der Zwischenablage mit service call clipboard 1aus einer Adb-Shell (oder ohne vorheriges Shellen mit adb shell service call clipboard 1) überprüfen. Es kann nach einem Neustart zunächst leer beginnen, zum Beispiel:

# service call clipboard 1
Result: Parcel(
  0x00000000: 00000000 00000001 00000000 00000000 '................'
  0x00000010: 00000000 00000000                   '........        ')
#

Sie können Text in die Zwischenablage einfügen, indem Sie verwenden service call clipboard 2, was im Grunde 3 Parameter benötigt - zwei Ints und die Zeichenfolge, die Sie in die Zwischenablage einfügen möchten:

# service call clipboard 2 i32 1 i32 0 s16 "Hi there"
Result: Parcel(00000000    '....')

Um ehrlich zu sein, bin ich mir nicht sicher, was die ersten beiden Parameter sind. Eine Antwort auf Stack Overflow hat vorgeschlagen, dass das erste int "Anzahl der Elemente im Paket" (in diesem Fall eins) und das zweite die Länge der Zeichenfolge ist. Ich habe jedoch 0 für den zweiten Parameter verwendet und es funktioniert gut, und ich kann keine Dokumentation finden, die mit dieser bestimmten Funktion übereinstimmt ... also nehmen Sie das für das, was es wert ist.

In jedem Fall wird im Grunde ein Parcel-Objekt mit 3 Feldern erstellt und dann in die Zwischenablage übergeben. Die Zwischenablage entpackt dann das Paket und legt den übergebenen Zeichenfolgenwert als Inhalt der Zwischenablage fest. Sie können dies sehen, wenn Sie danach den Wert abrufen:

# service call clipboard 1
Result: Parcel(
  0x00000000: 00000000 00000001 00000000 00000008 '................'
  0x00000010: 00690048 00740020 00650068 00650072 'H.i. .t.h.e.r.e.'
  0x00000020: 00000000 00000000                   '........        ')
#

Wenn Sie in ähnlicher Weise lange auf ein Texteingabefeld drücken und danach auf "Einfügen" klicken, erhalten Sie den Text, der über die call service clipboard 2Zeile oben festgelegt wurde (und er sieht völlig normal aus).

(Die obigen Beispiele stammen von meinem HTC EVO mit CyanogenMod 7)

Endlich kann ich meinen WPA-Schlüssel einfügen und mich mit meinem Router verbinden :D. Danke schön.
@earthmeLon Wenn Sie nur versucht haben, einen einfachen Weg zum Kopieren Ihres WPA-Schlüssels zu finden, finden Sie es beim nächsten Mal möglicherweise einfacher, ihn per E-Mail an sich selbst zu senden und aus der E-Mail zu kopieren / einzufügen oder eine Textdatei, die ihn enthält, auf Ihren zu kopieren Gerät über USB, dann öffnen und von dort kopieren. Es gibt andere Optionen wie die WLAN-Tastatur , mit der Sie von einem PC aus tippen (oder einfügen) und es auf dem Telefon anzeigen können.
Mein WPA-Schlüssel ist sensibel. Es sollte NIEMALS über ein nicht-lokales Netzwerk gesendet werden. Danke für die Vorschläge @GAThrawn. Irgendwann werde ich mehr Verwendung für diese Funktionalität finden: D
Das Kopieren einer Datei über USB ist lokal
bekomme ich '........U.n.k.n.' 'o.w.n. .p.a.c.k.' 'a.g.e. ..... ')beim machencall service clipboard 2
schade das geht nicht mehr
Aus diesem verwandten Beitrag geht hervor, dass diese zusätzlichen Parameter möglicherweise Paketname und etwas anderes sein müssen?
Weißt du zufällig, was das Äquivalent für Lollipop ist? Dieser Befehl funktionierte in Kitkat, aber nicht mehr in Lollipop
Falls Sie Ihr Passwort oder einen beliebigen Text in ein Textfeld auf Android kopieren müssen, können Sie auch "abd Shell-Eingabetext 'String'" eingeben - ich habe die Zwischenablage aufgegeben ...

Ich habe diese Methode verwendet, und sie hat in 4.x gut funktioniert, ist aber bei Lollipop für mich gescheitert. Bei der Suche nach einer alternativen Lösung habe ich Folgendes gefunden: https://stackoverflow.com/questions/3391160/paste-text-on-android-emulator

Es ist nicht genau so, wie Sie es wollten, aber für mich selbst möchte ich Text meistens in die Zwischenablage kopieren, weil ich ihn in das Passwortfeld einfügen möchte.

Als zusätzlichen Bonus ist hier mein Skript ( bearbeitet am 24.04.2015, um Leerzeichen im Text zuzulassen ):

#!/bin/bash

if [[ "$1" != "" ]]
then
    TEXT=$1
else
    read -s -p "Enter text you want to insert: " TEXT
fi

ESCAPED_TEXT=`echo $TEXT | sed "s/\s/\%s/g"`
adb shell input text "$ESCAPED_TEXT"
Der Grund, warum Sie die Zeichenfolge doppelt maskieren müssen, ist, dass es zwei Shells gibt: Ihre Shell und die adb-Shell . Ich vermute jedoch, dass dies für andere Zeichen fehlschlagen wird, die in der Shell eine besondere Bedeutung haben, wie das kaufmännische Und .
Es wäre eigentlich die Aufgabe der adb-Shell, dieses Escaping richtig durchzuführen, aber anscheinend tut es das nicht vollständig. In meiner Version (1.0.31) wird das oben verwendete Leerzeichen nicht benötigt, aber alle Arten von Sonderzeichen müssten maskiert werden (aber es ist unmöglich, dies zuverlässig zu tun).
Ein besserer Weg, Sonderzeichen zu handhaben, wäre, stdin zu durchlaufen, etwa so: echo "$TEXT" | adb shell xargs -0 input textDas sollte jeden Text verarbeiten, mit Ausnahme von \0 (NUL)-Zeichen. Leider leiten ältere adb-Versionen stdin nicht an einen Befehl weiter, der in der adb-Befehlszeile angegeben ist. Dies ist in neueren adb-Versionen behoben, aber es benötigt Android N, um zu funktionieren .
Das Leerzeichen wird anscheinend für den inputBefehl auf dem Android-Gerät benötigt, nicht für die von adb shell. Außerdem wird es laut dieser Antwort nur für SDK-Version 22 und niedriger (Lollipop und niedriger, glaube ich) benötigt .

Hier ist eine verbesserte Version des Skripts von galets oben. Wie bei diesem Skript schreibt es nicht in die Zwischenablage, sondern sendet Eingaben an das aktuell fokussierte Eingabefeld, was häufig ohnehin gewünscht ist.

Dieses Skript wurde verbessert, um Sonderzeichen zu maskieren, um zu verhindern, dass die Android-Shell mit ihnen verwechselt wird. Dies sollte ermöglichen, dass jede Zeichenfolge unverändert gesendet wird. Um zu verhindern, dass der readBefehl einen (nachgestellten) Backslash interpretiert, habe ich dort -r hinzugefügt.

Dies wurde mit der folgenden Liste von Sonderzeichen getestet:

./adb-send-string ' \`~!@#$%^&*()-_=+[{]}|;:",<.>/?'\'

Hier ist das Skript:

#!/bin/bash
# Send text to android device using adb, emulating keyboard input.
# Based on a script from https://android.stackexchange.com/a/105881/223695
# extended to support special characters

if [[ "$1" != "" ]]
then
    TEXT="$1"
else
    read -s -r -p "Enter text you want to insert: " TEXT
fi

escape() {
    # Encapsulate the string in $'', which enables interpretation of
    # \xnn escapes in the string. This is not POSIX-sh, but an extension
    # documented by bash and also supported by the Android sh.
    echo -n "$'"

    # Process each character in $1 one by one
    for (( i=0 ; i<${#1}; i++ )); do
        # Extract the i'th character
        C="${1:$i:1}"
        if [ "$C" = ' ' ]; then
            # Encode spaces as %s, which is needed for Android's
            # "input text" command below 6.0 Marshmellow
            # See https://stackoverflow.com/documentation/android/9408/adb-shell/3958/send-text-key-pressed-and-touch-events-to-android-device-via-adb
            echo -n '%s'
        else
            # Encode everything else as \xnn, to prevent them from being
            # interpreted by the Android shell
            printf '\\x%02x' "'$C"
        fi
    done
    # Terminate the $''
    echo -n "'"
}

ESCAPED_TEXT=`escape "$TEXT"`
adb shell input text "$ESCAPED_TEXT"

Ich habe ein bisschen versucht und gegoogelt und es scheint, dass der Call-Service-Clipboard-Ansatz in neueren Androiden nicht mehr funktioniert, er ist bei mir auf einer Android-Version 4.4.4 fehlgeschlagen. Das heißt, Sie benötigen eine App, um Zugriff auf die Zwischenablage (Lesen und Schreiben) von Adb-Shell zu erhalten. Ich verwende Clipper von Majido auf Github . Die APK wird ebenfalls gehostet, sodass Sie sie nicht selbst kompilieren müssen. Nach der Installation können Sie mit Broadcast-Befehlen kommunizieren (die App teilt Ihnen die genauen Befehle mit). Die App erfordert kein Root.

Da wir Ihren Zweck nicht kennen: Könnten Sie bitte Ihren Beitrag bearbeiten und angeben, was diese App tut und wie man sie verwenden soll? Die Leute fangen bereits an, Ihren Beitrag als „keine Antwort“ zu kennzeichnen, da sie offensichtlich den Punkt verfehlen, den Sie ansprechen möchten. Danke im Voraus!
clipper hat für mich besser funktioniert als die Verwendung von 'adb shell input text'. Sogar besser als das Python-Skript AdbPaste github.com/gcb/AdbPaste , um „adb shell input text“ zu umschließen. Ich habe Clipper verbessert, um einen Dateiparameter zu unterstützen, sodass ich jetzt mehrere Seiten in nur ein oder zwei Sekunden in die Zwischenablage senden kann. Erweiterter Code hier: github.com/RoundSparrow/clipper

Ein weiteres Skript, das adb shell inputzum Senden von Zeichen verwendet wird, finden Sie hier: https://github.com/gcb/AdbPaste

Dies ist ein Python-Skript, das von github geklont oder auch direkt heruntergeladen und ausgeführt werden kann:

$ wget https://github.com/gcb/AdbPaste/raw/master/AdbPaste.py
$ chmod a+x AdbPaste.py
$ ./AdbPaste.py "some text to paste"