ADBを使用してデバイスのクリップボードに書き込むことはできますか?


26

私は、ルート化されたAndroidデバイスのクリップボードへの書き込み(および可能であれば、読み取り)の方法を学ぶことに興味があります。

USB経由でADBを使用してそうすることを望んでおり、これを行うのに役立つアプリをインストールすることには興味がありません。

正しい方向に私を導く提案や助けは大歓迎です。


エミュレータのより簡単なアプローチを探している人は、こちらを参照してください:stackoverflow.com/questions/3391160/…–
Mygod

回答:


21

はい、実際にこれを行うことができます。クリップボードを調べているときはちょっと見苦しいですが、うまく動作します。

まず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からのものです)


1
最後に、WPAキーを貼り付けてルーターに接続します:D。ありがとうございました。
earthmeLon

3
@earthmeLonあなたがWPAキーをコピーする簡単な方法を見つけようとしていた場合、次にあなた自身にそれを電子メールで送信して電子メールからコピー/貼り付けするか、それを含むテキストファイルをUSB経由でデバイスを開き、そこから開いてコピーします。Wifiキーボードなど、PCから入力(または貼り付け)して電話に表示できるオプションがあります。
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
私はクリップボードにあきらめた... -場合は、あなたも「ABDシェル入力テキスト『文字列』、」Android上でテキストフィールドにパスワードまたは任意のテキストをコピーすることができ必要がある
フィリップ・

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シェルの2つのシェルがあるためです。ただし、アンパーサンドなど、シェル内で特別な意味を持つ他の文字の場合、これは失敗すると思われます。
ダンダスカレスク

実際にこのエスケープを適切に行うのはadbシェルのタスクですが、どうやら完全にではありません。私のバージョン(1.0.31)では、上記で使用したスペースエスケープは必要ありませんが、すべての種類の特殊文字をエスケープする必要があります(ただし、これを確実に行うことは不可能です)。
Matthijs Kooijman

特殊文字を処理するより良い方法は、次のような標準入力を介してパイプすることecho "$TEXT" | adb shell xargs -0 input textです。\ 0(NUL)文字を除くすべてのテキストを処理する必要があります。残念ながら、古いバージョンのadbは、adbコマンドラインで指定されたコマンドにstdinを転送しません。これは新しいadbバージョンでは修正されていますが、動作するにはAndroid N必要です。
マティイスクーイマン

スペースのエスケープに関しては、これは明らかinputに、Androidデバイスのコマンドに必要であり、で使用されるシェルには必要ありませんadb shell。また、この回答によると、SDKバージョン22以下(Lollipop以下、私は信じています)にのみ必要です。
マティイスクーイマン

4

上記のガレットによるスクリプトの改良版を以下に示します。そのスクリプトと同様に、クリップボードには書き込まれませんが、現在フォーカスされている入力フィールドに入力を送信します。これは、とにかくたいていの場合です。

このスクリプトは、特殊文字をエスケープして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

私は少し試してグーグルで調べましたが、新しいAndroidではcall-service-clipboard-approachが動作しなくなったようです。Android4.4.4では失敗しました。つまり、adb-shellからクリップボードアクセス(読み取りおよび書き込み)を取得するにはアプリが必要になります。githubでmajidoのクリッパーを使用しています。apkもホストされているため、自分でコンパイルする必要はありません。インストールすると、ブロードキャストコマンドを使用して通信できます(アプリから正確なコマンドが通知されます)。アプリはルートを必要としません。


私たちはあなたの目的がわからないので、投稿を編集して、そのアプリが何をするのか、そしてどのようにそれを使うのかを含めてください。あなたがしたいことを明らかに見逃しているので、人々はすでにあなたの投稿に「答えではない」というフラグを立て始めています。前もって感謝します!
イジー

クリッパーは「adb shell input text」を使用するよりもうまく機能しました。PythonスクリプトAdbPaste github.com/gcb/AdbPasteよりも優れており、「adb shell input text」をラップします。ファイルパラメータをサポートするようにクリッパーを強化したので、1〜2秒で複数ページをクリップボードに送信できるようになりました。ここで強化されたコード:github.com/RoundSparrow/clipper
RoundSparrow hilltx

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.