2014-09-04 6 views
5

Meine Benutzer verwenden TalkBack aktiviert oder einen anderen Accessible Service. Ich möchte die onKeyEvent-Ereignisse in unserer App erfassen, aber das Ereignis wird an die aktivierten Eingabehilfen gesendet. Ich habe den folgenden grundlegenden Accessibility Service erstellt.onKeyEvent & Accessibility Service

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 

Wenn ich den Logcat überprüfe bekomme ich keine Antwort. Ist es möglich, die Lautstärke-Down- und Up-Events vor TalkBack oder anderen solchen Accessibility Services zu nutzen?

Vielen Dank.

EDIT:

addierten folgende FLAG NOCH OHNE GLÜCK:

info.flags = AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS; 

Antwort

-2

Ich denke, man muss "onAccessibilityEvent()" Methode implementieren, wenn Sie AccessibilityService erweitern, das Ding wie:

@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

Alte Frage, aber vielleicht wird diese Antwort jemandem helfen.

Ja, es ist möglich, dass ein anderer Accessibility-Dienst KeyEvent konsumiert.

haben Sie einen Blick auf FLAG_REQUEST_FILTER_KEY_EVENTS Dokumentation gibt es: Das Setzen dieses Flags nimmt keine Garantie dafür, dass dieser Service Schlüsselereignisse filtern wird, da nur ein Dienst so zu einem bestimmten Zeitpunkt tun. Dies vermeidet Benutzerverwirrungen aufgrund von Verhaltensänderungen, falls verschiedene Schlüsselfilterdienste aktiviert sind. Wenn bereits ein anderer Schlüsselfilterungsdienst aktiviert ist, empfängt dieser keine Schlüsselereignisse.

Ein anderer Accessibility Service kann KeyEvents konsumieren.

5

Versuchen Sie, die Zugänglichkeit Dienst wie dies in der XML-Ressource zu konfigurieren, wenn Sie weitere Informationen benötigen aussehen: 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" 
/> 

Es funktionierte gut!

+0

Danke, ich war in der Lage, Lautstärke zu erhöhen und Lautstärke herunterzufahren Ereignisse. Erkennt keine Softkey-Tastenbetätigungen / – ashishdhiman2007

1

Versuchen Sie, die info.packageNames zu entfernen oder auf null zu setzen. Gemäß der Dokumentation here erhalten Sie nur von diesen Anwendungspaketen generierte Ereignisse.

0

Wenn Sie speziell Volume-Tasten drücken möchten, funktioniert dies. Es überschreibt die Lautstärketastenaktion, also vermeiden Sie es global zu verwenden.

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(); 
     } 
    } 
}