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.
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 1
aus 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 2
Zeile oben festgelegt wurde (und er sieht völlig normal aus).
(Die obigen Beispiele stammen von meinem HTC EVO mit CyanogenMod 7)
'........U.n.k.n.' 'o.w.n. .p.a.c.k.' 'a.g.e. ..... ')
beim machencall service clipboard 2
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"
echo "$TEXT" | adb shell xargs -0 input text
Das 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 .input
Befehl 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 read
Befehl 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.
Ein weiteres Skript, das adb shell input
zum 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"
Mein Gott