【问题标题】:No sound sent with the FCM notificationFCM 通知未发送声音
【发布时间】: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,但我做到了。我也尝试添加自定义声音,因为我认为这可能是默认声音的错误,但没有任何改变。还有其他方法可以实现吗?

【问题讨论】:

    标签: java android firebase flutter firebase-cloud-messaging


    【解决方案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 设置中配置应用 >> 您的应用 >> 通知

    【讨论】:

    • 如何自动启用它?
    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多