外部キーボードの Space キーによるメディア再生の一時停止と再開

アプリでメディア ファイルを再生する場合は、物理キーボードの Spacebar キーを押すと、再生を一時停止または再開 できるようにします。

キー操作イベントに応答する

Jetpack Compose またはビューに基づくアプリは、キーボードのキーが押された場合に 同様の方法で対応します。アプリはキー操作イベントをリッスンして、イベントをフィルタし、 Spacebar キーなどのキー操作に応答します。

1. キーボードのイベントをリッスンする

Compose

Jetpack Compose では、キー入力を管理するレイアウト内の onPreviewKeyEvent 修飾子または onKeyEvent 修飾子を使用します。

Column(modifier = Modifier.onPreviewKeyEvent { event ->
    if (event.type == KeyEventType.KeyUp) {
        ...
    }
    ...
})

または

Column(modifier = Modifier.onKeyEvent { event ->
    if (event.type == KeyEventType.KeyUp) {
        ...
    }
    ...
})

ビュー

アプリのアクティビティで、onKeyUp() メソッドをオーバーライドします。

Kotlin

override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
    ...
}

Java

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    ...
}

このメソッドは、押されたキーが離されると呼び出されるため、キー入力ごとに 1 回呼び出されます。

2. Spacebar キーの押下をフィルタする

Compose の onPreviewKeyEventonKeyEvent 修飾子メソッド、または ビューの onKeyUp() メソッド内で、KeyEvent.KEYCODE_SPACE をフィルタしてメディア コンポーネントに正しいイベントを送信します。

Compose

Column(modifier = Modifier.onPreviewKeyEvent { event ->
    if (event.type == KeyEventType.KeyUp && event.key == Key.Spacebar) {
        ...
    }
    ...
})

または

Column(modifier = Modifier.onKeyEvent { event ->
    if (event.type == KeyEventType.KeyUp && event.key == Key.Spacebar) {
        ...
    }
    ...
})

ビュー

Kotlin

if (keyCode == KeyEvent.KEYCODE_SPACE) {
    togglePlayback()
    return true
}
return false

Java

if (keyCode == KeyEvent.KEYCODE_SPACE) {
    togglePlayback();
    return true;
}
return false;

要点

Compose

  • onPreviewKeyEvent: コンポーネント(またはその子の一つ)がフォーカスされたときにコンポーネントがハードウェア キーイベントをインターセプトできるようにする修飾子。
  • onKeyEvent: onPreviewKeyEvent と同様に、コンポーネント(またはその子の一つ)がフォーカスされたときにコンポーネントがハードウェア キーイベントをインターセプトできるようにする修飾子。

ビュー

  • onKeyUp(): キーが離され、アクティビティ内のビュー(TextView など)で処理されないときに呼び出されるイベント ハンドラ。

結果

これでアプリは Spacebar キーが押された場合に対応して、動画などのメディアを一時停止したり再開したりできるようになります。