เป็นไปได้ไหมที่จะเขียนไปยังคลิปบอร์ดของอุปกรณ์โดยใช้ ADB


26

ฉันสนใจที่จะเรียนรู้วิธีเขียน (และถ้าเป็นไปได้อ่านจาก) คลิปบอร์ดของอุปกรณ์ Android ที่รูท

ฉันหวังว่าจะทำเช่นนั้นโดยใช้ ADB ผ่าน USB และฉันไม่สนใจที่จะติดตั้งแอพใด ๆ เพื่อช่วยฉันทำสิ่งนี้เพราะนี่เป็นสิ่งที่ฉันวางแผนจะทำ

ข้อเสนอแนะหรือช่วยแนะนำฉันในทิศทางที่ถูกต้องจะได้รับการชื่นชมอย่างมาก


สำหรับใครก็ตามที่กำลังมองหาวิธีที่ง่ายกว่าสำหรับอีมูเลเตอร์ดูที่นี่: stackoverflow.com/questions/3391160/…
Mygod

คำตอบ:


21

ใช่คุณสามารถทำได้จริง มันเป็นสิ่งที่มอง kludgy เมื่อคุณตรวจสอบคลิปบอร์ด แต่มันใช้ได้ดี

ก่อนอื่นคุณสามารถตรวจสอบเนื้อหาของคลิปบอร์ดปัจจุบันด้วยservice call clipboard 1จาก adb shell (หรือโดยไม่ต้อง shelling ก่อนadb shell service call clipboard 1) มันอาจเริ่มว่างในตอนแรกหลังจากรีบูตตัวอย่างเช่น:

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

คุณสามารถใส่ข้อความลงในคลิปบอร์ดโดยใช้service call clipboard 2ซึ่งโดยทั่วไปจะใช้ 3 พารามิเตอร์ - สอง ints และสตริงที่คุณต้องการวางบนคลิปบอร์ด:

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

พูดตามตรงฉันไม่แน่ใจว่าพารามิเตอร์สองตัวแรกคืออะไร หนึ่งคำตอบใน Stack Overflowได้แนะนำ int แรกคือ "จำนวนรายการในพัสดุ" (หนึ่งในกรณีนี้) และที่สองคือความยาวของสตริง อย่างไรก็ตามฉันได้ใช้ 0 สำหรับพารามิเตอร์ตัวที่สองและใช้งานได้ดีและฉันไม่สามารถหาเอกสารใด ๆ ที่ตรงกับฟังก์ชั่นนี้โดยเฉพาะ ... ลองดูว่ามันมีค่าอะไร

ไม่ว่าในกรณีใด ๆ มันเป็นการสร้างวัตถุพัสดุที่มี 3 ฟิลด์จากนั้นส่งต่อไปยังคลิปบอร์ด คลิปบอร์ดจะคลายพัสดุและตั้งค่าสตริงที่ส่งผ่านเป็นเนื้อหาของคลิปบอร์ด คุณสามารถเห็นสิ่งนี้เมื่อคุณไปรับค่าในภายหลัง:

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

ในทำนองเดียวกันหากคุณกดที่ช่องป้อนข้อความค้างไว้และกด "วาง" หลังจากทำเช่นนี้คุณจะได้รับข้อความที่ถูกตั้งค่าผ่านทางcall service clipboard 2บรรทัดด้านบน (และมันจะดูปกติอย่างสมบูรณ์)

(ตัวอย่างข้างต้นมาจาก HTC EVO ของฉันใช้ CyanogenMod 7)


1
ในที่สุดฉันสามารถวางคีย์ WPA ของฉันและเชื่อมต่อกับเราเตอร์ของฉัน: D ขอขอบคุณ.
earthmeLon

3
@earthmeLon หากคุณเพียงแค่พยายามหาวิธีที่ง่ายในการคัดลอกคีย์ WPA ของคุณจากนั้นในครั้งต่อไปคุณอาจพบว่าการทำสิ่งต่างๆเช่นอีเมลให้กับตัวเองและคัดลอก / วางจากอีเมลหรือคัดลอกไฟล์ข้อความที่มีอยู่ใน อุปกรณ์ผ่าน USB จากนั้นเปิดและคัดลอกจากที่นั่น มีตัวเลือกอื่น ๆ เช่นWifi Keyboardที่ให้คุณพิมพ์ (หรือวาง) จากพีซีและให้ปรากฏบนโทรศัพท์
GAThrawn

4
คีย์ WPA ของฉันละเอียดอ่อน ไม่ควรเผยแพร่ผ่านเครือข่ายใด ๆ ที่ไม่ใช่ในท้องถิ่น ขอบคุณสำหรับคำแนะนำ @GAThrawn ฉันจะพบการใช้ประโยชน์มากขึ้นสำหรับฟังก์ชันนี้ในที่สุด: D
earthmeLon

6
ฉันได้รับ'........U.n.k.n.' 'o.w.n. .p.a.c.k.' 'a.g.e. ..... ')เมื่อทำcall service clipboard 2
cprcrack

3
ในกรณีที่คุณต้องคัดลอกรหัสผ่านหรือข้อความใด ๆ ของคุณลงในช่องข้อความบนหุ่นยนต์คุณอาจจะยัง "อับดุลเปลือกใส่ข้อความ 'String'" - ฉันได้รับค่าบนคลิปบอร์ด ...
ฟิลิปป์

14

ฉันใช้วิธีการนี้และใช้งานได้ดีใน 4.x แต่ล้มเหลวสำหรับฉันในอมยิ้ม ในขณะที่กำลังมองหาโซลูชันทางเลือกฉันพบสิ่งนี้: /programming/3391160/paste-text-on-android-emulator

มันไม่ตรงตามที่คุณต้องการ แต่สำหรับตัวเองเวลาส่วนใหญ่ที่ฉันต้องการคัดลอกข้อความไปยังคลิปบอร์ดนั้นเป็นเพราะฉันต้องการวางลงในช่องรหัสผ่าน

ในฐานะโบนัสเพิ่มเติมนี่คือสคริปต์ของฉัน ( แก้ไข 2015-04-24 เพื่ออนุญาตการเว้นวรรคในข้อความ ):

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

เหตุผลที่คุณต้องทวีคูณหนีสตริงคือว่ามีสองเปลือกหอยเปลือกของคุณและเปลือกธนาคารพัฒนาเอเชีย แต่ผมสงสัยว่านี้จะล้มเหลวของตัวละครอื่น ๆ ที่มีความหมายพิเศษในเปลือกเช่นเครื่องหมาย
Dan Dascalescu

ที่จริงแล้วมันจะเป็นหน้าที่ของ adb shell เพื่อทำการหลบหนีอย่างถูกต้อง แต่ดูเหมือนจะไม่สมบูรณ์ ในเวอร์ชั่นของฉัน (1.0.31) การเว้นวรรคที่ใช้ด้านบนนั้นไม่จำเป็น แต่ตัวละครพิเศษทุกประเภทจะต้องหลบหนี
Matthijs Kooijman

วิธีที่ดีกว่าในการจัดการอักขระพิเศษคือไปป์ไลน์ผ่าน stdin เช่น: echo "$TEXT" | adb shell xargs -0 input textซึ่งควรจัดการข้อความใด ๆ ยกเว้นอักขระ \ 0 (NUL) น่าเสียดายที่ adb รุ่นเก่าไม่ได้ส่งต่อ stdin ไปยังคำสั่งที่ระบุไว้ใน commandline adb นี้ได้รับการแก้ไขในรุ่นใหม่ adb แต่มันต้องการ Android N เพื่อการทำงาน
Matthijs Kooijman

ในฐานะที่เป็นพื้นที่หลบหนีนี้เห็นได้ชัดว่าเป็นสิ่งจำเป็นสำหรับinputคำสั่งบนอุปกรณ์ Android adb shellไม่ได้สำหรับเปลือกที่ใช้โดย นอกจากนี้ยังจำเป็นสำหรับ SDK เวอร์ชัน 22 และต่ำกว่าเท่านั้น (เชื่อว่าอมยิ้มและต่ำกว่า) ตามคำตอบนี้
Matthijs Kooijman

4

นี่คือสคริปต์ที่ปรับปรุงใหม่โดย galets ด้านบน เช่นเดียวกับสคริปต์นั้นมันไม่ได้เขียนไปยังคลิปบอร์ด แต่ส่งอินพุตไปยังฟิลด์อินพุตที่เน้นอยู่ซึ่งมักเป็นสิ่งที่คุณต้องการอยู่แล้ว

สคริปต์นี้ได้รับการปรับปรุงเพื่อหลีกเลี่ยงอักขระพิเศษเพื่อป้องกันความสับสนกับ Android เชลล์ สิ่งนี้ควรอนุญาตให้มีการส่งสตริงใด ๆ ที่ไม่เปลี่ยนแปลง เพื่อป้องกันreadคำสั่งจากการตีความแบ็กสแลช (ต่อท้าย) ฉันเพิ่ม -r ตรงนั้น

นี่คือการทดสอบโดยใช้รายการของอักขระพิเศษต่อไปนี้:

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

นี่คือสคริปต์:

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

ฉันได้ลองและ googled เล็กน้อยและดูเหมือนว่า call-service-clipboard-approach หยุดทำงานใน androids รุ่นใหม่มันไม่สำเร็จสำหรับฉันในเวอร์ชัน 4.4.4 ของ Android นั่นคือคุณจะต้องใช้แอปเพื่อเข้าถึงการเข้าถึงคลิปบอร์ด (อ่านและเขียน) จาก adb-shell ผมใช้กรรไกรตัดจาก majido บน GitHub apk เป็นโฮสต์ด้วยดังนั้นไม่จำเป็นต้องรวบรวมมันด้วยตัวเอง เมื่อติดตั้งแล้วคุณสามารถสื่อสารกับมันโดยใช้คำสั่งการออกอากาศ (แอพจะบอกคำสั่งที่แน่นอน) แอพไม่จำเป็นต้องรูท


เนื่องจากเราไม่ทราบว่าจุดประสงค์ของคุณคืออะไร: คุณช่วยแก้ไขโพสต์ของคุณและรวมถึงสิ่งที่แอพทำและควรใช้มันได้หรือไม่ ผู้คนเริ่มตั้งค่าสถานะโพสต์ของคุณเป็น "ไม่ใช่คำตอบ" เนื่องจากพวกเขาพลาดจุดที่คุณต้องการ ขอบคุณล่วงหน้า!
Izzy

clipper ทำงานได้ดีสำหรับฉันมากกว่าการใช้ 'adb shell input text' ดียิ่งกว่าสคริปต์ Python AdbPaste github.com/gcb/AdbPasteเพื่อตัด 'adb shell input text' ฉันปรับปรุง clipper เพื่อรองรับพารามิเตอร์ไฟล์ดังนั้นตอนนี้ฉันสามารถส่งหลายหน้าไปยังคลิปบอร์ดในเวลาเพียงหนึ่งหรือสองวินาที ปรับปรุงโค้ดที่นี่: github.com/RoundSparrow/clipper
RoundSparrow hilltx

0

adb shell inputสามารถพบสคริปต์อื่นที่ใช้ในการส่งอักขระได้ที่นี่: https://github.com/gcb/AdbPaste

นี่เป็นสคริปต์ Python ที่สามารถโคลนได้จาก github หรือดาวน์โหลดและรันโดยตรง:

$ wget https://github.com/gcb/AdbPaste/raw/master/AdbPaste.py
$ chmod a+x AdbPaste.py
$ ./AdbPaste.py "some text to paste"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.