問題タブ [mediabrowserservicecompat]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Android: NotificationCompat.MediaStyle アクション ボタンは何もしません
から派生しActivity
た とを含む単純な Android アプリがあります。と を使用して、メイン アクティビティからオーディオを再生するようにセットアップすることに成功しました。Bluetooth ヘッドフォンからのオーディオを再生および一時停止することもできます。すべて良い。Service
MediaBrowserServiceCompat
MediaBrowserCompat
MediaControllerCompat
私の課題はNotificationCompat.MediaStyle
、ロック画面と通知トレイに表示される通知に関するものです。通知は正常に表示されます。ただし、 と を使用してボタンを追加するaddAction()
とMediaButtonReceiver.buildMediaButtonPendingIntent
、何もしません。代わりに、メイン アクティビティを起動するだけのダミーの PendingIntent を追加すると、問題なく動作します。
通知を生成するためのコードを次に示します (申し訳ありませんが、これは Xamarin で実行されている C# であるため、大文字と小文字の区別と名前は、予想とは少し異なります)。これは私のサービスクラスの中にあります。
これを解決するためにこれまで見てきたことは次のとおりです。
- 再生を開始するときに使用します
MediaSession.setActive(true)
- 再生を開始および停止するたびに、適切なアクションを
PlaybackStateCompat
- セッショントークンが正しく設定されています。
- Android 5.0 以降をターゲットにしてクラスを使用しているため、マニフェストにとして何も設定していません。
MediaButtonReceiver
android.intent.action.MEDIA_BUTTON
*Compat
Bluetooth ヘッドフォン ボタンが機能するため、メディア ボタン イベントがアプリに適切にルーティングされていることはわかっています。私は自分の車で試してみましたが、そこでも機能します。機能しないのは、通知のボタンだけです。の適切なメソッドへの呼び出しを生成することを期待していますMediaSessionCompat.Callback
。これは間違っていますか?ここで何が間違っていますか?
任意のポインタに感謝します。
更新:
私はそれを働かせました。<application>
マニフェストのノード内に次を追加する必要がありました。
...そして、実装する Service のノード内の以下MediaBrowserServiceCompat
:
Bluetooth ヘッドフォンとカー インフォテインメント システムからボタンを押すと、アプリに問題なくルーティングされたので、なぜこれが必要なのか、まだ少し混乱しています。さらに重要なことに、Googleは次のように述べています。
MediaBrowserServiceCompat
アプリに が既にある場合はMediaButtonReceiver
、受信したキー イベントをMediaBrowserServiceCompat
デフォルトで に配信します。でそれらを処理できますMediaSessionCompat.Callback
。
彼らはこれを「Service Handling ACTION_MEDIA_BUTTON」オプションの代替として提供したので、マニフェストでこれ以上何もする必要がないことを意味すると考えました。誰かがここで私を啓発できるなら、私はそれを感謝します.
しかし、それだけの価値はありますが、これは私にとってはうまくいきました。
android - ExoPlayer と PlayerControlView を使用した MediaBrowserService - UI (PlayerControlView) からプレーヤー インスタンスにアクセスする方法は?
私は現在、ビデオとオーディオ機能を備えたアプリの一部に取り組んでおり、最近コードベースのリファクタリングを開始しました。目標は、統合MediaSession/ MediaController
とMediaBrowserService/ MediaBrowser
フレームワークです。
より具体的には、ビデオ コンポーネントとオーディオ コンポーネントの両方にPlayerViewを使用ExoPlayer
します。これには、次のプレーヤー インスタンスへの参照が必要です。PlayerControlView
PlayerControlView
ただし、Android 開発者の投稿と のドキュメントでMediaBrowserService
は、プレーヤー インスタンスはサービスに含まれている必要があります。さらに、クライアント サイト (MediaBrowser および MediaController) がconnect()
メソッドとMediaBrowserConnectionCallbackを介して対話してサービスを提供する唯一の方法です。これにより、プレーヤーのインスタンスを PlayerControlView に渡す (またはその逆) ことができなくなります。
MediaSessionCompat.Callbackなどのさまざまなコールバックを使用してみましたが、SimpleExoPlayerもPlayerControlViewも Parcelable ではありません。
従来のサービスでは、 を使用Binder
してサービス内で宣言したメソッドにアクセスし、次のようなことを行います。
ただし、これはMediaBrowserService/ MediaBrowser
フレームワークでは不可能のようです。この質問への回答を確認しました。これは、[sendCommand] を使用してカスタム メソッドを呼び出す方法であることを示しています。ただし、パラメーターが Parcelable である必要もあります。
要約すると、私の質問は、フレームワークの下でPlayerControlView
インスタンスにアクセスするSimpleExoPlayer
方法、またはその逆の方法があるかどうかMediaBrowserService
です。
回答やコメントをお寄せいただきありがとうございます。