Answers:
是的,您实际上可以做到这一点。当您检查剪贴板时,这种外观看起来有些呆板,但效果很好。
首先,您可以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)
'........U.n.k.n.' 'o.w.n. .p.a.c.k.' 'a.g.e. ..... ')
在制作时得到call service clipboard 2
我使用了这种方法,在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"
echo "$TEXT" | adb shell xargs -0 input text
可以处理任何文本,但\ 0(NUL)字符除外。不幸的是,较旧的adb版本不会将stdin转发到adb命令行上指定的命令。这在较新的adb版本中已修复,但需要Android N才能运行。
这是上述方法的改进版脚本。与该脚本一样,它不会写入剪贴板,而是将输入发送到当前聚焦的输入字段,这通常是您想要的。
对该脚本进行了改进,以转义特殊字符以防止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"
我已经尝试过并用Google搜索了一下,但似乎call-service-clipboard-approach在较新的android上停止工作,但在4.4.4版本的Android上对我来说却失败了。即,您将需要一个应用程序来从adb-shell获取剪贴板访问(读取和写入)。我在github上使用majido的clipper。该apk也是托管的,因此无需自己编译。安装后,您可以使用广播命令与之通信(应用程序会告诉您确切的命令)。应用程序不需要root。
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"