【问题标题】:Playing of the previous/next song by the buttons in notification通过通知中的按钮播放上一首/下一首歌曲
【发布时间】:2019-02-02 03:41:42
【问题描述】:

我有一个播放器,当用户选择一首歌曲时,播放器会通过 3 个按钮发出通知:上一个、播放、下一个。在后台模式下选择歌曲需要此按钮。但是当我点击这个按钮时,什么都没有发生。通知代码如下:

Intent intentPrev = new Intent(this, NotificationReceiver.class);
        intentPrev.setAction(ACTION_PREV);
        LocalBroadcastManager.getInstance(this).sendBroadcast(intentPrev);
        PendingIntent pendingIntentPrev = PendingIntent.getActivity(this, 0, intentPrev, PendingIntent.FLAG_UPDATE_CURRENT);

        Intent intentPlay = new Intent(this, NotificationReceiver.class);
        intentPlay.setAction(ACTION_PLAY);
        LocalBroadcastManager.getInstance(this).sendBroadcast(intentPlay);
        PendingIntent pendingIntentPlay = PendingIntent.getActivity(this, 0, intentPlay, PendingIntent.FLAG_UPDATE_CURRENT);

        Intent intentNext = new Intent(this, NotificationReceiver.class);
        intentNext.setAction(ACTION_NEXT);
        LocalBroadcastManager.getInstance(this).sendBroadcast(intentNext);
        PendingIntent pendingIntentNext = PendingIntent.getActivity(this, 0, intentNext, PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setSmallIcon(R.drawable.notification).
                setContentTitle(songs.get(songPos).getTitle()).setContentText(songs.get(songPos).getArtist()).
                addAction(R.drawable.previous, "Previous", pendingIntentPrev).addAction(R.drawable.pause, "Pause", pendingIntentPlay).
                addAction(R.drawable.next, "Next", pendingIntentNext);
        Notification notification = builder.build();
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(1, notification);

这是接收方的代码:

package asus.example.com.player;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import java.util.Objects;

public class NotificationReceiver extends BroadcastReceiver {

    private final String    ACTION_PREV = "PREVIOUS";
    private final String    ACTION_PLAY = "PLAY";
    private final String    ACTION_NEXT = "NEXT";
    private final MyService service     = new MyService();

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Objects.equals(intent.getAction(), ACTION_PREV)){
            service.playPrev();
        }
        else if (Objects.equals(intent.getAction(), ACTION_NEXT)){
            service.playNext();
        }
    }
}

我还向 Manifest 添加了接收器:

<receiver
            android:name=".NotificationReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="PREVIOUS"/>
                <action android:name="PLAY"/>
                <action android:name="NEXT"/>
            </intent-filter>
        </receiver>

当我在调试器中观看时,我看到没有使用 Receiver 类,但我不明白为什么

【问题讨论】:

    标签: java android notifications android-broadcast


    【解决方案1】:

    现在,您正在立即发送带有如下语句的广播:

    LocalBroadcastManager.getInstance(this).sendBroadcast(intentNext);
    

    你说你想稍后开始Activity

    PendingIntent pendingIntentNext = PendingIntent.getActivity(this, 0, intentNext, PendingIntent.FLAG_UPDATE_CURRENT);
    

    (旁注:这无论如何都行不通,因为在 intentNext 中,您指定了一个扩展自 BroadcastReceiver 而不是 Activity 的类)

    应该是getBroadcast() 而不是getActivity()

    Intent intentNext = new Intent(this, NotificationReceiver.class);
    intentNext.setAction(ACTION_NEXT);
    PendingIntent pendingIntentNext = PendingIntent.getBroadcast(this, 0, intentNext, PendingIntent.FLAG_UPDATE_CURRENT);
    

    另一件事:您在所有PendingIntents 中都使用“0”作为请求代码(第二个参数)。您必须对请求代码使用不同的值,因为共享相同请求代码的两个 Intents 被认为是相同的 Intent,因此您最终会收到所有三个通知 @987654332 @s 触发相同的动作。

    【讨论】:

      猜你喜欢
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      相关资源
      最近更新 更多