2014-09-04 9 views
5

मेरे उपयोगकर्ता टॉकबैक सक्षम या कुछ अन्य सुलभ सेवा का उपयोग करेंगे। मैं अपने ऐप में ऑनकेवेंट घटनाओं को कैप्चर करना चाहता हूं लेकिन ईवेंट सक्षम एक्सेसिबिलिटी सर्विसेज को भेजा जाता है। मैंने निम्नलिखित बुनियादी पहुंच सेवा बनाई है।ऑनकेवेन्ट और एक्सेसिबिलिटी सेवा

public class Accessibility_Service extends AccessibilityService { 

    private String TAG = Accessibility_Service.class.getSimpleName(); 

    @Override 
    public boolean onKeyEvent(KeyEvent event) { 
     int action = event.getAction(); 
     int keyCode = event.getKeyCode(); 
     if (action == KeyEvent.ACTION_UP) { 
      if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { 
       Log.d("Hello", "KeyUp"); 
      } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { 
       Log.d("Hello", "KeyDown"); 
      } 
      return true; 
     } else { 
      return super.onKeyEvent(event); 
     } 
    } 

    /** 
    * Passes information to AccessibilityServiceInfo. 
    */ 
    @Override 
    public void onServiceConnected() { 
     Log.v(TAG, "on Service Connected"); 
     AccessibilityServiceInfo info = new AccessibilityServiceInfo(); 
     info.packageNames = new String[] { "com.camacc" }; 
     info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK; 
     info.notificationTimeout = 100; 
     info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN; 
     setServiceInfo(info); 

    }// end onServiceConnected 

    /** 
    * Called on an interrupt. 
    */ 
    @Override 
    public void onInterrupt() { 
     Log.v(TAG, "***** onInterrupt"); 

    }// end onInterrupt 

    @Override 
    public void onAccessibilityEvent(AccessibilityEvent event) { 
     // TODO Auto-generated method stub 

    } 
}// end Accessibility_Service class 

जब मैं लॉगकैट की जांच करता हूं तो मुझे कोई प्रतिक्रिया नहीं मिल रही है। क्या TalkBack या ऐसी अन्य एक्सेसिबिलिटी सेवाओं से पहले वॉल्यूम डाउन एंड अप इवेंट्स का उपभोग करना संभव है?

धन्यवाद।

संपादित करें:

जोड़ा नहीं भाग्य के साथ फ्लैग अभी भी निम्न:

info.flags = AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS; 

उत्तर

-2

मुझे लगता है कि आप जब आप AccessibilityService का विस्तार "onAccessibilityEvent()" विधि लागू करने के लिए करना चाहिए, बात की तरह:

@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
    final int eventType = event.getEventType(); 
    switch(eventType) { 
     case AccessibilityEvent.TYPE_VIEW_CLICKED: 
      do somthing 
      break; 
     case AccessibilityEvent.TYPE_VIEW_FOCUSED: 
      do somthing 
      break; 
    } 
4

पुराना सवाल, लेकिन शायद यह उत्तर किसी की मदद करेगा।

हां, यह संभव है कि एक और पहुंच सेवा सेवा KeyEvent का उपभोग करे।

कृपया FLAG_REQUEST_FILTER_KEY_EVENTS प्रलेखन पर एक नजर है, वहाँ है: इस ध्वज की स्थापना की गारंटी नहीं है कि इस सेवा के महत्वपूर्ण घटनाओं को फिल्टर के बाद से केवल एक ही सेवा किसी भी समय ऐसा कर सकते हैं होगा। विभिन्न कुंजी फ़िल्टरिंग सेवाओं को सक्षम करने के मामले में व्यवहार परिवर्तन के कारण यह उपयोगकर्ता भ्रम से बचाता है। यदि पहले से ही एक और कुंजी फ़िल्टरिंग सेवा सक्षम है, तो यह महत्वपूर्ण घटनाएं प्राप्त नहीं करेगा।

तो एक और पहुंच सेवा सेवा KeyEvents का उपभोग कर सकती है।

5

xml संसाधन में इस तरह उपयोग सेवा है कॉन्फ़िगर करने के लिए प्रयास करें, यदि आप अधिक की जरूरत है जानकारी इस देखो: https://developer.android.com/guide/topics/ui/accessibility/services.html

<?xml version="1.0" encoding="utf-8"?> 
<accessibility-service 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:accessibilityEventTypes="typeContextClicked|typeViewClicked" 
android:packageNames="com.example.andres.eventcapture" 
android:accessibilityFlags="flagRequestFilterKeyEvents" 
android:accessibilityFeedbackType="feedbackAllMask" 
android:notificationTimeout="50" 
android:canRetrieveWindowContent="true" 
android:settingsActivity="" 
android:canRequestFilterKeyEvents="true" 
/> 

यह अच्छा काम किया!

+0

धन्यवाद, मैं वॉल्यूम अप और वॉल्यूम डाउन इवेंट पाने में सक्षम था। मुलायम कीबोर्ड कुंजी प्रेस / – ashishdhiman2007

1

info.package नामों को हटाने का प्रयास करें या इसे शून्य पर सेट करें। प्रलेखन के अनुसार here आपको केवल उन एप्लिकेशन पैकेजों द्वारा उत्पन्न ईवेंट प्राप्त होंगे।

0

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

public class VolumeKeyController { 

    private MediaSessionCompat mMediaSession; 
    private final Context mContext; 

    public VolumeKeyController(Context context) { 
     mContext = context; 
    } 

    private void createMediaSession() { 
     mMediaSession = new MediaSessionCompat(mContext, KeyUtil.log); 

     mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | 
       MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); 
     mMediaSession.setPlaybackState(new Builder() 
       .setState(PlaybackStateCompat.STATE_PLAYING, 0, 0) 
       .build()); 
     mMediaSession.setPlaybackToRemote(getVolumeProvider()); 
     mMediaSession.setActive(true); 
    } 

    private VolumeProviderCompat getVolumeProvider() { 
     final AudioManager audio = mContext.getSystemService(Context.AUDIO_SERVICE); 

     int STREAM_TYPE = AudioManager.STREAM_MUSIC; 
     int currentVolume = audio.getStreamVolume(STREAM_TYPE); 
     int maxVolume = audio.getStreamMaxVolume(STREAM_TYPE); 
     final int VOLUME_UP = 1; 
     final int VOLUME_DOWN = -1; 

     return new VolumeProviderCompat(VolumeProviderCompat.VOLUME_CONTROL_RELATIVE, maxVolume, currentVolume) { 
      @Override 
      public void onAdjustVolume(int direction) { 
       // Up = 1, Down = -1, Release = 0 
       // Replace with your action, if you don't want to adjust system volume 
       if (direction == VOLUME_UP) { 
        audio.adjustStreamVolume(STREAM_TYPE, 
          AudioManager.ADJUST_RAISE, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); 
       } 
       else if (direction == VOLUME_DOWN) { 
        audio.adjustStreamVolume(STREAM_TYPE, 
          AudioManager.ADJUST_LOWER, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); 
       } 
       setCurrentVolume(audio.getStreamVolume(STREAM_TYPE)); 
      } 
     }; 
    } 

    // Call when control needed, add a call to constructor if needed immediately 
    public void setActive(boolean active) { 
     if (mMediaSession != null) { 
      mMediaSession.setActive(active); 
      return; 
     } 
     createMediaSession(); 
    } 

    // Call from Service's onDestroy method 
    public void destroy() { 
     if (mMediaSession != null) { 
      mMediaSession.release(); 
     } 
    } 
} 
संबंधित मुद्दे