私は、ルート化されたAndroidデバイスのクリップボードへの書き込み(および可能であれば、読み取り)の方法を学ぶことに興味があります。
USB経由でADBを使用してそうすることを望んでおり、これを行うのに役立つアプリをインストールすることには興味がありません。
正しい方向に私を導く提案や助けは大歓迎です。
私は、ルート化されたAndroidデバイスのクリップボードへの書き込み(および可能であれば、読み取り)の方法を学ぶことに興味があります。
USB経由でADBを使用してそうすることを望んでおり、これを行うのに役立つアプリをインストールすることには興味がありません。
正しい方向に私を導く提案や助けは大歓迎です。
回答:
はい、実際にこれを行うことができます。クリップボードを調べているときはちょっと見苦しいですが、うまく動作します。
まずservice call clipboard 1
、adbシェルから(または、最初にシェル化せずに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つのパラメーター(2つの整数と、クリップボードに配置する文字列)を受け取ります。
# service call clipboard 2 i32 1 i32 0 s16 "Hi there"
Result: Parcel(00000000 '....')
正直に言うと、最初の2つのパラメーターが何なのかわかりません。スタックオーバーフローに関する1つの答えは、最初のintは「パーセル内のアイテムの数」(この場合は1つ)であり、2番目は文字列の長さであることを示唆しています。ただし、2番目のパラメーターに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
上の行で設定されたテキストを取得します(そして、それは完全に正常に見えます)。
(上記の例はCyanogenMod 7を実行しているHTC EVOからのものです)
'........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は、adbコマンドラインで指定されたコマンドにstdinを転送しません。これは新しいadbバージョンでは修正されていますが、動作するにはAndroid Nが必要です。
input
に、Androidデバイスのコマンドに必要であり、で使用されるシェルには必要ありませんadb shell
。また、この回答によると、SDKバージョン22以下(Lollipop以下、私は信じています)にのみ必要です。
上記のガレットによるスクリプトの改良版を以下に示します。そのスクリプトと同様に、クリップボードには書き込まれませんが、現在フォーカスされている入力フィールドに入力を送信します。これは、とにかくたいていの場合です。
このスクリプトは、特殊文字をエスケープして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"
私は少し試してグーグルで調べましたが、新しいAndroidではcall-service-clipboard-approachが動作しなくなったようです。Android4.4.4では失敗しました。つまり、adb-shellからクリップボードアクセス(読み取りおよび書き込み)を取得するにはアプリが必要になります。githubでmajidoのクリッパーを使用しています。apkもホストされているため、自分でコンパイルする必要はありません。インストールすると、ブロードキャストコマンドを使用して通信できます(アプリから正確なコマンドが通知されます)。アプリはルートを必要としません。
文字のadb shell input
送信に使用する別のスクリプトは、https://github.com/gcb/AdbPasteにあります。
これは、githubから複製できるPythonスクリプトであるか、直接ダウンロードして実行することもできます。
$ wget https://github.com/gcb/AdbPaste/raw/master/AdbPaste.py
$ chmod a+x AdbPaste.py
$ ./AdbPaste.py "some text to paste"