2016-09-13 4 views
1

Я пытаюсь сделать приложение для Android TV, который будет использовать следующие кнопки с пульта ДУ телевизора: вверх, вниз, влево, вправо, центр/войти, дом, назадAndroid студии ТВ кнопки пульта дистанционного управления

Что классы/события мне нужно сделать? Я пытался использовать код Dpad, который можно найти здесь: https://developer.android.com/training/game-controllers/controller-input.html#dpad

Но это не работает, когда я пытаюсь протестировать его с помощью эмулятора Android на телевизоре с вводом направленного ввода. С большим количеством заявлений журнала, я нашел мою проблему, чтобы быть следующие строки кода:

if (event instanceof MotionEvent) { 
     // Use the hat axis value to find the D-pad direction 
     MotionEvent motionEvent = (MotionEvent) event; 
     float xaxis = motionEvent.getAxisValue(MotionEvent.AXIS_HAT_X); 
     float yaxis = motionEvent.getAxisValue(MotionEvent.AXIS_HAT_Y); 
     Log.d("test", "xaxis = " + String.valueOf(xaxis) + " yaxis = " + String.valueOf(yaxis)); 
    } 
    Log.d("test", "returning directionPressed as - " + String.valueOf(directionPressed)); 
    return directionPressed; 

и выход я получаю выглядит следующим образом (и печатает 2 раза, даже если нажать на кнопку только один раз):

09-13 14:45:05.643 1489-1489/omgandroid D/test: is motion event = true 
09-13 14:45:05.643 1489-1489/omgandroid D/test: is key event = false 
09-13 14:45:05.643 1489-1489/omgandroid D/test: xaxis = 0.0 yaxis = 0.0 
09-13 14:45:05.643 1489-1489/omgandroid D/test: returning directionPressed as -1 

Я вижу, что getAxisValue (MotionEvent.AXIS_HAT_X/Y всегда возвращается 0.0, но я не знаю, почему.

Вот код, где я звоню эту функцию в моей MainActivity.java (внутри OnCreate):

mContentView.setOnGenericMotionListener(new View.OnGenericMotionListener() { 
      @Override 
      public boolean onGenericMotion(View view, MotionEvent event) { 
       Log.d("test", "this works too"); 
       // Check if this event if from a D-pad and process accordingly. 
       boolean check = Dpad.isDpadDevice(event); 
       String str_check = String.valueOf(check); 
       Log.d("test", "is dpad device? " + str_check); 
       if (check) { 

        int press = mDpad.getDirectionPressed(event); 
        Log.d("test", String.valueOf(press)); 
        switch (press) { 
         case LEFT: 
          // Do something for LEFT direction press 
          Log.d("test", "LEFT"); 
          String uri = source + image; 
          ImageView img = (ImageView) findViewById(R.id.fullscreen_content); 
          img.setImageResource(R.drawable.a00_d01_01); 
          return true; 
         case RIGHT: 
          // Do something for RIGHT direction press 
          Log.d("test", "RIGHT"); 
          return true; 
         case UP: 
          // Do something for UP direction press 
          Log.d("test", "UP"); 
          return true; 
         case DOWN: 
          // Do something for DOWN direction press 
          Log.d("test", "DOWN"); 
          return true; 
         case CENTER: 
          // DO something for CENTER direction press 
          Log.d("test", "CENTER"); 
          return true; 
         default: 
          return false; 
        } 
       } 
       return false; 
      } 
     }); 

ответ

1

Если вы не используете Leanback и вы хотите функциональность в качестве на Activity, то вы можете просто переопределить метод ActivityonKeyDown():

А затем использовать переключатель заявление, как показано ниже (на keyCode), чтобы вызвать условия, которые вы хотите поймать (case KeyEvent.KEYCODE_DPAD_UP, case KeyEvent.KEYCODE_DPAD_DOWN и т. д.).

Как вы добавили свой код, вы также можете установить OnKeyListener на представлениях, но в этом случае вам нужно только переопределить метод Activity.


Если вы используете Leanback (который выделяется при управлении списка и воспроизведения медиа-файлов):

Leanback, библиотеки, Google создан, чтобы сделать написание Android TV приложений проще, обрабатывает это изначально, как он относится к спискам контента, а также воспроизведения мультимедиа. Я бы рекомендовал проверить их пример проекта, который я связал с выше.

Если вы хотите реализовать обработку кликов самостоятельно, вы можете просмотреть их исходный код и посмотреть, как они решаются в классах и PlaybackOverlayFragment.

Here они обрабатывают события в onKey(...) метода:

@Override 
public boolean onKey(View v, int keyCode, KeyEvent event) { 
    switch (keyCode) { 
     case KeyEvent.KEYCODE_DPAD_UP: 
     case KeyEvent.KEYCODE_DPAD_DOWN: 
     case KeyEvent.KEYCODE_DPAD_RIGHT: 
     case KeyEvent.KEYCODE_DPAD_LEFT: 
     case KeyEvent.KEYCODE_BACK: 
     case KeyEvent.KEYCODE_ESCAPE: 

и некоторые дополнительные события в методе dispatchAction(...) прямо под ним:

boolean canPlay = keyEvent == null || 
       keyEvent.getKeyCode() == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE || 
       keyEvent.getKeyCode() == KeyEvent.KEYCODE_MEDIA_PLAY; 

Они установили ключевой обработчик через обработчик ввода:

private final PlaybackOverlayFragment.InputEventHandler mOnInputEventHandler = 
     new PlaybackOverlayFragment.InputEventHandler() { 
    @Override 
    public boolean handleInputEvent(InputEvent event) { 
     if (event instanceof KeyEvent) { 
      KeyEvent keyEvent = (KeyEvent) event; 
      return onKey(null, keyEvent.getKeyCode(), keyEvent); 
     } 
     return false; 
    } 
}; 

whic ч устанавливается через: mFragment.setInputEventHandler(mOnInputEventHandler);


Другим хорошим примером является в onInterceptInputEvent(...) методе PlaybackOverlayFragment «s найдено here:

private boolean onInterceptInputEvent(InputEvent event) { 
    final boolean controlsHidden = areControlsHidden(); 
    if (DEBUG) Log.v(TAG, "onInterceptInputEvent hidden " + controlsHidden + " " + event); 
    boolean consumeEvent = false; 
    int keyCode = KeyEvent.KEYCODE_UNKNOWN; 

    if (mInputEventHandler != null) { 
     consumeEvent = mInputEventHandler.handleInputEvent(event); 
    } 
    if (event instanceof KeyEvent) { 
     keyCode = ((KeyEvent) event).getKeyCode(); 
    } 

    switch (keyCode) { 
     case KeyEvent.KEYCODE_DPAD_CENTER: 
     case KeyEvent.KEYCODE_DPAD_DOWN: 
     case KeyEvent.KEYCODE_DPAD_UP: 
     case KeyEvent.KEYCODE_DPAD_LEFT: 
     case KeyEvent.KEYCODE_DPAD_RIGHT: 

Они прикрепляются перехватчик через: Позвольте мне знать, если это getVerticalGridView().setOnKeyInterceptListener(mOnKeyInterceptListener);

решает вашу проблему.

+0

Я немного запутался в том, как реализовать это для моего конкретного случая. Все, что у меня есть для моего ТВ-приложения, - это одно полноэкранное действие, это всего лишь 1 изображение, и я хочу изменить изображение, в зависимости от того, на какую дистанционную кнопку нажимаю. Нет видео или чего-то еще. –

+0

Я отредактировал свой ответ для случая только активности. Дайте мне знать, если вам нужно разъяснение. [Эта ссылка] (http://stackoverflow.com/a/5296551/1759443) может обеспечить более глубокое понимание. Как и [эта ссылка] (https://developer.android.com/reference/android/view/KeyEvent.html). –

+0

https://codeshare.io/JYPqO Я попытался реализовать его, как это, однако, когда я нажимаю кнопки d-pad в эмуляторе, я все еще не получаю никакого вывода. Ваши разъяснения помогли мне понять все еще немного! Я не правильно применяю методы? –

Смежные вопросы