[Android] 使用 adb shell 傳送文字到模擬器裡

[Android] 使用 adb shell 傳送文字到模擬器裡

常常有時候想要把電腦上複製的一段文字,直接貼到 Android 模擬器裡去,

可是 Android 模擬器並沒有提供這樣的功能…

有些可行的解法是在模擬器裡裝一些 app,像是 AirDroid 之類的,

大概就能透過 app 的功能,把剪貼簿的內容傳進去…

 

今天正好又在 stackoverflow: Paste text on Android Emulator

查到另外一種方式,是利用 adb shell~

舉例來說,下面的指令會把 abc 這三個字元傳送到模擬器裡面去:

adb shell input text "abc"

 

但如果字串中有空白的話,用像是 adb shell input text “abc def” 是不行的,

只有 abc 會被傳過去,空白字元和之後的字元都傳不過去…

空白字元要改用 %s 取代才行,所以需要輸入下列的指令,

才能在模擬中打出 “abc def” 這樣包含空白字元的字串:

adb shell input text "abc%sdef"

 

在 Mac 上的話,用 pbpaste 可以取得目前剪貼簿的內容,

因此我寫了下面這個小 python 程式,用來取得剪貼簿的內容,

再分段用 adb shell 傳送到模擬器中~

這邊要分段是因為如果一次傳過去的話,adb 會出現錯誤訊息…

同時分段的大小如果稍大的話,adb shell 可能沒有錯誤訊息,

但傳過去的文字會漏 (像我原本設成 100 的話就會漏),

因此後來是設成 32,比較 OK~

#!/usr/bin/env python
import subprocess
MAX_CHUNK_LEN = 32
# Get text from clipboard
proc = subprocess.Popen(["pbpaste"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
text_to_send = proc.communicate()[0]
text_len_all = len(text_to_send)
text_len_sent = 0
for i in xrange(text_len_all/MAX_CHUNK_LEN + 1):
# Get a partial text
chunk = text_to_send[i*MAX_CHUNK_LEN:(i+1)*MAX_CHUNK_LEN]
print "Sending (%02d%%): %s" % (100*text_len_sent/text_len_all, chunk)
proc = subprocess.Popen(["adb", "shell", "input", "text", chunk.replace(" ", "%s")], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = proc.communicate()
text_len_sent += len(chunk)

 

這個方法目前似乎只能傳送 ASCII 字元,像中文字元是傳不過去的…

而且傳送的速度會有點慢,可以看到一個字一個字在模擬器上出現…

不過如果只是少量傳送的話,也還算是可用的工具啦~

 

(本頁面已被瀏覽過 236 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料