Android Studio电视遥控器按钮

时间:2016-09-13 21:47:15

标签: android android-studio android-tv

我正在尝试使用电视遥控器上的以下按钮制作Android电视应用:updownleftright,{ {1}},center/enterhome

我需要做哪些课程/活动? 我一直在尝试使用此处的back代码:Link dev android.

但是当我尝试在带有方向键盘输入的电视上使用Android模拟器进行测试时,它不起作用。有了很多Log语句,我发现我的问题是以下几行代码:

Dpad

我得到的输出如下(并打印2次,即使我只按一次按钮):

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;

我看到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 总是返回0.0,但我不知道为什么。

以下是我在getAxisValue(MotionEvent.AXIS_HAT_X/Y)MainActivity.java内)中调用此函数的代码:

OnCreate

1 个答案:

答案 0 :(得分:2)

如果您没有使用leanback并希望功能位于Activity,那么您只需覆盖Activity方法onKeyDown()

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    Log.d("debug", "we are here");
    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:
            Log.d("OnKey", "key pressed!");
            Toast.makeText(MainActivity.this, "key pressed!", Toast.LENGTH_SHORT).show();
            return true;
    }
    return false;
}

然后使用如下所示的switch语句(在keyCode上)来触发您想要捕获的条件(case KeyEvent.KEYCODE_DPAD_UPcase KeyEvent.KEYCODE_DPAD_DOWN等)。

当您加入代码共享时,您还可以在视图上设置OnKeyListener,但在这种情况下,您只需要覆盖Activity方法。

如果您使用leanback(擅长列表管理和媒体播放):

Leanback,Google为了更轻松地编写Android TV应用程序而创建的库,它本身处理这个内容,因为它与内容列表和媒体播放相关。我建议查看我上面链接的示例项目。

如果您想自己实施点击处理,可以查看其源代码,并了解他们如何在PlaybackControlGluePlaybackOverlayFragment类中解决此问题。

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

通过以下方式设置:mFragment.setInputEventHandler(mOnInputEventHandler);

另一个很好的例子是PlaybackOverlayFragment onInterceptInputEvent(...)找到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);

如果这可以解决您的问题,请告诉我。

相关问题