2012-06-15 11 views
6

जैसा कि मुझे लगता है कि यह संभव है, यहां से Detecting toast messages परन्तु मैं लिंक से कोड स्निपेट के साथ किसी भी ईवेंट को पकड़ने में असमर्थ हूं।टोस्ट ईवेंट (किसी भी ऐप से) को पकड़ें और टोस्ट संदेश प्राप्त करें

MyAccessibilityService.java

package com.test.toasts2; 

import android.accessibilityservice.AccessibilityService; 
import android.accessibilityservice.AccessibilityServiceInfo; 
import android.app.Notification; 
import android.os.Parcelable; 
import android.view.accessibility.AccessibilityEvent; 
import android.widget.Toast; 

public class MyAccessibilityService extends AccessibilityService { 

    @Override 
    public void onAccessibilityEvent(AccessibilityEvent event) { 
     System.out.println("event catched"); 
     Toast.makeText(this, "catched " + "!", Toast.LENGTH_SHORT).show(); 
     if(event.getEventType() != AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) 
      return; // event is not a notification 

     String sourcePackageName = (String)event.getPackageName(); 

     Parcelable parcelable = event.getParcelableData(); 
     if(parcelable instanceof Notification){ 
      // Statusbar Notification 
     } 
     else{ 
      // something else, e.g. a Toast message 
      String log = "Message: "+event.getText().get(0)+" [Source: "+sourcePackageName+"]"; 
      System.out.println(log); 
      // write `log` to file... 
     } 
    } 

       @Override 
       public void onInterrupt() { 
        // TODO Auto-generated method stub 
       } 

       @Override 
       protected void onServiceConnected() { 
        // TODO Auto-generated method stub 
        super.onServiceConnected(); 
        AccessibilityServiceInfo info = new AccessibilityServiceInfo(); 
        info.feedbackType = AccessibilityServiceInfo.DEFAULT; 
        setServiceInfo(info); 
       } 


} 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.test.toasts2" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="15" /> 

    <application> 
    <service android:name=".MyAccessibilityService" 
     android:label="label"> 
    <intent-filter> 
     <action android:name="android.accessibilityservice.AccessibilityService" /> 
    </intent-filter> 

    </service> 
</application> 

</manifest> 

लगता है जैसे इस सेवा बस शुरू नहीं कर रहा है। क्या मैं गलत हूं?

मैं ऐसा क्यों कर रहा हूं: मैं अपने ऐप से स्टॉक लॉन्चर पर कई शॉर्टकट इंस्टॉल कर रहा हूं। मुझे समस्या है कि थीस शॉर्टकट एक सेल में एक दूसरे पर रखा गया है (यहां तक ​​कि स्लीप 500 मदद नहीं करता)। तो मैं उन्हें एक-दूसरे से स्थापित करने का एक तरीका ढूंढ रहा हूं। लेकिन शॉर्टकट सफलतापूर्वक स्थापित होने पर कैसे जानना है? मुझे केवल एक संदेश मिला है कि ics लॉन्चर उपयोगकर्ता को दिखाता है।

+0

आपको अनुमति की अनुमति नहीं है – njzk2

उत्तर

0

एक गतिविधि है कि एक आशय का निर्माण और इसका इस्तेमाल अपनी सेवा प्रारंभ करना होगा पैदा करते हैं।

कुछ इस तरह की गतिविधि के अंदर कोड होगा।

Intent i = new Intent(YourActivity.this, MyAccessibilityService.class); 
startService(i); 

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

संपादित करें: मुझे लगता है कि आप यह पोस्ट है कि आप लिंक से इस नोट को देखा। और आप 2.2 पर यह कोशिश नहीं कर रहे हैं?

नोट: यह एंड्रॉइड 2.2 (यह टोस्ट्स को पकड़ने के लिए प्रतीत नहीं होता है) पर मेरे लिए काम नहीं करता है, लेकिन यह एंड्रॉइड 4.0 पर काम करता है।

+0

मैं एंड्रॉइड 4.0.3 पर कोशिश कर रहा हूं। अभी भी यह कोड आपके कोड के साथ भी नहीं मिल सकता है। – POMATu

+1

यह काम नहीं करेगा, आप अपनी खुद की एक्सेसिबिलिटी सेवा शुरू नहीं कर सकते हैं या आपको कोई एक्सेसिबिलिटी इवेंट नहीं मिलेगा। – Tom

0

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

आप क्यों नहीं बस अपने आवेदन में एक आंतरिक प्रसारण भेजें नहीं करते हैं और लक्ष्य फ़िल्टर के माध्यम से इसे पकड़ और फिर उस प्रसारण प्राप्त होने पर, आप सेवा शुरू कर देना चाहिए।

+0

मैं ऐप का लेखक नहीं हूं जो टोस्ट भेजता है। इसलिए मैं इसे – POMATu

+0

प्रसारण करने के लिए संशोधित नहीं कर सकता हूं, मैं अपने ऐप से स्टॉक लॉन्चर पर कई शॉर्टकट इंस्टॉल कर रहा हूं। मुझे समस्या है कि थीस शॉर्टकट एक सेल में एक दूसरे पर रखा गया है (यहां तक ​​कि स्लीप 500 मदद नहीं करता)। तो मैं उन्हें एक-दूसरे से स्थापित करने का एक तरीका ढूंढ रहा हूं। लेकिन शॉर्टकट सफलतापूर्वक स्थापित होने पर कैसे जानना है? मुझे केवल एक संदेश मिला है कि ics लॉन्चर उपयोगकर्ता को दिखाता है। – POMATu

+0

यह देखने के लिए एंड्रॉइड स्रोत कोड पढ़ने का प्रयास करें कि उस विशेष घटना के बाद कुछ है/कुछ प्रसारण है या नहीं। मुझे यकीन है कि कुछ भी नहीं है, लेकिन मैंने लॉन्चर शॉर्टकट के लिए आईसीएस स्रोत कोड नहीं देखा है, संभावना है कि यह जीबी जैसा ही है, जो सिर्फ इरादा लेता है और इसे लॉन्चर पर रखता है और कुछ भी नहीं। – JoxTraex

2

TYPE_NOTIFICATION_STATE_CHANGED आम तौर पर NotificationManager और स्थिति पट्टी में रखा माउस को दर्शाता है। फिर भी, नीचे दिए गए कोड को टोस्ट संदेश की उत्पत्ति के रूप में कुछ प्रकाश डालने में मदद करनी चाहिए। एंड्रॉइड 4.0.4 आईसीएस पर टोस्ट में android.widget.Toast की कक्षा है इसलिए getClassName चाल चलाना चाहिए।

क्या इसके लायक के लिए, परिवर्तन Android 4.0 में बनाया गया है लगता है।3 जोड़ सकते हैं और Toast.TN

private void trySendAccessibilityEvent() { 
     AccessibilityManager accessibilityManager = 
       AccessibilityManager.getInstance(mView.getContext()); 
     if (!accessibilityManager.isEnabled()) { 
      return; 
     } 
     // treat toasts as notifications since they are used to 
     // announce a transient piece of information to the user 
     AccessibilityEvent event = AccessibilityEvent.obtain(
       AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED); 
     event.setClassName(getClass().getName()); 
     event.setPackageName(mView.getContext().getPackageName()); 
     mView.dispatchPopulateAccessibilityEvent(event); 
     accessibilityManager.sendAccessibilityEvent(event); 
    } 

में निम्न विधि का उपयोग आप Android here के सभी संस्करणों में Toast वर्ग देख सकते हैं करने के लिए।

private final String getEventType(AccessibilityEvent event) { 
    switch (event.getEventType()) { 
     case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED: 
      return "TYPE_NOTIFICATION_STATE_CHANGED"; 
     case AccessibilityEvent.TYPE_VIEW_CLICKED: 
      return "TYPE_VIEW_CLICKED"; 
     case AccessibilityEvent.TYPE_VIEW_FOCUSED: 
      return "TYPE_VIEW_FOCUSED"; 
     case AccessibilityEvent.TYPE_VIEW_LONG_CLICKED: 
      return "TYPE_VIEW_LONG_CLICKED"; 
     case AccessibilityEvent.TYPE_VIEW_SELECTED: 
      return "TYPE_VIEW_SELECTED"; 
     case AccessibilityEvent.TYPE_VIEW_SCROLLED: 
      return "TYPE_VIEW_SCROLLED"; 
     case AccessibilityEvent.TYPE_VIEW_HOVER_EXIT: 
      return "TYPE_VIEW_HOVER_EXIT"; 
     case AccessibilityEvent.TYPE_VIEW_HOVER_ENTER: 
      return "TYPE_VIEW_HOVER_ENTER"; 
     case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START: 
      return "TYPE_TOUCH_EXPLORATION_GESTURE_START"; 
     case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_END: 
      return "TYPE_TOUCH_EXPLORATION_GESTURE_END"; 
     case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: 
      return "TYPE_WINDOW_STATE_CHANGED"; 
     case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED: 
      return "TYPE_WINDOW_CONTENT_CHANGED"; 
     case AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED: 
      return "TYPE_VIEW_TEXT_SELECTION_CHANGED"; 
     case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED: 
      return "TYPE_VIEW_TEXT_CHANGED"; 
    } 

    return "default"; 
} 

private final String getEventText(AccessibilityEvent event) { 
    StringBuilder sb = new StringBuilder(); 
    for (CharSequence s : event.getText()) { 
     sb.append(s); 
     sb.append('\n'); 
    } 
    return sb.toString(); 
} 

@Override 
public void onAccessibilityEvent(AccessibilityEvent event) 
{ 
    Log.v(TAG, String.format(
     "onAccessibilityEvent: [type] %s [class] %s [package] %s [time] 
     %s [fullscreen] %s [text] %s", getEventType(event), event.getClassName(), 
     event.getPackageName(), event.getEventTime(), Boolean.toString(
     event.isFullScreen()), getEventText(event))); 

    if (android.os.Build.VERSION.SDK_INT >= 14) 
     Log.v(TAG, "Window ID: " + Integer.toString(event.getWindowId()) + "."); 
} 

private void setServiceInfo(int feedbackType) 
{ 
    final AccessibilityServiceInfo info = new AccessibilityServiceInfo(); 
    // We are interested in all types of accessibility events. 
    info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK; 
    // We want to provide specific type of feedback. 
    info.feedbackType = feedbackType; 
    // We want to receive events in a certain interval. 
    // info.notificationTimeout = EVENT_NOTIFICATION_TIMEOUT_MILLIS; 
    // We want to receive accessibility events only from certain packages. 
    // info.packageNames = PACKAGE_NAMES; 
    setServiceInfo(info); 
} 

private boolean isInfrastructureInitialized = false; 

@Override 
public void onServiceConnected() 
{ 
    if (isInfrastructureInitialized) return; 

    // Claim the events with which to listen to. 
    setServiceInfo(AccessibilityServiceInfo.FEEDBACK_ALL_MASK); 

    // We are in an initialized state now. 
    isInfrastructureInitialized = true; 
} 

स्रोत: व्यक्तिगत अनुभव

+0

अभी भी काम नहीं करते हैं। क्या आप इस कोड के साथ एक परियोजना साझा कर सकते हैं? शायद मैं कुछ गलत कर रहा हूं ... – POMATu

+0

क्षमा करें, यह मेरे एक ऐप से प्रतिलिपि बनाई गई थी और मैं पूर्ण स्रोत चिपका नहीं रहा हूं। मैं आपको आश्वस्त कर सकता हूं कि एंड्रॉइड 4.0.4 पर मेरे वेरिज़ोन गैलेक्सी नेक्सस पर स्लिम आईसीएस चल रहा है कि यह काम करता है, लेकिन यह एंड्रॉइड के पुराने संस्करणों पर काम नहीं करता है। मुझे यकीन नहीं है कि मैं इसे ऐप में उपयोग करूँगा क्योंकि यह अविश्वसनीय है कि यह कितना अविश्वसनीय है। – Tom

+0

मैं 80 जी 9 पर एंड्रॉइड 4.0.3 का उपयोग कर रहा हूं। क्या आप अपना मैनिफेस्ट भी पोस्ट कर सकते हैं? क्या मैं startervice() के साथ सेवा शुरू करता हूँ? – POMATu

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