Apakah mungkin untuk menulis ke papan klip perangkat menggunakan ADB?

26

Saya tertarik mempelajari cara menulis ke (dan jika mungkin, membaca dari) clipboard perangkat Android yang sudah di-root.

Saya berharap dapat melakukannya menggunakan ADB melalui USB dan saya tidak tertarik memasang aplikasi apa pun untuk membantu saya melakukan ini, karena ini adalah sesuatu yang saya rencanakan jarang dilakukan.

Setiap saran atau bantuan yang membimbing saya ke arah yang benar akan sangat dihargai.

earthmeLon
sumber
Untuk siapa saja yang mencari pendekatan emulator yang lebih mudah, lihat di sini: stackoverflow.com/questions/3391160/…
Mygod

Jawaban:

21

Ya, Anda sebenarnya bisa melakukan ini. Agak terlihat muram ketika Anda memeriksa clipboard, tapi itu berfungsi dengan baik.

Pertama, Anda dapat memeriksa konten clipboard saat ini dengan service call clipboard 1dari adb shell (atau, tanpa shelling terlebih dahulu, adb shell service call clipboard 1). Awalnya mungkin kosong setelah reboot, misalnya:

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

Anda dapat memasukkan teks ke clipboard menggunakan service call clipboard 2, yang pada dasarnya membutuhkan 3 parameter - dua int dan string yang ingin Anda tempatkan di clipboard:

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

Sejujurnya, saya tidak yakin apa dua parameter pertama itu. Satu jawaban pada Stack Overflow telah menyarankan int pertama adalah "jumlah item dalam paket" (satu dalam hal ini) dan yang kedua adalah panjang string. Namun, saya telah menggunakan 0 untuk parameter kedua dan berfungsi dengan baik, dan saya tidak dapat menemukan dokumentasi yang cocok dengan fungsi khusus ini ... jadi ambillah sesuai nilainya.

Bagaimanapun, itu pada dasarnya membuat objek Parcel dengan 3 bidang, lalu meneruskannya ke clipboard. Clipboard kemudian membongkar Paket dan menetapkan nilai string yang diteruskan sebagai konten clipboard. Anda dapat melihat ini saat Anda mengambil nilai setelahnya:

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

Demikian pula, jika Anda menekan lama pada bidang entri teks dan menekan "Tempel" setelah melakukan ini, Anda akan mendapatkan teks yang ditetapkan melalui call service clipboard 2baris di atas (dan itu akan terlihat sangat normal).

(Contoh di atas berasal dari HTC EVO saya, menjalankan CyanogenMod 7)

eldarerathis
sumber
1
Saya akhirnya dapat menempelkan kunci WPA saya dan terhubung ke router saya: D. Terima kasih.
earthmeLon
3
@earthmeLon jika Anda hanya mencoba menemukan cara mudah untuk menyalin kunci WPA Anda, maka lain kali Anda mungkin merasa lebih mudah untuk melakukan hal-hal seperti mengirim email kepada diri sendiri dan menyalin / menempelkan dari email, atau menyalin file teks yang berisi itu ke Anda perangkat melalui USB, lalu buka dan salin dari sana. Ada opsi lain seperti Wifi Keyboard yang memungkinkan Anda mengetik (atau menempel) dari PC dan membuatnya muncul di telepon.
Diambil
4
Kunci WPA saya sensitif. Seharusnya tidak disiarkan melalui jaringan non-lokal PERNAH. Terima kasih atas sarannya. Saya akan menemukan lebih banyak kegunaan untuk fungsi ini pada akhirnya: D
earthmeLon
6
Saya dapatkan '........U.n.k.n.' 'o.w.n. .p.a.c.k.' 'a.g.e. ..... ')saat membuatcall service clipboard 2
cprcrack
3
Jika Anda perlu menyalin kata sandi atau teks apa pun ke dalam bidang teks di android, Anda juga bisa "abd shell input text 'String'" - Saya telah menyerah di clipboard ...
Philippe
14

Saya menggunakan metodologi ini, dan itu bekerja dengan baik di 4.x, tetapi gagal bagi saya di lollipop. Saat mencari solusi alternatif, saya menemukan ini: /programming/3391160/paste-text-on-android-emulator

ini tidak persis seperti yang Anda inginkan, tetapi bagi saya sendiri, sebagian besar waktu saya ingin menyalin teks ke clipboard adalah karena saya ingin menempelkannya ke bidang kata sandi.

sebagai bonus tambahan, inilah skrip saya ( diedit 2015-04-24 untuk memungkinkan spasi dalam teks ):

#!/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"
galet
sumber
Alasan Anda perlu dua kali lolos dari string adalah karena ada dua cangkang: cangkang Anda, dan cangkang adb . Namun, saya menduga ini akan gagal untuk karakter lain yang memiliki arti khusus di shell, seperti ampersand .
Dan Dascalescu
Sebenarnya akan menjadi tugas adb shell untuk melakukan pelarian dengan benar, tetapi ternyata tidak sepenuhnya. Pada versi saya (1.0.31) pelarian-ruang yang digunakan di atas tidak diperlukan, tetapi semua jenis karakter khusus perlu melarikan diri (tetapi tidak mungkin untuk melakukan ini dengan andal).
Matthijs Kooijman
Cara yang lebih baik untuk menangani karakter khusus adalah menyalurkan melalui stdin, sesuatu seperti: echo "$TEXT" | adb shell xargs -0 input textYang harus menangani teks apa pun, kecuali untuk karakter \ 0 (NUL). Sayangnya, versi adb yang lebih lama tidak meneruskan stdin ke perintah yang ditentukan pada adb commandline. Ini diperbaiki dalam versi adb yang lebih baru, tetapi perlu Android N untuk bekerja .
Matthijs Kooijman
Adapun ruang melarikan diri, ini tampaknya diperlukan untuk inputperintah pada perangkat Android, bukan untuk shell yang digunakan oleh adb shell. Juga, itu hanya diperlukan untuk SDK versi 22 dan di bawah (Lollipop dan di bawah, saya percaya) sesuai dengan jawaban ini .
Matthijs Kooijman
4

Berikut versi skrip yang diperbaiki oleh galet di atas. Seperti halnya skrip itu, skrip tidak menulis ke clipboard, tetapi mengirimkan input ke bidang input yang saat ini terfokus, yang seringkali merupakan apa yang Anda inginkan.

Skrip ini ditingkatkan untuk menghindari karakter khusus agar tidak membingungkan shell Android dengan mereka. Ini harus memungkinkan string apa pun untuk dikirim tidak berubah. Untuk mencegah readperintah menafsirkan backslash (trailing), saya menambahkan -r di sana.

Ini diuji menggunakan daftar karakter khusus berikut:

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

Ini skripnya:

#!/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"
Matthijs Kooijman
sumber
3

Saya telah mencoba dan googled sedikit dan tampaknya pendekatan layanan panggilan-clipboard berhenti bekerja di Android yang lebih baru, itu gagal bagi saya pada Android versi 4.4.4. Yaitu Anda akan memerlukan aplikasi untuk mendapatkan akses clipboard (baca dan tulis) dari adb-shell. Saya menggunakan clipper dari majido di github . Apk juga dihosting, jadi Anda tidak perlu mengompilasinya sendiri. Saat diinstal, Anda dapat berkomunikasi dengan menggunakan perintah broadcast (aplikasi akan memberi tahu Anda perintah yang tepat). Aplikasi tidak memerlukan root.

Sascha N.
sumber
Karena kami tidak tahu apa tujuan Anda : bisakah Anda mengedit posting Anda dan memasukkan apa yang aplikasi itu lakukan, dan bagaimana orang seharusnya menggunakannya? Orang-orang sudah mulai menandai pos Anda sebagai "bukan jawaban", karena mereka jelas kehilangan poin yang ingin Anda sampaikan. Terima kasih sebelumnya!
Izzy
Clipper bekerja lebih baik untuk saya daripada menggunakan 'adb shell input text'. Bahkan lebih baik daripada skrip Python, AdbPaste github.com/gcb/AdbPaste untuk membungkus 'adb shell input text'. Saya meningkatkan clipper untuk mendukung parameter file, jadi saya sekarang dapat mengirim beberapa halaman ke clipboard hanya dalam satu atau dua detik. Kode yang disempurnakan di sini: github.com/RoundSparrow/clipper
RoundSparrow hilltx
0

Skrip lain yang digunakan adb shell inputuntuk mengirim karakter dapat ditemukan di sini: https://github.com/gcb/AdbPaste

Ini adalah skrip Python yang dapat diklon dari github, atau juga langsung diunduh dan dijalankan:

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