FCM 通知未发送声音

Posted

技术标签:

【中文标题】FCM 通知未发送声音【英文标题】:No sound sent with the FCM notification 【发布时间】:2021-05-23 13:56:30 【问题描述】:

我让我的应用程序在用户向您发送消息时发送通知,但在显示通知时没有播放声音。下面是我的应用程序的代码。

MyFirebaseMessaging:

    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);
    

可能是什么问题?我以为我可能忘记在MyFirebaseMessaging 上触发 Uri,但我做到了。我也尝试添加自定义声音,因为我认为这可能是默认声音的错误,但没有任何改变。还有其他方法可以实现吗?

【问题讨论】:

【参考方案1】:

下面的代码 sn-p 可能会帮助您解决问题。每当通知到达时,此 sn-p 都会产生默认通知声音。

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 () );

【讨论】:

谢谢你的回答哥们。不幸的是,它不起作用。它给出了同样的错误。【参考方案2】:

.setSound(soundUri) 在 Android OREO 及更高版本上不执行任何操作。

对于较新的 Android 版本,通知声音取决于频道,并在 Android 设置中配置应用 >> 您的应用 >> 通知

【讨论】:

如何自动启用它?

以上是关于FCM 通知未发送声音的主要内容,如果未能解决你的问题,请参考以下文章

通过 FCM 发送时未收到推送通知,但在 IOS 上通过 APN 发送时收到

我在 Flutter 中创建了一个 android 通知 channel_id,但是,将 FCM 发送到该通道不会导致振动或声音

FCM 推送通知问题:“错误”:“未注册”

禁用 FCM firebase 推送通知声音

FCM 自定义声音通知不适用于 IOS Xcode

如何使用 FCM 在 ios 推送通知中播放自定义通知声音