0

音楽の再生を制御できるウィジェットを作成しようとしています。音楽再生時にロック画面に表示されるウィジェットと基本的には同じです。(私がどこかで読んだように、リモートコントロールクライアントに接続されているのはどれですか?それは本当ですか?)私の問題:次のコードを使用してメディアボタンを作成できました

Intent i = new Intent(Intent.ACTION_MEDIA_BUTTON);
    synchronized (this) {
        i.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT));
        sendOrderedBroadcast(i, null);
        i.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT));
        sendOrderedBroadcast(i, null);

まず、これはロック画面ウィジェットでも使用されているソリューションだと思いました。しかし、このソリューションは一部の音楽プレーヤーでのみ機能することに気付きましたが、デフォルトのロック画面ウィジェットで制御できるすべてのプレーヤーでは機能しないことは確かです (fe DoubleTwist はロック画面ウィジェットに応答しますが、メディア ボタンには応答しません)。そのため、ここ数日、Android のソース、Logcat の出力、およびさまざまなフォーラムを掘り下げましたが、ボタンによって呼び出されるインテントとロックスクリーン ウィジェットのボタンによって呼び出されるインテントの違いを見つけることができませんでした。

メディア ボタンのインテントをリッスンしていないアプリを制御するために、lockscreen ウィジェットは正確に何をしているのですか?

または、少なくとも誰かがこのウィジェットのソース コードを見つけるのを手伝ってくれませんか? デフォルトの音楽アプリ、オーディオ サービス、リモコン クライアント、ウィジェットを試しましたが、どこにも見つかりません。

4

2 に答える 2

1

メディア ボタンのインテントをリッスンしていないアプリを制御するために、lockscreen ウィジェットは正確に何をしているのですか?

ドキュメントに基づいて、それらのアプリが要求したことを実行しています-PendingIntentによって提供されたを実行しRemoteControlClientます. 特に:

  • PendingIntentではサポートされていないため、順序付けされたブロードキャストにはなりません。
  • 特定のメディアクライアントを対象としたものである可能性があります。setComponent()
  • 使用しようとしている (誤って) エクストラがある場合とない場合があります。

(「正しくない」部分は、呼び出し元のスレッドに関して非同期であるため、 2 つのACTION_UP操作を時々送信しているためです。したがって、最初の順序付けられたブロードキャストが送信される前に、をに置き換えている可能性があります。ブロードキャストごとに個別のオブジェクト)。sendOrderedBroadcast()ACTION_DOWNACTION_UPIntent

ただし、ドキュメントではPendingIntentを 用にセットアップする必要があると主張していますが、これがドキュメントの誤りであり、ブロードキャストを適切な受信者に配信するのに十分でACTION_MEDIA_BUTTONあるため、特定のアクションは必要ない場合でも驚かないでしょう。setComponent()

于 2013-01-27T17:34:35.427 に答える