33 votes

Est-il possible d'écrire dans le presse-papiers d'un appareil en utilisant ADB ?

J'aimerais apprendre à écrire dans le presse-papiers d'un appareil Android enraciné (et si possible à le lire).

J'espère le faire en utilisant ADB sur USB et je ne suis pas intéressé par l'installation d'une application pour m'aider à le faire, car c'est quelque chose que je prévois de faire rarement.

Toute suggestion ou aide pour me guider dans la bonne direction serait grandement appréciée.

0 votes

Pour tous ceux qui cherchent des approches plus faciles pour les émulateurs, voyez ici : stackoverflow.com/questions/3391160/

23voto

David Negron Points 971

Oui, vous pouvez vraiment le faire. C'est un peu bizarre quand on inspecte le presse-papiers, mais ça marche très bien.

Tout d'abord, vous pouvez inspecter le contenu actuel du presse-papiers avec service call clipboard 1 à partir d'un shell adb (ou, sans se connecter au préalable, adb shell service call clipboard 1 ). Il peut être vide au départ après un redémarrage, par exemple :

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

Vous pouvez mettre du texte dans le presse-papiers en utilisant service call clipboard 2 qui prend essentiellement 3 paramètres - deux ints et la chaîne de caractères que vous voulez mettre dans le presse-papiers :

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

Pour être honnête, je ne suis pas sûr de ce que sont les deux premiers paramètres. Une réponse sur Stack Overflow a suggéré que le premier int est le "nombre d'articles dans le colis" (un dans ce cas) et que le second est la longueur de la chaîne. Cependant, j'ai utilisé 0 pour le deuxième paramètre et cela fonctionne bien, et je ne peux pas trouver de documentation qui corresponde à cette fonction particulière... donc prenez cela pour ce que ça vaut.

Dans tous les cas, il s'agit essentiellement de créer un objet Parcel avec 3 champs, puis de le passer dans le presse-papiers. Le presse-papiers dépaquette alors le Parcel et définit la valeur de la chaîne passée dans le presse-papiers comme le contenu du presse-papiers. Vous pouvez le constater lorsque vous récupérez la valeur par la suite :

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

De même, si vous appuyez longuement sur un champ de saisie de texte et que vous cliquez sur "Coller" après avoir fait cela, vous obtiendrez le texte qui a été défini via l'option call service clipboard 2 ligne ci-dessus (et cela aura l'air tout à fait normal).

(Les exemples ci-dessus proviennent de mon HTC EVO, exécutant CyanogenMod 7)

1 votes

Je peux enfin coller ma clé WPA et me connecter à mon routeur :D. Merci.

3 votes

@earthmeLon si vous essayez juste de trouver un moyen facile de copier votre clé WPA, alors la prochaine fois vous trouverez plus facile de faire quelque chose comme vous l'envoyer par email et copier/coller depuis l'email, ou copier un fichier texte le contenant sur votre appareil via USB, puis l'ouvrir et le copier depuis là. Il existe d'autres options comme Clavier Wifi qui vous permettent de taper (ou coller) depuis un PC et de le faire apparaître sur le téléphone.

4 votes

Ma clé WPA est sensible. Elle ne doit pas être diffusée sur un réseau non local, JAMAIS. Merci pour les suggestions @GAThrawn. Je finirai par trouver d'autres utilisations pour cette fonctionnalité :D

21voto

JacquesB Points 19878

J'ai utilisé cette méthodologie, et cela a bien fonctionné dans 4.x, mais a échoué pour moi dans lollipop. En cherchant une solution alternative, j'ai trouvé ceci : https://stackoverflow.com/questions/3391160/paste-text-on-Android-emulator

Ce n'est pas exactement comme vous le vouliez, mais pour ma part, la plupart du temps, je veux copier du texte dans le presse-papiers parce que je veux le coller dans le champ du mot de passe.

En prime, voici mon script ( édité le 2015-04-24 pour permettre les espaces dans le texte ) :

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

0 votes

La raison pour laquelle vous devez doublement échapper la chaîne est que il y a deux shells : votre shell, et le shell adb . Cependant, je pense que cela échouera pour d'autres caractères qui ont une signification spéciale dans l'interpréteur de commandes, comme le caractère esperluette .

0 votes

Ce serait en fait la tâche du shell adb de faire correctement cet échappement, mais apparemment il ne le fait pas complètement. Dans ma version (1.0.31), l'échappement des espaces utilisé ci-dessus n'est pas nécessaire, mais toutes sortes de caractères spéciaux devraient être échappés (mais il est impossible de le faire de manière fiable).

0 votes

Une meilleure façon de gérer les caractères spéciaux serait de passer par stdin, quelque chose comme : echo "$TEXT" | adb shell xargs -0 input text qui devrait traiter n'importe quel texte, sauf \0 (NUL). Malheureusement, les anciennes versions d'adb ne transmettent pas stdin à une commande spécifiée sur la ligne de commande adb. Ce problème est corrigé dans les versions plus récentes d'adb, mais il nécessite Android N pour fonctionner .

4voto

Matthijs Kooijman Points 141

Voici une version améliorée du script de Galets ci-dessus. Comme avec ce script, il n'écrit pas dans le presse-papiers, mais envoie l'entrée dans le champ de champ de saisie actuellement focalisé, ce qui est souvent ce que vous voulez de toute façon.

Ce script est amélioré pour échapper aux caractères spéciaux afin d'empêcher de confondre le shell Android avec eux. Cela devrait permettre à n'importe quelle chaîne d'être envoyée inchangée. Pour éviter que le read d'interpréter une commande (arrière), j'ai ajouté -r ici.

Ceci a été testé en utilisant la liste suivante de caractères spéciaux :

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

Voici le script :

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

3voto

Sascha N. Points 31

J'ai essayé et googlé un peu et il semble que l'approche call-service-clipboard-approche a cessé de fonctionner dans les androïdes plus récents, il a échoué pour moi sur une version 4.4.4 Android. C'est à dire que vous aurez besoin d'une application pour obtenir l'accès au presse-papiers (lecture et écriture) depuis adb-shell. J'utilise clipper de majido sur github . L'apk est également hébergé, vous n'avez donc pas besoin de le compiler vous-même. Une fois installé, vous pouvez communiquer avec lui en utilisant des commandes de diffusion (l'application vous indiquera les commandes exactes). L'application ne nécessite pas de Root.

0 votes

Comme nous ne savons pas ce que votre L'objectif est le suivant : pourriez-vous s'il vous plaît modifier votre post et inclure ce que fait cette application, et comment on est supposé l'utiliser ? Les gens commencent déjà à marquer votre message comme "pas une réponse", car ils ne comprennent manifestement pas ce que vous voulez dire. Merci d'avance !

0 votes

Clipper a mieux fonctionné pour moi que l'utilisation de 'adb shell input text'. Encore mieux que le script Python AdbPaste. github.com/gcb/AdbPaste pour envelopper "adb shell input text". J'ai amélioré clipper pour supporter un paramètre de fichier, donc je peux maintenant envoyer plusieurs pages dans le presse-papiers en seulement une ou deux secondes. Le code amélioré est ici : github.com/RoundSparrow/clipper

2voto

Matthijs Kooijman Points 141

Un autre script qui utilise adb shell input pour envoyer des caractères peut être trouvée ici : https://github.com/gcb/AdbPaste

Il s'agit d'un script Python qui peut être cloné à partir de github, ou aussi directement téléchargé et exécuté :

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

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X