È possibile scrivere negli Appunti di un dispositivo usando ADB?


26

Sono interessato a imparare come scrivere (e, se possibile, leggere) dagli Appunti di un dispositivo Android con root.

Spero di farlo usando ADB su USB e non mi interessa installare alcuna app per aiutarmi a fare questo, poiché è qualcosa che raramente intendo fare.

Qualsiasi suggerimento o aiuto che mi guidi nella giusta direzione sarebbe molto apprezzato.


Per tutti coloro che sta cercando più facile si avvicina per gli emulatori, vedere qui: stackoverflow.com/questions/3391160/...
MyGod

Risposte:


21

Sì, in realtà puoi farlo. È un po 'kludgy quando si ispezionano gli appunti, ma funziona bene.

Prima di tutto, puoi ispezionare il contenuto degli appunti corrente con service call clipboard 1da una shell adb (o, senza shell in primo luogo adb shell service call clipboard 1). Potrebbe iniziare inizialmente vuoto dopo un riavvio, ad esempio:

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

Puoi inserire il testo negli appunti usando service call clipboard 2, che in pratica accetta 3 parametri: due ints e la stringa che vuoi mettere negli appunti:

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

Ad essere onesti, non sono sicuro di quali siano i primi due parametri. Una risposta su Stack Overflow ha suggerito che il primo int è "numero di articoli nel pacco" (uno in questo caso) e che il secondo è la lunghezza della stringa. Tuttavia, ho usato 0 per il secondo parametro e funziona benissimo, e non riesco a trovare alcuna documentazione corrispondente a questa particolare funzione ... quindi prendilo per quello che vale.

In ogni caso, sta fondamentalmente creando un oggetto Parcel con 3 campi, quindi passandolo negli Appunti. Gli Appunti quindi scompattano il pacchetto e impostano il valore di stringa passato come contenuto degli Appunti. Puoi vederlo quando vai a recuperare il valore in seguito:

# 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                   '........        ')
#

Allo stesso modo, se si preme a lungo su un campo di immissione testo e si preme "Incolla" dopo aver fatto ciò, si otterrà il testo impostato tramite la call service clipboard 2riga sopra (e sembrerà completamente normale).

(Gli esempi precedenti provengono dal mio HTC EVO, con CyanogenMod 7)


1
Posso finalmente incollare la mia chiave WPA e connettermi al mio router: D. Grazie.
earthmeLon

3
@earthmeLon se stavi solo cercando di trovare un modo semplice per copiare la tua chiave WPA, la prossima volta potresti trovare più facile fare qualcosa come mandarla via e-mail a te e copiare / incollare da e-mail o copiare un file di testo che lo contiene sul tuo dispositivo tramite USB, quindi aprire e copiare da lì. Esistono altre opzioni come la tastiera Wifi che ti consente di digitare (o incollare) da un PC e visualizzarlo sul telefono.
GAThrawn

4
La mia chiave WPA è sensibile. Non dovrebbe mai essere trasmesso su alcuna rete non locale MAI. Grazie per i suggerimenti @GAThrawn.
Troverò

6
Ricevo '........U.n.k.n.' 'o.w.n. .p.a.c.k.' 'a.g.e. ..... ')quando call service clipboard 2
faccio

3
Nel caso in cui tu abbia bisogno di copiare la tua password o qualsiasi testo in un campo di testo su Android, potresti anche "abd shell input text 'String'" - Ho rinunciato agli appunti ...
Philippe

14

Ho usato questa metodologia, e ha funzionato bene in 4.x, ma non è riuscito per me in Lollipop. Mentre cercavo una soluzione alternativa, ho trovato questo: /programming/3391160/paste-text-on-android-emulator

non è esattamente come lo volevi, ma per me, la maggior parte delle volte che voglio copiare il testo negli appunti è perché voglio incollarlo nel campo della password.

come bonus aggiuntivo, ecco la mia sceneggiatura ( modificata il 24-04-2015 per consentire spazi nel testo ):

#!/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"

Il motivo per cui è necessario sfuggire doppiamente alla stringa è che esistono due shell: la shell e la shell adb . Tuttavia, sospetto che questo fallirà per altri personaggi che hanno un significato speciale nella shell, come la e commerciale .
Dan Dascalescu,

In realtà sarebbe compito della shell adb eseguire correttamente questa evasione, ma a quanto pare non lo è completamente. Nella mia versione (1.0.31) l'escaping dello spazio usato sopra non è necessario, ma tutti i tipi di caratteri speciali avrebbero bisogno di uscire (ma è impossibile farlo in modo affidabile).
Matthijs Kooijman,

Un modo migliore per gestire caratteri speciali sarebbe quello di reindirizzare lo stdin, qualcosa del tipo: echo "$TEXT" | adb shell xargs -0 input textChe dovrebbe gestire qualsiasi testo, tranne i caratteri \ 0 (NUL). Sfortunatamente, le versioni precedenti di adb non inoltrano stdin a un comando specificato nella riga di comando di adb. Questo è stato risolto nelle versioni più recenti ADB, ma ha bisogno di Android N per il lavoro .
Matthijs Kooijman,

Per quanto riguarda la fuga di spazio, questo è apparentemente necessario per il inputcomando sul dispositivo Android, non per la shell utilizzata da adb shell. Inoltre, è necessario solo per SDK versione 22 e precedenti (Lollipop e inferiori, credo) secondo questa risposta .
Matthijs Kooijman,

4

Ecco una versione migliorata della sceneggiatura dei galets sopra. Come per quello script, non scrive negli appunti, ma invia input al campo di input attualmente focalizzato, che spesso è comunque quello che vuoi.

Questo script è stato migliorato per sfuggire a caratteri speciali per evitare di confondere la shell Android con loro. Ciò dovrebbe consentire a qualsiasi stringa di essere inviata invariata. Per impedire al readcomando di interpretare una barra rovesciata (finale), ho aggiunto -r lì.

Questo è stato testato usando il seguente elenco di caratteri speciali:

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

Ecco la sceneggiatura:

#!/bin/bash
# Send text to android device using adb, emulating keyboard input.
# Based on a script from /android//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 /programming//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"

3

Ho provato e ho cercato su Google un po 'e sembra che l'approccio call-service-appunti ha smesso di funzionare nei nuovi androidi, non è riuscito per me su una versione 4.4.4 Android. Cioè avrai bisogno di un'app per ottenere l'accesso agli appunti (lettura e scrittura) da adb-shell. Uso un tagliatore di Majido su Github . Anche l'apk è ospitato, quindi non è necessario compilarlo da soli. Una volta installato, è possibile comunicare ad esso utilizzando i comandi di trasmissione (l'app ti dirà i comandi esatti). L'app non richiede root.


Poiché non sappiamo quale sia il tuo scopo: potresti modificare il tuo post e includere ciò che fa quell'app e come si suppone di usarlo? Le persone iniziano già a contrassegnare il tuo post come "non una risposta", poiché ovviamente mancano il punto che vuoi fare. Grazie in anticipo!
Izzy

clipper ha funzionato meglio per me rispetto all'uso di "adb shell input text". Ancora meglio dello script Python AdbPaste github.com/gcb/AdbPaste per avvolgere "adb shell input text". Ho migliorato il clipper per supportare un parametro di file, quindi ora posso inviare più pagine negli appunti in un secondo o due. Codice avanzato qui: github.com/RoundSparrow/clipper
RoundSparrow hilltx

0

Un altro script che utilizza adb shell inputper inviare caratteri è disponibile qui: https://github.com/gcb/AdbPaste

Questo è uno script Python che può essere clonato da github o anche scaricato ed eseguito direttamente:

$ wget https://github.com/gcb/AdbPaste/raw/master/AdbPaste.py
$ chmod a+x AdbPaste.py
$ ./AdbPaste.py "some text to paste"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.