2017-07-04 11 views
8

मैं उत्सुक था, मैंने इस ऐप को दूसरे दिन देखा जिसने इसे अन्य ऐप्स खोलने और स्वचालित रूप से आपके लिए कुछ फ़ंक्शंस सेट करने की अनुमति दी। मुझे एहसास हुआ है कि इसे किसी प्रकार के स्क्रीन क्लिक फ़ंक्शन पर उपयोग करना होगा, लेकिन मुझे ऐसा कुछ प्रलेखन नहीं दिख रहा है। उदाहरण के लिए अगर हम जानते हैं कि अन्य एप्लिकेशन से स्क्रीन पाठ पर "तैयार" है, वहाँ पाठ को पढ़ने के लिए एक रास्ता है और हो सकता है की तरह कुछ कार्य करें:एंड्रॉइड क्लिक करने योग्य स्क्रीन टेक्स्ट

protected void processText(String text) 
{ 
    if (text.contains("Ready")) 
     // click the ready text 
} 
+0

क्या आप टेक्स्ट पर क्लिक करना चाहते हैं या टेक्स्ट क्लिक करने योग्य टेक्स्ट का हिस्सा बनाना चाहते हैं, या स्क्रीन क्लिक निर्देशांक प्राप्त करें? पूर्व पर जानकारी यहां प्राप्त की जा सकती है: https://www.google.com.ng/url?url=https://stackoverflow.com/questions/10696986/how-to-set-the-part-of-the -टेक्स्ट-दृश्य-है-क्लिक करने योग्य और RCT = जम्मू सा = यू और वेद = 0ahUKEwilotjX6-7UAhXIYlAKHfF8BwgQFggbMAA & q = android + बनाने + पाठ + का भाग + क्लिक करने योग्य और यूएसजी = AFQjCNEVpYcyHrHbO5NKt5jBPVqAjpNiFg –

+0

@ Mofe-hendyEjegi मैं इसे खुद को क्या करने वाले उपयोगकर्ता के बिना पाठ क्लिक करने के लिए चाहते हैं। लेकिन चूंकि यह एक और ऐप पर है, इसलिए मैं इसे क्लिक नहीं कर सकता, यही वह है जिसे मैं समझने की कोशिश कर रहा हूं कि कैसे करना है। – Jayce

+0

अभिगम्यता एपीआई में जांचें कि मैं अधिक जानकारी के लिए सहायता कर सकता हूं https://stackoverflow.com/questions/35842762/how-to-read-window-content-using-accessibilityservice-and-evoking-ui-using-dra – ingsaurabh

उत्तर

3

मैंने इसे AccessibilityService का उपयोग करके किया है। यह केवल एपीआई स्तर> = 16 पर ठीक काम करेगा।

आपको AccessibilityService का विस्तार करने की आवश्यकता है। उदाहरण के लिए इस कक्षा को यूएसएसडी प्रतिक्रियाओं का पाठ मिलेगा और संवाद को खारिज कर दिया जाएगा।

// .... 
public class UssdAccessibilityService extends AccessibilityService { 
    public UssdAccessibilityService() { 
    } 

    @TargetApi(16) 
    @Override 
    public void onAccessibilityEvent(AccessibilityEvent event) { 
     if (!"com.android.phone".equalsIgnoreCase((String)event.getPackageName())){ 
      // In this example we are only interested in events comming 
      // from "com.android.phone" package 
      event.recycle(); 
      return; 
     } 

     String className = (String)event.getClassName(); 
     if (className == null || (!className.contains("AlertDialog") && !className.contains("AlertDialog"))){ 
      // Class is not an USSD dialog 
      event.recycle(); 
      return; 
     } 

     AccessibilityNodeInfo source = event.getSource(); 
     if (source == null) { 
      // getSource() is annotated @Nullable, so we do this to be 
      // safe just in case 
      event.recycle(); 
      return; 
     } 

     AccessibilityNodeInfo acceptButton = null; 
     String ussdText = null; 

     int childCount = source.getChildCount(); 
     for (int i = 0; i < childCount; i++){ 
      AccessibilityNodeInfo current = source.getChild(i); 
      if (current == null) 
       continue; 

      String currentText = (String)current.getText(); 
      if (current.isClickable()){ 
       // In the case of USSD dialogs, there is only one clickable. 
       // May be necessary to do more robust search in other scenarios 
       acceptButton = current; 
       continue; 
      } 

      ussdText = currentText; 

      current.recycle(); 
     } 

     if (ussdText!= null) { 
      if (acceptButton != null) 
       acceptButton.performAction(AccessibilityNodeInfo.ACTION_CLICK); 

     } 

     source.recycle(); 
     event.recycle(); 
    } 

    // .... 
} 

आप <application>

<service 
     android:name=".UssdAccessibilityService" 
     android:enabled="true" 
     android:label="Read USSD codes and dismiss" 
     android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> 
     <intent-filter> 
      <action android:name="android.accessibilityservice.AccessibilityService" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.accessibilityservice" 
      android:resource="@xml/accessibility_service_config" /> 
</service> 

के तहत प्रकट में उपयोग सेवा की घोषणा करनी चाहिए res/xml के तहत बनाने accessibility_service_config.xml

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
    android:description="@string/accessibility_service_description" 
    android:packageNames="com.android.phone,com.ats.android.activationcodebot" 
    android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged" 
    android:accessibilityFlags="flagDefault" 
    android:accessibilityFeedbackType="feedbackSpoken" 
    android:notificationTimeout="100" 
    android:canRetrieveWindowContent="true" 
    /> 
बेशक

आप अपनी जरूरतों के लिए इस कोड अनुकूल करने के लिए किया है।

अंत में आपको एंड्रॉइड में सेटिंग्स> एक्सेसिबिलिटी पर मैन्युअल रूप से एक्सेसिबिलिटी सेवा को सक्षम करना होगा (या उपयोगकर्ता को ऐसा करने के लिए कहें)।

और पढ़ें ...Developing an Accessibility Service

+0

जैसे ही मैं घर आता हूं, मैं इसे आजमाउंगा और आपको बताऊंगा कि यह मेरे लिए काम करता है या नहीं। यह मेरे पास पहले से मौजूद कोड के समान है, लेकिन मेरा कोड हमेशा किसी कारण से स्क्रीन पर "क्लिक" नहीं करता है। – Jayce

+0

मैंने आपका कोड नहीं देखा है, लेकिन सुनिश्चित करें कि आप पूरे पेड़ के माध्यम से फिर से क्लिक करने योग्य दृश्य की तलाश में हैं। –

+0

साथ ही, सुनिश्चित करें कि 'ऑनएक्सेबिलिटीएवेंट()' के अंदर अस्थायी स्टोरेज के लिए किसी भी इंस्टेंस या क्लास फ़ील्ड का उपयोग न करें, क्योंकि इससे यह थ्रेड असुरक्षित हो जाएगा। यदि आपको वास्तव में किसी इंस्टेंस फ़ील्ड के साथ काम करने की ज़रूरत है, तो सुनिश्चित करें कि 'ऑनएक्सेबिलिटीएवेंट()' को सभी कॉल को सुरक्षित रूप से निष्पादित करने के लिए 'सिंक्रनाइज़ (लॉकऑब्जेक्ट) {} 'का उपयोग करें। –

3

है कि एक और app से आप की जरूरत करने के लिए सक्षम होना करने के लिए स्क्रीन पर कब्जा करने और पाठ पहचान सेवा का उपयोग कर पाठ स्थिति निर्धारित करने के लिए।

जब कोई अन्य एप्लिकेशन सक्रिय होता है, तो आपका एप्लिकेशन स्क्रीन पर कब्जा करने में सक्षम होने के लिए सक्रिय होना चाहिए। तो आप केवल एंड्रॉइड सेवा का उपयोग कर सकते हैं जो हमेशा पृष्ठभूमि काम करता है।

हालांकि अपनी गतिविधि के लिए स्क्रीनशॉट कैप्चर करने से आप अपने activity के एक दृश्य की जरूरत है, और जो एक अपने service ताकि आप एक TimerTask जो हर घंटे में अपनी गतिविधि को कॉल करेंगे और अपने activity यह जवाब करना है में मौजूद नहीं है वर्तमान दृश्य दृश्य के साथ और आप उस से स्क्रीनशॉट को कैप्चर कर सकते हैं।

या बिटमैप या किसी के लिए आप अपने वर्तमान डिवाइस स्क्रीन का स्क्रीनशॉट (किसी भी आवेदन) लेने के लिए तो आप अनुमति जड़, और कहा कि जो वर्तमान स्क्रीन के कच्चे डेटा दे देंगे के लिए framebuffer पढ़ने के लिए तो यह परिवर्तित चाहते हैं चित्र फ़ाइल आप इसे अपनी सेवा में कर सकते हैं।

संक्षेप में, यह रूट किए गए फोन के लिए संभव हो सकता है। अन्यथा, यदि आप गैर रूट हैं तो आप अन्य ऐप्स का स्क्रीनशॉट नहीं ले सकते हैं। केवल आपके ऐप के स्क्रीनशॉट लेने की अनुमति है।

स्क्रीन का विश्लेषण करने में सक्षम होने के लिए क्या कोई "तैयार" टेक्स्ट है या नहीं। स्क्रीन पर कब्जा करने में सक्षम होने के लिए आपका आवेदन लाइव/सक्रिय होना चाहिए।

+0

मैं एक्सेसिबिलिटी नोडइन्फो का उपयोग कर रहा हूं, और मेरा मानना ​​है कि मेरे पास अब यह सब काम कर रहा है, कोई रूट जरूरी नहीं है। बस कुछ और बदलावों को समझना होगा और मुझे सही रास्ते पर होना चाहिए। – Jayce

0

पाठ पढ़ने की कोशिश करने के बजाय एक प्रसारण रिसीवर का उपयोग करने के बजाय और प्रत्येक प्रसारण चेक टेक्स्टव्यू की लंबाई सेट होने पर, ऐप शुरू करें या जो कुछ भी आप चाहते हैं उसे करें।

+0

क्या आपके पास कोई उदाहरण है? – Jayce

संबंधित मुद्दे