31

だから私は単純な音楽プレーヤーに取り組んでいます。音楽プレーヤーは、名前が示すように、曲を再生し、再生を一時停止し、次の曲に進み、前の曲に戻り、再生を完全に停止できます。曲を再生すると、アーティスト名と曲名とともに通知が表示されます。この通知には、停止、一時停止、次の 3 つのボタン (アクション) もあります。

私が問題を抱えているのは、いずれかのアクションがクリックされたときに、アクションに関連する再生コントロールがトリガーされるようにすることです。それを行う方法がまったくわかりません。私は Android 通知を検索しました: http://developer.android.com/guide/topics/ui/notifiers/notifications.htmlしかし、通知アクションに関する情報を明確にしていないか、あまりにも多くの情報を提供していません。

たとえば、簡単なアクションを次に示します (これは、通知の [次へ] ボタンのクリックに関連付ける必要があります:注:以下で説明するすべてのコードは、次のパッケージの下に記述されています: :プレイヤーのアクティビティ

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 つのアクション ボタンがありますが、それらをクリックしても何も起こりません。

ある時点で、アクション名を使用してインテント フィルターを追加すればよいのではないかと考えましたが、それらはすべて同じ名前空間にあるのではないかと考えました。

4

1 に答える 1

45

ブロードキャストを使用してこの問題を解決しました。たとえば、次の曲に進むブロードキャストを送信するには、次のように使用できます。

Intent nextIntent = new Intent(KEY_NEXT);
PendingIntent nextPendingIntent = PendingIntent.getBroadcast(this, 0, nextIntent, 0);

次に、BroadcastReceiver内に a を登録します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アクティビティまたはサービスがシャットダウンされたときに登録を解除できるように、インスタンスをどこかに保存してください。

于 2012-11-13T18:36:23.173 に答える