Уведомление Firebase работает в фоновом режиме, но не отображается на переднем плане в Oreo - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь сделать push-уведомление с помощью Firebase для моего приложения. Я попробовал его, и он отлично работает в фоновом режиме в Oreo, но когда я пытаюсь открыть приложение и отправить уведомление из другой учетной записи, уведомление не появляется.

Как мне решить эту проблему и где проблема в моем коде?

Это часть кода моего сервиса:

 public class FirebaseMessagingService extends 
     com.google.firebase.messaging.FirebaseMessagingService {

     @Override
     public void onMessageReceived(RemoteMessage remoteMessage) {
         super.onMessageReceived(remoteMessage);
         String messageTitle = remoteMessage.getNotification().getTitle();
         String messageBody = remoteMessage.getNotification().getBody();

         NotificationCompat.Builder builder = new NotificationCompat.Builder(
                this, getString(R.string.default_notification_channel_id))
             .setSmallIcon(R.drawable.ic_launcher_foreground)
             .setContentTitle(messageTitle)
             .setContentText(messageBody);
        Intent resultIntent = new Intent(this, MainAdsActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(
                this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        int id = (int) System.currentTimeMillis();

        builder.setContentIntent(pendingIntent);
        startForeground(id,builder.build());

        NotificationManager notificationManager = 
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notificationManager.notify(id, builder.build());

     }
 }

Файл манифеста Android:

  <service
        android:name=".FirebaseMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>
    <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id"/>

Облачные функции

const functions = require('firebase-functions');
const admin=require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const api = admin.firestore()
api.settings({timestampsInSnapshots: true})
 exports.fuync=functions
.firestore.document("Users/{userid}/notification/{notification_id}")
.onWrite((change,context)=>{
const userid=context.params.userid;
const notification_id=context.params.notification_id;
return admin.firestore().collection('Users')





    .doc(userid).collection('notification')
    .doc(notification_id).get().then(queryRes
    ult=>{

    const fromuserid=queryResult.data().from;
    const frommessage=queryResult.data().message;

    const 
    fromdata=admin.firestore()
     .collection('Users').doc(fromuserid).get();
    const todata=admin.firestore()
     .collection('Users').doc(userid).get();

    return Promise.all([fromdata,todata]).then(result=>{
        const fromname=result[0].data().name;
        const toname=result[1].data().name;
        const tokenid=result[1].data().token_id;
       //return console.log("from :" +fromname + "TO: " +toname);

       const payload= {
           notification: {
               title : "notification from" +fromname,
               body : frommessage,
               icon : "default"
           }
       };
       return admin.messaging().sendToDevice(tokenid,payload).then(result=>{
           return console.log("NOTIFICATION SENT.");
       });
    });

});
 });

Построить Gradle

android {
compileSdkVersion 27
defaultConfig {
    applicationId "com.example.amr.app"
    minSdkVersion 18
    targetSdkVersion 27
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner 

buildToolsVersion '27.0.3'
}

Ответы [ 5 ]

0 голосов
/ 28 августа 2018

Это решение, которое я сделал, отлично работает на переднем плане и на заднем плане для версий Oreo и более поздних версий.

Создание канала уведомлений очень важно. Самая важная вещь - это идентификатор строки внутри NotificationChannel channel = new NotificationChannel(). это должно быть то, что предоставлено firebase, которое: default_notification_channel_id

и код будет таким:

    private static final CharSequence NAME = "amro";

 @Override
 public void onMessageReceived(RemoteMessage remoteMessage) {
 super.onMessageReceived(remoteMessage);
 //____ID _____
 int id = (int) System.currentTimeMillis();
 //_____NOTIFICATION ID'S FROM FCF_____
 String messageTitle = remoteMessage.getNotification().getTitle();
 String messageBody = remoteMessage.getNotification().getBody();

 NotificationCompat.Builder builder =
     new NotificationCompat
    .Builder(this, getString(R.string.default_notification_channel_id))
    .setSmallIcon(R.drawable.ic_launcher_foreground)
    .setContentTitle(messageTitle)
    .setContentText(messageBody);

 //_____REDIRECTING PAGE WHEN NOTIFICATION CLICKS_____
 Intent resultIntent = new Intent(this, ProfileActivity.class);
 PendingIntent pendingIntent = PendingIntent
     .getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT
     );
 builder.setContentIntent(pendingIntent);

 if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ) {

      int importance = NotificationManager.IMPORTANCE_HIGH;
      String channelID = BuildConfig.APPLICATION_ID;
      NotificationChannel channel = new NotificationChannel
     (getString(R.string.default_notification_channel_id), BuildConfig.APPLICATION_ID, importance);
      channel.setDescription(channelID);
      NotificationManager notificationManager = getSystemService(NotificationManager.class);
      //assert notificationManager != null;
      notificationManager.createNotificationChannel(channel);
 }


 NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
 assert notificationManager != null;
 notificationManager.notify(id, builder.build());


 }
0 голосов
/ 28 августа 2018

Используйте приведенный ниже код в FirebaseMessagingService.

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
  super.onMessageReceived(remoteMessage);
  String messageTitle = remoteMessage.getNotification().getTitle();
  String messageBody = remoteMessage.getNotification().getBody();

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    CharSequence name = “Your channel name, It will be visible in app setting”;
    String description =“Description for your channel”;
    int importance = NotificationManager.IMPORTANCE_DEFAULT;
    NotificationChannel channel = new NotificationChannel(SOME_CHANNEL_ID, name, importance);
    channel.setDescription(description);
    NotificationManager notificationManager = getSystemService(NotificationManager.class);
    notificationManager.createNotificationChannel(channel);
  }

  NotificationCompat.Builder builder = new NotificationCompat
               .Builder(this, getString(R.string.default_notification_channel_id))
               .setSmallIcon(R.drawable.ic_launcher_foreground)
               .setContentTitle(messageTitle)
               .setContentText(messageBody);
  Intent resultIntent = new Intent(this, MainAdsActivity.class);
  PendingIntent pendingIntent = PendingIntent
 .getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT
 );
  int id = (int) System.currentTimeMillis();
  builder.setContentIntent(pendingIntent);
  startForeground(id,builder.build());

  NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
  notificationManager.notify(id, builder.build());

 }
}
0 голосов
/ 28 августа 2018

Первое добавление логов в onMessageArrived ()

Log.d («Служба Firebase PM», «onMessageArrived call»);

и проверьте, получаете ли вы этот журнал в LogCat.

Если вы этого не сделаете, то что-то не работает должным образом в конце Firebase.

Если вы получаете его, то это означает, что вы делаете что-то неправильно после получения push-сообщения (т.е. не отображаете уведомление должным образом). Также проверьте LogCat, выбрасывается ли какое-либо исключение.

Затем опубликуйте свой повтор.

0 голосов
/ 28 августа 2018

С Android Oreo есть Канал

Когда вы нацелены на Android 8.0 (уровень API 26), вы должны реализовать один или несколько каналов уведомлений. Если для targetSdkVersion установлено значение 25 или ниже, то, когда ваше приложение работает на Android 8.0 (уровень API 26) или выше, оно ведет себя так же, как на устройствах под управлением Android 7.1 (уровень API 25) или ниже.

попробуйте использовать библиотеку поддержки 26 или новее и отметьте это Создание и управление каналами уведомлений

попробуйте использовать этот метод для создания NotificationCompat.Builder

public NotificationCompat.Builder initChannels() {
    if (Build.VERSION.SDK_INT < 26) {
        return new NotificationCompat.Builder(this);
    }
    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    String id = BuildConfig.APPLICATION_ID;
    NotificationChannel channel = new NotificationChannel(id, BuildConfig.APPLICATION_ID, NotificationManager.IMPORTANCE_HIGH);
    channel.setDescription(BuildConfig.APPLICATION_ID);
    notificationManager.createNotificationChannel(channel);
    return new NotificationCompat.Builder(this, id);
}

создание нового экземпляра из этого метода

NotificationCompat.Builder builder = initChannels();
0 голосов
/ 28 августа 2018
String messageTitle = remoteMessage.getNotification().getTitle();
 String messageBody = remoteMessage.getNotification().getBody();

попробуй

String messageTitle = remoteMessage.getData().getTitle();
 String messageBody = remoteMessage.getData().getBody();
...