简体   繁体   English

FCM 通知未发送声音

[英]No sound sent with the FCM notification

I made my application send notifications when a user sends you a message but when the notification is shown the sound doesn't play.当用户向您发送消息时,我让我的应用程序发送通知,但是当显示通知时,声音不会播放。 Bellow is the code of my app.贝娄是我的应用程序的代码。

MyFirebaseMessaging: MyFirebase 消息传递:

    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.media.RingtoneManager;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Bundle;
    
    import androidx.annotation.NonNull;
    import androidx.core.app.NotificationCompat;
    
    import com.example.selfcial.Activities.MessageActivity;
    import com.example.selfcial.R;
    import com.google.firebase.auth.FirebaseAuth;
    import com.google.firebase.auth.FirebaseUser;
    import com.google.firebase.messaging.FirebaseMessagingService;
    import com.google.firebase.messaging.RemoteMessage;
    
    public class MyFirebaseMessaging extends FirebaseMessagingService {
    
        @Override
        public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
            super.onMessageReceived(remoteMessage);
    
            String sented = remoteMessage.getData().get("sented");
    
            FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    
            if (firebaseUser != null && sented.equals(firebaseUser.getUid())) {
    
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    sendOreoNotification(remoteMessage);
                }else {
                    sendNotification(remoteMessage);
                }
            }
        }
    
        private void sendOreoNotification(RemoteMessage remoteMessage) {
            String user = remoteMessage.getData().get("user");
            String icon = remoteMessage.getData().get("icon");
            String title = remoteMessage.getData().get("title");
            String body = remoteMessage.getData().get("body");
            Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    
            RemoteMessage.Notification notification = remoteMessage.getNotification();
            int j = Integer.parseInt(user.replaceAll("[\\D]", ""));
            Intent intent = new Intent(this, MessageActivity.class);
            Bundle bundle = new Bundle();
            bundle.putString("userId", user);
            intent.putExtras(bundle);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent =  PendingIntent.getActivity(this, j, intent, PendingIntent.FLAG_ONE_SHOT);
    
    
            OreoNotification oreoNotification = new OreoNotification(this);
            Notification.Builder builder = oreoNotification.getOreoNotification(title, body, pendingIntent
            ,soundUri, icon);
    
            int i = 0;
            if (j > 0) {
                i = j;
            }
    
            oreoNotification.getManager().notify(i, builder.build());
        }
    
        private void sendNotification(RemoteMessage remoteMessage) {
    
            String user = remoteMessage.getData().get("user");
            String icon = remoteMessage.getData().get("icon");
            String title = remoteMessage.getData().get("title");
            String body = remoteMessage.getData().get("body");
    
            RemoteMessage.Notification notification = remoteMessage.getNotification();
            int j = Integer.parseInt(user.replaceAll("[\\D]", ""));
            Intent intent = new Intent(this, MessageActivity.class);
            Bundle bundle = new Bundle();
            bundle.putString("userId", user);
            intent.putExtras(bundle);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent =  PendingIntent.getActivity(this, j, intent, PendingIntent.FLAG_ONE_SHOT);
    
            Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.ic_notification)
                    .setContentTitle(title)
                    .setContentText(body)
                    .setAutoCancel(true)
                    .setSound(soundUri)
                    .setContentIntent(pendingIntent);
            NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
    
            int i = 0;
            if (j > 0) {
                i = j;
            }
    
            notificationManager.notify(i, builder.build());
        }
    }

OreoNotification:
import android.annotation.TargetApi;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.ContextWrapper;
import android.net.Uri;
import android.os.Build;

import com.example.selfcial.R;

public class OreoNotification extends ContextWrapper {

    private static final String CHANNEL_ID = "some_id";
    private static final String  CHANNEL_NAME= "Selfcial";

    private NotificationManager notificationManager;

    public OreoNotification(Context base) {
        super(base);

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

    @TargetApi(Build.VERSION_CODES.O)
    private void createChannel() {

        NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
                CHANNEL_NAME,
                NotificationManager.IMPORTANCE_DEFAULT);

        channel.enableLights(true);
        channel.enableVibration(true);
        channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);

        getManager().createNotificationChannel(channel);
    }

    public  NotificationManager getManager() {
        if (notificationManager == null) {
            notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        }

        return notificationManager;
    }

    @TargetApi(Build.VERSION_CODES.O)
    public  Notification.Builder getOreoNotification(String title,
                                                     String body,
                                                     PendingIntent pendingIntent,
                                                     Uri soundUri,
                                                     String icon) {

        return new Notification.Builder(getApplicationContext(), CHANNEL_ID)
                .setContentIntent(pendingIntent)
                .setContentTitle(title)
                .setContentText(body)
                .setSmallIcon(R.drawable.ic_notification)
                .setSound(soundUri)
                .setAutoCancel(true);
    }
}

What may be the issue?可能是什么问题? I thought that I may forgot to trigger the Uri on MyFirebaseMessaging but I did it.我以为我可能忘记触发MyFirebaseMessaging上的 Uri 但我做到了。 I tried to add a custom sound too because I thought it may be a bug with the default sound but nothing changed.我也尝试添加自定义声音,因为我认为这可能是默认声音的错误,但没有任何改变。 Is there another way to make it happen?还有其他方法可以实现吗?

The below code snippet might help you sort out the problem.下面的代码片段可能会帮助您解决问题。 This snippet is producing a default notification sound whenever a notification has arrived.每当通知到达时,此代码段就会产生默认通知声音。

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder ( this, NOTIFICATION_CHANNEL_ID );
            notificationBuilder.setAutoCancel ( true )
                    .setStyle ( new NotificationCompat.BigTextStyle ().bigText ( remoteMessage.getNotification ().getBody () ) )
                    .setDefaults ( Notification.DEFAULT_ALL )
                    .setWhen ( System.currentTimeMillis () )
                    .setSmallIcon ( R.drawable.ic_notification_icon )
                    .setTicker ( remoteMessage.getNotification ().getTitle () )
                    .setPriority ( Notification.PRIORITY_MAX )
                    .setContentTitle ( remoteMessage.getNotification ().getTitle () )
                    .setContentText ( remoteMessage.getNotification ().getBody () )
                    .setContentIntent ( contentIntent );
            notificationManager.notify ( 1, notificationBuilder.build () );

.setSound(soundUri) does nothing on Android OREO and newer. .setSound(soundUri) 在 Android OREO 和更新版本上没有任何作用。

For newer Android versions the notifications sound depends on the Channel and is configured in Android settings Apps >> your app >> Notifications对于较新的 Android 版本,通知声音取决于频道并在 Android 设置中配置应用程序>>您的应用程序>>通知

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM