BroadcastReceiver 中的 MediaPlayer 在 Android 中不工作

MediaPlayer in BroadcastReceiver not working in Android

我在让 BroadcastReceiver 中的 MediaPlayer 工作时遇到问题。我想做的是在 Firebase 发出通知后 x 分钟播放声音和振动,就像第二次提醒一样。 我有一个扩展 FirebaseMessagingService 的 class,在 onMessageReceived() 方法中我调用了 setOnetimeTimer(this) 即:

public void setOnetimeTimer(Context context) {
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (1000 * 60 * 1), pi); // 1 minute
}

那么 AlarmManagerBroadcastReceiver() 是:

public class AlarmManagerBroadcastReceiver 扩展 BroadcastReceiver {

MediaPlayer mp = null;

@Override
public void onReceive(Context context, Intent intent) {
    if (mp != null) {
        mp.stop();
        mp.release();
        mp = null;
    }

    mp = MediaPlayer.create(context, R.raw.my_weird_sound);
    mp.start();
    Vibrator vib = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
    vib.vibrate(1000);

    mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.release();
        }
    });
  }
}

振动执行没有问题,但没有播放声音,我得到的错误是:

E/MediaPlayer-JNI: JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0
E/MediaPlayer-JNI: JNIMediaPlayerFactory: bIsQCMediaPlayerPresent 0
D/MediaPlayer: setSubtitleAnchor in MediaPlayer

还请记住,我的清单中有 AlarmManagerBroadcastReceiver

如有任何帮助,我们将不胜感激!

当 MediaPlayer 没有正确实现其架构时,就会出现这些类型的异常。 Achitecure

现在试试这个:

MediaPlayer mp = null;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (mp != null && mp.isPlaying()) {
            mp.stop();
            mp.release();
            mp=null;
        }
        else {
            mp = null;
        }

        mp = MediaPlayer.create(context, R.raw.my_weird_sound);
        mp.start();
        Vibrator vib = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
        vib.vibrate(1000);

        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                if (!mp.isPlaying()) {
                    mp.release();
                }
                else {
                    mp.stop();
                    mp.release();
                }

            }
        });
    }