web-dev-qa-db-fra.com

Le son de notification push Android est joué uniquement lorsque l'application est au premier plan, mais ne produit aucun son lorsque l'application est à l'arrière-plan

J'utilise FCM pour la notification Push Ci-dessous le code pour jouer le son lorsque la notification est reçue 

 public void playNotificationSound() {
        try {

            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            Ringtone r = RingtoneManager.getRingtone(mContext, notification);
            r.play();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

J'appelle cette méthode OnMessageReceived mais le son n'est joué que lorsque l'application est au premier plan, pas lorsque l'application est en arrière-plan

 @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.e(TAG, "From: " + remoteMessage.getFrom());

        if (remoteMessage == null)
            return;

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            Log.e(TAG, "Notification Body: " + remoteMessage.getNotification().getBody());
            handleNotification(remoteMessage.getNotification().getBody());
        }

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
            Log.e(TAG, "Data Payload: " + remoteMessage.getData().toString());

            try {
                JSONObject json = new JSONObject(remoteMessage.getData().toString());
                handleDataMessage(json);
            } catch (Exception e) {
                Log.e(TAG, "Exception: " + e.getMessage());
            }
        }
    }





 private void handleNotification(String message) {
        if (!NotificationUtils.isAppIsInBackground(getApplicationContext())) {
            // app is in foreground, broadcast the Push message
            Intent pushNotification = new Intent(config.Push_NOTIFICATION);
            pushNotification.putExtra("message", message);
            LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification);

            // play notification sound
            NotificationUtils notificationUtils = new NotificationUtils(getApplicationContext());
            notificationUtils.playNotificationSound();
        }else if (NotificationUtils.isAppIsInBackground(getApplicationContext())){
            // If the app is in background, firebase itself handles the notification
            NotificationUtils notificationUtils = new NotificationUtils(getApplicationContext());
            notificationUtils.playNotificationSound();
        }
    }
10
Santosh Yadav

Lors de l'envoi de notifications dans Android via la console Firebase, il sera traité comme un message Notification. Les messages de notification seront toujours traités automatiquement par le périphérique Android (barre d'état système) lorsque l'application est en arrière-plan (voir Gestion des messages ).

Ce qui signifie que onMessageReceived() ne sera pas appelé. Par conséquent, si vous avez l’intention de toujours jouer un son après avoir reçu une notification, vous devrez utiliser plutôt un message Data *. Mais vous devrez envoyer les messages sans utiliser la console Firebase.

6
AL.

Puisque onMessageReceived n'est pas appelé lorsqu'un objet de notification est envoyé, j'ai créé un BroadcastReceiver à gérer lorsqu'une notification arrive

public class NotificationReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    playNotificationSound(context);
}

public void playNotificationSound(Context context) {
    try {
        Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Ringtone r = RingtoneManager.getRingtone(context, notification);
        r.play();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

et l'a ajouté à manifester. Le récepteur est responsable de la lecture de la sonnerie de notification.

 <receiver
        Android:name=".notification.NotificationReceiver"
        Android:exported="true"
        Android:permission="com.google.Android.c2dm.permission.SEND" >
        <intent-filter>
            <action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </receiver>
6
kamiha

Vous devez activer le son dans Firebase Notification Composer sous Paramètres avancés. :)

2
Zerocool

private void sendNotification (String messageBody, Intent intent) {

    //intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent/*.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)*/,
            PendingIntent.FLAG_ONE_SHOT);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setContentIntent(pendingIntent);

    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);//<--

    Bitmap bitmap = getBitmapfromUrl(postImageUrl);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.notification_recive)


            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.notification_recive))
            .setContentTitle(postTitle + "")
            .setStyle(new NotificationCompat.BigPictureStyle()
                    .setSummaryText(postTitle + "")
                    .bigPicture(bitmap))
            .setContentText(messageBody)
            .setLights(getResources().getColor(R.color.blue),1000,1500)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)//<--
            .setContentIntent(pendingIntent);


    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
0
Mr_Moradi

Vous avez déjà la méthode onMessageReceived, Firebase envoie le type remoteMessage.getData () lorsque l'application est en arrière-plan . Et remoteMessage.getNotification () sera null. le son ne joue donc que lorsque l'application est au premier plan et non lorsque l'application est à l'arrière-plan. vous devez ajouter 

if (remoteMessage.getData().size() > 0) {
        Log.e(TAG, "Data Payload: " + remoteMessage.getData().toString());

        try {
            JSONObject json = new JSONObject(remoteMessage.getData().toString()); 
            handleNotification(json.getString("msg");//I am assuming message key is msg
            handleDataMessage(json);
        } catch (Exception e) {
            Log.e(TAG, "Exception: " + e.getMessage());
        }
    }
0
Himesh goswami