android 上的 Android 推送通知声音丢失(不工作)背景和前景

标签 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。我正在检查手机设置应用程序通知 channel ,仅启用了振动而不是声音,并且启用了另一个选项。 如何设置 Whatsapp 和电报应用程序之类的 channel ? 如何启用屏幕截图的所有字段,如声音、 float 通知、锁屏通知? 这是我的应用程序 channel 屏幕截图:

enter image description here

请帮我解决这个问题。 提前致谢

最佳答案

这段代码对我有用

首先您可以卸载您的应用,然后尝试 channel 代码。

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

关于android 上的 Android 推送通知声音丢失(不工作)背景和前景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57882970/

相关文章:

android - 每次 Activity 访问时显示布局

android - 为什么 RemoteMessage.getData() 在 firebase 通知中返回 null?

android - C2dM 不好的一面

ios - 如果用户强制退出,iOS 是否会将我的应用程序启动到后台?

javascript - PushManager 不请求移动设备上的许可

firebase - 如何设置 pubsub 以便 firebase 可以通过云函数 pubsub 触发器接收?

Android O 对较低目标 SDK 的限制

java - 控制 TeeChart 中的轴标签位置

android - 如何翻译我的 Android 应用程序?

java - Android 通知振动不起作用