2014-09-04 17 views
5

Người dùng của tôi sẽ sử dụng TalkBack được bật hoặc một số Dịch vụ trợ năng khác. Tôi muốn nắm bắt các sự kiện onKeyEvent trong Ứng dụng của chúng tôi nhưng sự kiện được gửi đến Dịch vụ trợ năng đã bật. Tôi đã tạo Dịch vụ trợ năng cơ bản sau đây.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 

Khi tôi kiểm tra logcat Tôi không nhận được phản hồi. Có thể tiêu thụ Sự kiện Giảm âm lượng và Tăng trước khi TalkBack hoặc các Dịch vụ Trợ năng khác như vậy không?

Cảm ơn bạn.

EDIT:

TĂNG SAU CỜ VẪN không có may mắn:

info.flags = AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS; 

Trả lời

-2

Tôi nghĩ rằng bạn phải thực hiện "onAccessibilityEvent()" phương pháp khi bạn mở rộng AccessibilityService; điều như:

@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

Câu hỏi cũ, nhưng có lẽ câu trả lời này sẽ giúp ai đó.

Vâng, có thể một dịch vụ trợ năng khác sẽ tiêu thụ KeyEvent.

Vui lòng xem tài liệu FLAG_REQUEST_FILTER_KEY_EVENTS, có: Đặt cờ này không đảm bảo rằng dịch vụ này sẽ lọc sự kiện quan trọng vì chỉ một dịch vụ có thể thực hiện tại bất kỳ thời điểm nào. Điều này tránh nhầm lẫn người dùng do thay đổi hành vi trong trường hợp các dịch vụ lọc khóa khác nhau được bật. Nếu đã bật một dịch vụ lọc khóa khác, dịch vụ này sẽ không nhận được các sự kiện quan trọng.

Do đó, một dịch vụ trợ năng khác có thể tiêu thụ KeyEvents.

5

Hãy thử để cấu hình các dịch vụ trợ như thế này trong tài nguyên xml, nếu bạn cần biết thêm thông tin xem xét điều này: 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" 
/> 

Nó làm việc tốt!

+0

Cảm ơn, tôi đã có thể nhận các sự kiện tăng giảm âm lượng. Không phát hiện các phím bấm bàn phím mềm / – ashishdhiman2007

1

Thử xóa thông tin.packageNames hoặc đặt thành rỗng. Theo tài liệu hướng dẫn here bạn sẽ chỉ nhận được các sự kiện được tạo ra bởi các gói ứng dụng đó.

0

Nếu bạn đặc biệt muốn nhấn phím số lượng lớn từ một Dịch vụ, thao tác này sẽ hoạt động. Nó sẽ ghi đè lên hành động khóa âm lượng, vì vậy hãy tránh sử dụng nó trên toàn cầu.

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