Можно ли записать в буфер обмена устройства с помощью ADB?


26

Мне интересно узнать, как записывать (и, если возможно, читать) в буфер обмена Android-устройства.

Я надеюсь сделать это с помощью ADB через USB, и я не заинтересован в установке каких-либо приложений, которые бы помогли мне сделать это, поскольку я планирую делать это редко.

Буду очень признателен за любые предложения или помощь, направляющие меня в правильном направлении.


Для тех, кто ищет более простые подходы для эмуляторов, см. Здесь: 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 параметра - два целых и строку, которую вы хотите поместить в буфер обмена:

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

Если честно, я не уверен, каковы первые два параметра. Один из ответов на переполнение стека предполагает, что первое int - это «количество элементов в посылке» (в данном случае один), а второе - длина строки. Тем не менее, я использовал 0 для второго параметра, и он работает нормально, и я не могу найти никакой документации, которая бы соответствовала этой конкретной функции ... так что возьмите это для себя.

В любом случае, это в основном создание объекта Parcel с 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

3
@earthmeLon, если вы просто пытались найти простой способ скопировать ваш ключ WPA, то в следующий раз вам может быть проще сделать что-то вроде электронной почты и скопировать / вставить из электронной почты, или скопировать текстовый файл, содержащий его, на ваш устройство через USB, затем откройте и скопируйте оттуда. Существуют и другие параметры, такие как клавиатура Wi-Fi, которые позволяют печатать (или вставлять) с ПК и отображать его на телефоне.
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
В случае, если вам нужно скопировать свой пароль или любой текст в текстовое поле на Android, вы также можете "abd shell input text 'String'" - я отказался от буфера обмена ...
Филипп

14

Я использовал эту методологию, и она отлично работала в 4.x, но мне не удалось в леденце. В поисках альтернативного решения я нашел это: /programming/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 . Однако я подозреваю, что это не удастся для других символов, которые имеют особое значение в оболочке, таких как амперсанд .
Дан Даскалеску

На самом деле задачей adb shell было бы правильно сделать это экранирование, но, очевидно, это не полностью. В моей версии (1.0.31) экранирование, использованное выше, не требуется, но все виды специальных символов должны быть экранированы (но это невозможно сделать надежно).
Маттис

Лучшим способом обработки специальных символов будет передача через stdin, что-то вроде: echo "$TEXT" | adb shell xargs -0 input textкоторый должен обрабатывать любой текст, кроме символов \ 0 (NUL). К сожалению, старые версии adb не пересылают stdin команде, указанной в командной строке adb. Это исправлено в новых версиях ADB, но это необходимо для Android N работать .
Маттис

Что касается выхода из космоса, это очевидно необходимо для inputкоманды на устройстве Android, а не для используемой оболочки adb shell. Кроме того, это необходимо только для SDK версии 22 и ниже (я думаю, Lollipop и ниже) в соответствии с этим ответом .
Маттис

4

Вот улучшенная версия скрипта от Galets выше. Как и в случае с этим сценарием, он не записывает данные в буфер обмена, а отправляет ввод в текущее поле ввода, что в любом случае часто является тем, что вам нужно.

Этот скрипт улучшен, чтобы избежать специальных символов, чтобы не перепутать оболочку 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

Я попробовал и немного погуглил, и кажется, что подход call-service-clipboard-подхода перестал работать в новых андроидах, у меня не получилось на 4.4.4 версии Android. Т.е. вам понадобится приложение для доступа к буферу обмена (чтение и запись) из adb-оболочки. Я использую клипер из Маджидо на GitHub . Apk также размещен, так что нет необходимости компилировать его самостоятельно. После установки вы можете общаться с ним, используя широковещательные команды (приложение сообщит вам точные команды). Приложение не требует рута.


Поскольку мы не знаем, какова ваша цель: не могли бы вы отредактировать свой пост и указать, что делает это приложение и как его использовать? Люди уже начинают помечать ваш пост как "не ответ", поскольку они явно упускают из виду то, что вы хотите высказать. Заранее спасибо!
Иззи

Clipper работал лучше для меня, чем использование «ввода текста в оболочке adb». Даже лучше, чем сценарий Python AdbPaste github.com/gcb/AdbPaste, чтобы обернуть «входной текст оболочки adb». Я усовершенствовал Clipper для поддержки параметра файла, так что теперь я могу отправлять несколько страниц в буфер обмена всего за секунду или две. Расширенный код здесь: github.com/RoundSparrow/clipper
RoundSparrow hilltx

0

Другой сценарий, который используется 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"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.