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 发送到该通道不会导致振动或声音