क्या ADB का उपयोग करके डिवाइस के क्लिपबोर्ड पर लिखना संभव है?


26

मुझे यह जानने में दिलचस्पी है कि एक जड़ वाले एंड्रॉइड डिवाइस के क्लिपबोर्ड को कैसे (और यदि संभव हो तो पढ़ें) से लिखना है।

मैं 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 पैरामीटर लेता है - दो ints और स्ट्रिंग जिसे आप क्लिपबोर्ड पर रखना चाहते हैं:

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

ईमानदार होने के लिए, मुझे यकीन नहीं है कि पहले दो पैरामीटर क्या हैं। स्टैक ओवरफ्लो पर एक जवाब ने पहला इंट "पार्सल में वस्तुओं की संख्या" (इस मामले में एक) का सुझाव दिया है और दूसरा है कि स्ट्रिंग की लंबाई है। हालाँकि, मैंने दूसरे पैरामीटर के लिए 0 का उपयोग किया है और यह ठीक काम करता है, और मुझे इस विशेष फ़ंक्शन के साथ मेल खाने वाला कोई भी दस्तावेज़ नहीं मिल रहा है ... इसलिए इसे उसी लायक लें।

किसी भी मामले में, यह मूल रूप से 3 क्षेत्रों के साथ एक पार्सल ऑब्जेक्ट बना रहा है, फिर इसे क्लिपबोर्ड में पास करना। क्लिपबोर्ड तब पार्सल को अनपैक करता है और क्लिपबोर्ड की सामग्री के रूप में पारित स्ट्रिंग मान सेट करता है। जब आप मूल्य को पुनः प्राप्त करने के लिए जाते हैं तो आप इसे देख सकते हैं:

# 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 पर डिवाइस, फिर वहां से खोलें और कॉपी करें। वाईफ़ाई कीबोर्ड जैसे अन्य विकल्प हैं जो आपको पीसी से टाइप (या पेस्ट) करते हैं और फोन पर दिखाई देते हैं।
गैथ्रॉन

4
मेरी WPA कुंजी संवेदनशील है। इसे किसी भी गैर-स्थानीय नेटवर्क EVER पर प्रसारित नहीं किया जाना चाहिए। सुझाव के लिए धन्यवाद @Gathrawn मैं अंततः इस कार्यक्षमता के लिए अधिक उपयोग
पाऊंगा

6
मुझे '........U.n.k.n.' 'o.w.n. .p.a.c.k.' 'a.g.e. ..... ')बनाते समय मिलता हैcall service clipboard 2
cprcrack

3
यदि आपको अपने पासवर्ड या किसी पाठ को एंड्रॉइड पर टेक्स्टफील्ड में कॉपी करने की आवश्यकता है, तो आप "पेट शेल इनपुट टेक्स्ट 'स्ट्रिंग'" भी कर सकते हैं - मैंने क्लिपबोर्ड पर छोड़ दिया है ...
फिलिप

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"

स्ट्रिंग को दोगुना करने के लिए आपको जो कारण चाहिए, वह यह है कि दो गोले हैं: आपका शेल, और एडीबी शेल । हालाँकि, मुझे संदेह है कि यह अन्य वर्णों के लिए विफल हो जाएगा, जिनका शेल में विशेष अर्थ है, जैसे एम्परसेंड
डैन डस्केल्सस्कु

यह वास्तव में इस शेल को ठीक से बच निकलने का काम करेगा, लेकिन जाहिर है कि यह पूरी तरह से नहीं है। मेरे संस्करण (1.0.31) पर ऊपर उपयोग किए जाने वाले स्थान से बचने की आवश्यकता नहीं है, लेकिन सभी प्रकार के विशेष पात्रों को भागने की आवश्यकता होगी (लेकिन यह मज़बूती से करना असंभव है)।
मत्तीजिज कूइजमैन

विशेष वर्णों को संभालने का एक बेहतर तरीका स्टड के माध्यम से पाइप करना होगा, कुछ इस तरह से: echo "$TEXT" | adb shell xargs -0 input textकिसी भी पाठ को संभालना चाहिए, सिवाय \ 0 (NUL) वर्ण के। दुर्भाग्य से, पुराने adb वर्जन adb कमांडलाइन पर निर्दिष्ट कमांड के लिए स्टडिन को फॉरवर्ड नहीं करते हैं। यह नए एडीबी संस्करणों में तय किया गया है, लेकिन इसे काम करने के लिए एंड्रॉइड एन की आवश्यकता है
मथिज्स कूइजमैन

अंतरिक्ष से बचने के लिए, यह जाहिरा तौर inputपर एंड्रॉइड डिवाइस पर कमांड के लिए आवश्यक है, न कि उपयोग किए गए शेल के लिए adb shell। इसके अलावा, यह केवल एसडीके संस्करण 22 और नीचे (लॉलीपॉप और नीचे, मुझे विश्वास है) के लिए इस उत्तर के अनुसार आवश्यक है ।
मत्तीजिज कूइजमैन

4

यहाँ ऊपर आकाशगंगाओं द्वारा स्क्रिप्ट का एक उन्नत संस्करण है। उस स्क्रिप्ट के साथ के रूप में, यह क्लिपबोर्ड पर नहीं लिखता है, लेकिन वर्तमान में केंद्रित इनपुट फ़ील्ड पर इनपुट भेजता है, जो कि आप वैसे भी चाहते हैं।

एंड्रॉइड शेल को उनके साथ भ्रमित करने से रोकने के लिए विशेष वर्णों से बचने के लिए इस स्क्रिप्ट में सुधार किया गया है। यह किसी भी स्ट्रिंग को अपरिवर्तित भेजने की अनुमति देनी चाहिए। 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

मैंने कोशिश की है और थोड़ा सा googled और ऐसा लगता है कि कॉल-सर्विस-क्लिपबोर्ड-दृष्टिकोण ने नए एंड्रॉइड में काम करना बंद कर दिया है, यह मेरे लिए 4.4.4 संस्करण एंड्रॉइड पर विफल रहा। यानी आपको adb-shell से क्लिपबोर्ड एक्सेस (पढ़ने और लिखने) के लिए एक ऐप की आवश्यकता होगी। मैं गितुब पर मजीदो से क्लिपर का उपयोग करता हूं । एपीके को भी होस्ट किया गया है, इसलिए इसे स्वयं संकलित करने की आवश्यकता नहीं है। इंस्टॉल होने पर आप ब्रॉडकास्ट कमांड्स का उपयोग करके इसे कम्यूनिकेट कर सकते हैं (ऐप आपको सटीक कमांड्स बताएगा)। ऐप को रूट की आवश्यकता नहीं है।


जैसा कि हम नहीं जानते कि आपका उद्देश्य क्या है: क्या आप कृपया अपनी पोस्ट को संपादित कर सकते हैं और उस ऐप को शामिल कर सकते हैं, और इसका उपयोग कैसे करना चाहिए? लोग पहले से ही आपके पोस्ट को "एक उत्तर नहीं" के रूप में चिह्नित करना शुरू कर देते हैं, क्योंकि वे स्पष्ट रूप से उस बिंदु को याद करते हैं जिसे आप बनाना चाहते हैं। अग्रिम में धन्यवाद!
इज़ी

क्लिपर ने 'एडीबी शेल इनपुट टेक्स्ट' का उपयोग करने की तुलना में मेरे लिए बेहतर काम किया। पायथन लिपि AdbPaste github.com/gcb/AdbPaste से भी बेहतर है कि 'adb शेल इनपुट' को रैप करें। मैंने एक फ़ाइल पैरामीटर का समर्थन करने के लिए क्लिपर को बढ़ाया, इसलिए मैं अब क्लिपबोर्ड में कई पृष्ठों को सिर्फ एक या दो सेकंड में भेज सकता हूं। यहाँ बढ़ाया कोड: github.com/RoundSparrow/clipper
RoundSparrow Hilltx

0

एक और स्क्रिप्ट जो adb shell inputपात्रों को भेजने के लिए उपयोग की जाती है, वह यहां देखी जा सकती है: https://github.com/gcb/AdbPaste

यह एक पायथन लिपि है जिसे गितुब से क्लोन किया जा सकता है, या सीधे डाउनलोड और रन किया जा सकता है:

$ wget https://github.com/gcb/AdbPaste/raw/master/AdbPaste.py
$ chmod a+x AdbPaste.py
$ ./AdbPaste.py "some text to paste"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.