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

我希望通过USB使用ADB进行此操作,并且不希望将任何应用安装到帮助我做到这一点,因为这是我计划做的很少的事情。

评论

对于寻求仿真器更简便方法的任何人,请参见此处:stackoverflow.com/questions/3391160/…

#1 楼

是的,您实际上可以做到这一点。首先检查一下,您可以使用adb shell中的service call clipboard 1检查当前剪贴板的内容(或者,如果不先进行炮弹,请检查adb shell service call clipboard 1)。 )。重新启动后,它最初可能会开始为空白,例如:您要放在剪贴板上的字符串:

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


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

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

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


同样,如果长按文本输入字段并在执行此操作后单击“粘贴” ,您将获得通过上面的service call clipboard 2行设置的文本(看起来完全正常)。

(上面的示例来自我的HTC EVO,运行CyanogenMod 7)

评论


我终于可以粘贴我的WPA密钥并连接到路由器:D。谢谢。

–earthmeLon
2012年2月20日在22:50

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

–GAThrawn
2012-2-21在10:47

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

–earthmeLon
2012年2月21日在18:10

我得到'........ U.n.k.n。' '拥有。 。包。' '年龄。 .....')进行呼叫服务剪贴板2时

– cprcrack
14年5月17日在11:23

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

–菲利普
16年6月16日在23:35

#2 楼

我使用了这种方法,在4.x中效果很好,但是在棒棒糖中对我来说却失败了。在寻找替代解决方案时,我发现了这一点:https://stackoverflow.com/questions/3391160/paste-text-on-android-emulator

它并不完全符合您的要求,但是对于我本人,大多数时候我想将文本复制到剪贴板是因为我想将其粘贴到密码字段中。

作为额外的奖励,这是我的脚本(于2015-04-24编辑,允许在文本中留空格):

#!/bin/bash

if [[ "" != "" ]]
then
    TEXT=
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外壳程序。但是,我怀疑对于壳中具有特殊含义的其他字符(例如与号),这将失败。

– Dan Dascalescu
2015年12月11日2:00



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

–Matthijs Kooijman
17年6月12日在14:14

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

–Matthijs Kooijman
17年6月12日14:14



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

–Matthijs Kooijman
17年6月12日在14:25

#3 楼

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

该脚本是改进了转义字符以防止
使它们与Android shell混淆的功能。这应该允许任何字符串不变地发送。为了防止read命令解释
(反斜线)反斜杠,我在其中添加了-r。

已使用以下特殊字符列表对此进行了测试:

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


以下是脚本:

#!/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 [[ "" != "" ]]
then
    TEXT=""
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  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"


#4 楼

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

评论


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

– Izzy♦
17年1月5日在22:57

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

–RoundSparrow hilltx
17年5月25日在2:20



#5 楼

可以在这里找到另一个使用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"