Android推送通知声音在Android上缺少(不起作用)背景和前景

时间:2019-09-11 06:00:28

标签: android push-notification notifications firebase-notifications notification-channel

我已经为推送通知实现了FCM。 我正在调用此OnMessageReceived方法,但是当应用程序位于前景和背景中时不会播放声音

这是我的代码

public class MyFirebaseMessagingService extends FirebaseMessagingService {

public static  String ChannelID = "";
public static final int NOTIFICATION_ID = 1041;
public static boolean IsDriverBusy = false;
private NotificationManager notificationManager;
private SharedPreferences sharedPreferences;
private NotificationChannel mChannel;
private NotificationCompat.Builder notificationBuilder;

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    System.out.println("notificationIntentIs   0000000000000123545 onMessageReceived  " + IsDriverBusy);

    String mTime = getDate(remoteMessage.getSentTime());
    String RiderLOcation = remoteMessage.getData().get("RiderLocation");
    String RiderID = remoteMessage.getData().get("RiderID");
    String Dlat = remoteMessage.getData().get("Dlat");
    String DLong = remoteMessage.getData().get("DLong");
    String Plat = remoteMessage.getData().get("Plat");
    String Plong = remoteMessage.getData().get("Plong");
    String RiderName = remoteMessage.getData().get("RiderName");
    String RiderRating = remoteMessage.getData().get("RiderRating");
    String MainBody = "RiderID:" + RiderID + ";RiderName:" + RiderName + ";RiderLocation:"
            + RiderLOcation + ";PLat:" + Plat + ";PLong:" + Plong + ";DLat:" + Dlat + ";DLong:" + DLong + ";RiderRating:" + RiderRating;
    sharedPreferences = getSharedPreferences("LoginDetail", Context.MODE_PRIVATE);
    if (sharedPreferences.getString("id", "").equals("")) {
        Intent intent1 = new Intent(this, LoginActivity.class);
        startActivity(intent1);

    } else {
        if (!IsDriverBusy) {
            sendNotification(MainBody);
            PreferenceHandler.writeString(this, PreferenceHandler.RIDE_DETAIL, MainBody);
        }
    }

}

private String getDate(long time) {
    Calendar cal = Calendar.getInstance(Locale.ENGLISH);
    cal.setTimeInMillis(time * 1000L);
    String date = DateFormat.format("dd-MM-yyyy hh:mm:ss", cal).toString();
    return date;
}

@SuppressLint("WrongConstant")
private void sendNotification(String messageBody) {

    Intent intent = new Intent(this, MainActivity.class);
    Bundle bundle = new Bundle();
    bundle.putString("bookingId", messageBody);
    intent.putExtras(bundle);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    PendingIntent pendingIntent = PendingIntent.getActivity(this,
            0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);
    startActivity(intent);
    ChannelID=getString(R.string.default_notification_channel_id);

    Uri defaultSoundUri = Uri.parse("android.resource://com.my.package/" + R.raw.windchime);
    long[] VIBRATE_PATTERN = {0, 500};

    notificationBuilder = new NotificationCompat.Builder(this, ChannelID)
            .setSmallIcon(R.drawable.logo)
            .setVibrate(VIBRATE_PATTERN)
            .setPriority(Notification.DEFAULT_ALL)
            .setDefaults(Notification.DEFAULT_ALL)
            .setWhen(System.currentTimeMillis())
            .setContentTitle(getResources().getString(R.string.app_name))
            .setContentText(getString(R.string.notificationData))
            .setAutoCancel(true)
            .setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
            .setContentIntent(pendingIntent);

    notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    // Since android Oreo notification channel is needed.
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {

        AudioAttributes mAudioAttributes=new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .build();

        mChannel = new NotificationChannel(ChannelID, "Qwykr_Channel",
                NotificationManager.IMPORTANCE_HIGH);
        mChannel.setVibrationPattern(VIBRATE_PATTERN);
        mChannel.setImportance(Notification.DEFAULT_ALL);
        mChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
        mChannel.setSound(Settings.System.DEFAULT_NOTIFICATION_URI,mAudioAttributes);
        notificationManager.createNotificationChannel(mChannel);
    }

    notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
    clearNotification(NOTIFICATION_ID);
}

public void clearNotification(int ID) {
    Handler handler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message message) {

        }
    };
    Runnable doDisplayError = new Runnable() {
        public void run() {

            notificationManager.cancel(ID);
        }
    };
    handler.postDelayed(doDisplayError, 3000);

}

}

我正在使用小米Redmi 7 pro。我正在检查手机设置应用程序通知通道,仅启用了振动而不是声音,并且启用了其他选项。 如何设置类似Whatsapp和电报应用程序的频道? 如何启用屏幕快照的所有字段,如声音,浮动通知,锁屏通知? 这是我的应用频道截图:

enter image description here

请帮助我解决问题。 感谢andvance

2 个答案:

答案 0 :(得分:1)

此代码对我有用

首先,您可以卸载应用,然后尝试使用渠道代码。

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    String channelId = CommonUtill.random();
    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(this, channelId)
                    .setSmallIcon(R.drawable.logo)
                    .setContentTitle(getString(R.string.app_name))
                    .setContentText(messageBody)
                    .setAutoCancel(true)

                    .setSound(defaultSoundUri)
                    .setStyle(new NotificationCompat.BigTextStyle()
                            .bigText(messageBody).setBigContentTitle(getString(R.string.app_name)))
                    .setContentIntent(pendingIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    // Since android Oreo notification channel is needed.
    Uri sound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + getPackageName() + "/" + R.raw.notification);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {


        AudioAttributes attributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .build();

        NotificationChannel mChannel = new NotificationChannel(channelId,
                getString(R.string.app_name),
                NotificationManager.IMPORTANCE_HIGH);

        // Configure the notification channel.
        mChannel.setDescription("desc");
        mChannel.enableLights(true);
        mChannel.enableVibration(true);
        mChannel.setSound(sound, attributes); // This is IMPORTANT


        if (notificationManager != null)
            notificationManager.createNotificationChannel(mChannel);

    }
    notificationManager.notify(943/* ID of notification */, notificationBuilder.build());

答案 1 :(得分:0)

您要发送哪种类型的FCM?是通知消息还是数据消息?如果是,则通知消息OnMessageReceived在应用程序处于后台时不会被调用。该通知将由ststem托盘处理。 如果要在后台运行OnMessageReceived,请使用FCM Data消息。

EG:

通知消息:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    }
  }
}

数据消息:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "data":{
      "Nick" : "Mario",
      "body" : "great match!",
      "Room" : "PortugalVSDenmark"
    }
  }
}

有关here的更多信息。