是否可以使用ADB写入设备的剪贴板?


26

我有兴趣学习如何写入(如果可能的话,请从根植的Android设备的剪贴板中读取)。

我希望使用USB上的ADB来这样做,并且我对安装任何应用程序来帮助我做到这一点不感兴趣,因为这是我计划很少做的事情。

任何建议或帮助我朝正确方向发展的建议将不胜感激。


对于正在寻找更简单的仿真器方法的用户,请参见此处:stackoverflow.com/questions/3391160/…–
Mygod

Answers:


21

是的,您实际上可以做到这一点。当您检查剪贴板时,这种外观看起来有些呆板,但效果很好。

首先,您可以service call clipboard 1使用adb shell(或首先不带壳)检查当前剪贴板内容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个参数-两个整数和要放在剪贴板上的字符串:

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

老实说,我不确定前两个参数是什么。关于堆栈溢出的一个答案表明,第一个int是“包裹中的项目数”(在这种情况下为一个),第二个是字符串的长度。但是,我对第二个参数使用了0,它可以正常工作,而且我找不到与该特定功能匹配的任何文档...因此,以它的价值来考虑。

无论如何,它基本上是创建一个具有3个字段的Parcel对象,然后将其传递到剪贴板中。然后剪贴板将包裹解压缩,并将传入的字符串值设置为剪贴板的内容。之后您可以检索值时可以看到以下内容:

# 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 2012年

3
@earthmeLon,如果您只是想找到一种简单的方法来复制WPA密钥,那么下次您可能会发现更轻松地进行诸如将其发送给自己并从电子邮件中复制/粘贴,或将包含它的文本文件复制到您的文件中的操作。通过USB的设备,然后从那里打开并复制。还有其他选项,例如Wifi键盘,可让您从PC键入(或粘贴)并将其显示在手机上。
GAThrawn

4
我的WPA密钥很敏感。不应在任何非本地网络EVER上广播。感谢您的建议@GAThrawn。我最终会在此功能中找到更多的使用方法:D
earthmeLon

6
'........U.n.k.n.' 'o.w.n. .p.a.c.k.' 'a.g.e. ..... ')在制作时得到call service clipboard 2
cprcrack

3
万一您需要将密码或任何文本复制到android上的文本字段中,您还可以“ abd shell输入文本'String'“-我已经放弃了剪贴板...
Philippe

14

我使用了这种方法,在4.x中效果很好,但是在棒棒糖中对我来说却失败了。在寻找替代解决方案时,我发现了这一点:https : //stackoverflow.com/questions/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"

您需要双重转义字符串的原因是有两个外壳程序:您的外壳程序和adb shell。但是,我怀疑对于壳中具有特殊含义的其他字符(例如&符),这将失败。
Dan Dascalescu 2015年

正确执行转义实际上是adb shell的任务,但显然并没有完全完成。在我的版本(1.0.31)中,不需要使用上面的空格转义,但是所有特殊字符都需要转义(但是不可能可靠地做到这一点)。
Matthijs Kooijman

处理特殊字符的更好方法是通过stdin进行管道传输,例如:echo "$TEXT" | adb shell xargs -0 input text可以处理任何文本,但\ 0(NUL)字符除外。不幸的是,较旧的adb版本不会将stdin转发到adb命令行上指定的命令。这在较新的adb版本中已修复,但需要Android N才能运行
Matthijs Kooijman

至于空间转义,这显然input是Android设备上的命令所需的,而不是所需的shell adb shell。另外,根据此答案,仅SDK 22及以下版本(Lollipop及以下版本,我相信)才需要。
Matthijs Kooijman

4

这是上述方法的改进版脚本。与该脚本一样,它不会写入剪贴板,而是将输入发送到当前聚焦的输入字段,这通常是您想要的。

对该脚本进行了改进,以转义特殊字符以防止Android Shell与它们混淆。这应该允许任何字符串不变地发送。为了防止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

我已经尝试过并用Google搜索了一下,但似乎call-service-clipboard-approach在较新的android上停止工作,但在4.4.4版本的Android上对我来说却失败了。即,您将需要一个应用程序来从adb-shell获取剪贴板访问(读取和写入)。我在github上使用majido的clipper。该apk也是托管的,因此无需自己编译。安装后,您可以使用广播命令与之通信(应用程序会告诉您确切的命令)。应用程序不需要root。


由于我们不知道您的目的是什么:能否编辑您的信息并包括该应用程序的功能以及该应用程序的用途?人们已经开始将您的帖子标记为“不是答案”,因为他们显然错过了您想提出的观点。提前致谢!
伊齐

与使用“ adb shell输入文本”相比,cliper对我而言效果更好。甚至比Python脚本AdbPaste github.com/gcb/AdbPaste 更好地包装“ adb shell输入文本”。我增强了裁剪器以支持文件参数,因此现在可以在一两秒钟内将多页发送到剪贴板。此处的增强代码:github.com/RoundSparrow/clipper
RoundSparrow hilltx

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.