だから私はシンプルな音楽プレーヤーに取り組んでいます。音楽プレーヤーは、その名のとおり、曲の再生、再生の一時停止、次の曲への転送、前の曲への戻り、再生の完全な停止を行うことができます。曲を再生すると、アーティスト名と曲名が表示されます。この通知には、「停止」、「次を一時停止」の3つのボタン(アクション)もあります。
私が問題を抱えているのは、いずれかのアクションがクリックされたときに、そのアクションに関連する再生コントロールがトリガーされることを確認することです。まあ、それを行う方法はまったくわかりません。 Android通知: http://developer.Android.com/guide/topics/ui/notifiers/notifications.html を検索しましたが、明確ではありません、または通知アクションに関する情報が多すぎます。
以下は、簡単なアクションの例です(通知の[次へ]ボタンのクリックに関連付ける必要があります:注:以下で説明するすべてのコードは次のパッケージの下に書かれています:com.deadpixels.light.playerそしてアクティビティが呼び出されます:PlayerActivity
public void nextSong() {
if (position == songs.size() -1) {
Toast.makeText(this, "No more songs on queue", Toast.LENGTH_SHORT).show();
if(mPlayer.isPlaying()) {
return;
}
else {
buttonPlay.setImageResource(R.drawable.button_play);
}
return;
}
else {
position++;
playSong(songs.get(position));
}
}
これが私がやろうとしたことです:
Intent nextIntent = new Intent(KEY_NEXT);
PendingIntent nextPendingIntent = createPendingResult(0, nextIntent, 0);
NextIntentのアクションは次のとおりです。
public static final String KEY_NEXT = "com.deadpixels.light.player.PlayerActivity.nextSong";
そして、それをaddAction()を介して通知に追加します。
mBuilder.addAction(R.drawable.not_action_next, "Next", nextPendingIntent);
他に何ができるか知ってる?上記で説明したものを使用しても何も起こりません。通知が表示され、3つのアクションボタンがありますが、それらをクリックしても何も起こりません。
ある時点で、アクション名を使用してインテントフィルターを追加したのではないかと思ったのですが、それらがすべて同じ名前空間にあると思ったのですが、なぜそうする必要があるのでしょうか。
ブロードキャストを使用してこの問題を解決しました。たとえば、次の曲に進むブロードキャストを送信するには、以下を使用できます。
Intent nextIntent = new Intent(KEY_NEXT);
PendingIntent nextPendingIntent = PendingIntent.getBroadcast(this, 0, nextIntent, 0);
次に、BroadcastReceiver
内にActivity
を登録します。
IntentFilter filter = new IntentFilter();
filter.addAction(KEY_NEXT);
// Add other actions as needed
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(KEY_NEXT)) {
nextSong();
} else if (...) {
...
}
...
}
}
registerReceiver(receiver, filter);
サービスを使用してバックグラウンド再生を管理している場合は、アクティビティではなくサービスにBroadcastReceiver
を登録する必要があります。アクティビティまたはサービスのシャットダウン時に登録を解除できるように、receiver
インスタンスをどこかに保存してください。