Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bluetoothイヤホンのリモコン機能で操作ができない #139

Closed
mikuta0407 opened this issue Oct 10, 2018 · 12 comments · Fixed by #393
Closed

Bluetoothイヤホンのリモコン機能で操作ができない #139

mikuta0407 opened this issue Oct 10, 2018 · 12 comments · Fixed by #393

Comments

@mikuta0407
Copy link

おそらく有線イヤホンのリモコンも同じかと思われますが、再生/一時停止等をしてもハヤえもんの操作ができず、別アプリが起動してそれを操作してしまいます

@ryotayama
Copy link
Owner

問合せ385も同件✍️

@sugartarou
Copy link
Collaborator

sugartarou commented Feb 20, 2024

ボタンのイベントは以下で取れそう
https://developer.android.com/reference/androidx/media/session/MediaButtonReceiver

関連:MediaControls(Android11からサポートされた新しい機能)
https://developers.cyberagent.co.jp/blog/archives/31631/
Android11からだけどCompat使えばAndroid10以前でも多少似た機能に置き換わって使えるらしい

なんかとても勉強になるページを見つけた
https://qiita.com/siy1121/items/f01167186a6677c22435
https://segaxd.co.jp/blog/8578d58f1da63f91609e6bd92cc279a5f954e4a4.html

@sugartarou
Copy link
Collaborator

sugartarou commented Feb 20, 2024

公式によると、MediaSessionを使ってるのであればonStartCommandでMediaButtonReceiverと紐づけてしまえばMediaSessionCompat.Callbackと紐づいてくれるみたい。

private MediaSessionCompat mMediaSessionCompat = ...;

public int onStartCommand(Intent intent, int flags, int startId) {
  MediaButtonReceiver.handleIntent(mMediaSessionCompat, intent);
  return super.onStartCommand(intent, flags, startId);
}

ただ、はやえもんはAndroid13(SDK 33)以降でのみMediaSessionCompatを使っているのでAndroid 12以前はMediaButtonReceiverを直接利用したほうが実装影響少なさそう。

        if (Build.VERSION.SDK_INT >= 33) {
            mediaSession = new MediaSessionCompat(this, "MediaSessionTag");

@sugartarou
Copy link
Collaborator

単純にMediaButtonReceiverを使うとAndroid13以降でMediaSessionの処理と競合してバグることがわかった。
Android12以前に絞ってMediaButtonReceiverをregisterReceiverするとかできないかな。。

@sugartarou
Copy link
Collaborator

sugartarou commented Feb 21, 2024

有線イヤホン使ってAmazon Musicと振る舞い比較してみた。

・Amazon Music
再生/停止ボタン:反応する
         Homeキー押してアプリをPauseさせても引き続き反応する
         MediaBrowserかAudioFocusか、そのあたりの対応が入ってそう。

・ハヤえもん
再生/停止ボタン:無反応(BroadcastReceiver作ってintent-filter設定したけどダメ)
         Amazon Musicで再生した後だと、ハヤえもんで曲流してるときに再生/停止押すと、
         Amazon Music側が反応して、ハヤえもんと音が混ざって再生される不思議な状態。
         Amazon Music側がMediaBrowserかAudioFocusを捕まえたまま、ハヤえもんも音を再生しているということ?
        https://qiita.com/siy1121/items/f01167186a6677c22435 これの実装をしっかりすべきかも。

@sugartarou
Copy link
Collaborator

古そうだけどこれを見てみる
https://youtu.be/FBC1FgWe5X4?si=Pg1ZL3uePSUaCREW

@sugartarou
Copy link
Collaborator

sugartarou commented Feb 26, 2024

単純にMainActivityのonKeyDownに追加してみれば実は動くのでは。。。

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_MEDIA_PLAY || keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) {
            PlaylistFragment.onPlayBtnClick();
            return true;
        }
        if (keyCode == KeyEvent.KEYCODE_MEDIA_REWIND) {
            PlaylistFragment.onRewindBtnClick();
            return true;
        }
        if (keyCode == KeyEvent.KEYCODE_MEDIA_NEXT) {
            PlaylistFragment.onForwardBtnClick();
            return true;
        }

ForegroundServiceのonHandleIntetに以下を入れればAndroid13(API33)以上はいける?

        if (Build.VERSION.SDK_INT >= 33) {
            MediaButtonReceiver.handleIntent(mediaSession, intent);
        }

@ryotayama
Copy link
Owner

いったんonKeyDownの方試してみたけど動かず✍️

@ryotayama
Copy link
Owner

onHandleIntetの方も動かず✍️
やっぱり根深い話になるのかな…!

@sugartarou
Copy link
Collaborator

sugartarou commented Feb 27, 2024

ぐぬぬ…ダメでしたか〜
intent-filterの記載をマニフェストにしとかないといけないとかある気がするので
手元の端末と有線イヤホンでとりあえず確認してみます。
⇒変わらずダメだったのでMediaSessionとかMediaBrowserをお試ししてみます。
 お試しの方針としては、以下を参考に、既存のForegroundServiceを置き換える形でやってみようと思います。
 https://segaxd.co.jp/blog/8578d58f1da63f91609e6bd92cc279a5f954e4a4.html

sugartarou pushed a commit that referenced this issue Feb 27, 2024
sugartarou pushed a commit that referenced this issue Feb 27, 2024
・通知欄の対応
・MediaBrowser接続
・ExoPlayerを抜いてBASSを見るように修正
#139
sugartarou pushed a commit that referenced this issue Feb 27, 2024
・onMediaButtonEventに手動でKeyEventの処理を実装
#139
@sugartarou
Copy link
Collaborator

結局動作で調べ倒したところ、MediaSessionCompat.CallbackのonMediaButtonEventがまともに動いてない気がした。
公式ドキュメント読んでもonPlayとかをいい感じに呼んでくれると書いてあるがいくらやっても呼ばれない。
onMediaButtonEventをoverrideして自分でキーの処理実装してみたので実機とイヤホンで動かしてみたい。
これでいけるなら元のForegroundServiceの実装でもこれ入れるだけで終わるんじゃないか?

@ryotayama
Copy link
Owner

「139-MediaBrowserお試し」、実機のAndroid 13環境で試してみたところうまくいってそう…!

◆アプリを起動
①再生ボタンをタップし、再生開始
②Bluetoothイヤホンの再生/一時停止ボタンを押す→一時停止
③再度、再生/一時停止ボタンを押す→再開
④再度、再生/一時停止ボタンを押す→一時停止
⑤再度、再生/一時停止ボタンを押す→再開

◆アプリをバックグラウンドにする
①Bluetoothイヤホンの再生/一時停止ボタンを押す→一時停止
②再度、再生/一時停止ボタンを押す→再開
③再度、再生/一時停止ボタンを押す→一時停止
④再度、再生/一時停止ボタンを押す→再開

sugartarou pushed a commit that referenced this issue Feb 28, 2024
・再生/停止ボタン
・次の曲へ
・前の曲へ

#139
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants