简体   繁体   中英

android fcm notification not received

android fcm notification not received and while the device which supposed to receivethe notification shows this message in Logcat (Received from FCM TITLE: null, Received from FCM BODY: null). I have already checked that notification is not being received in both <26 and >26 SDK Versions

====================MyFirebaseMessagingService===============================

public class MyFirebaseMessagingService extends FirebaseMessagingService {

private static final String channel_id = "the_id";


@Override
public void onNewToken(String s) {
    super.onNewToken(s);
    Log.e("NEW_TOKEN",s);
    updateTokenToFirebase(s);

}


private void updateTokenToFirebase(String token) {
    IDrinkShopAPI mService = Common.getAPI();

    mService.updateToken("SERVER_01",token,"0")
            .enqueue(new Callback<String>() {
                @Override
                public void onResponse(Call<String> call, Response<String> response) {
                    Log.d("DEBUG_TOKEN",response.body());
                }

                @Override
                public void onFailure(Call<String> call, Throwable t) {
                    Log.d("DEBUG_TOKEN",t.getMessage());
                }
            });


}



@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);

    if(remoteMessage.getData() != null){

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
            sendNotification26(remoteMessage);
        else
            sendNotification(remoteMessage);

    }

}

private void sendNotification26(RemoteMessage remoteMessage) {
    Map<String,String> data = remoteMessage.getData();

    String title = data.get("title");
    String message = data.get("message");



    NotificationHelper helper ;
    Notification.Builder builder;
    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    helper = new NotificationHelper(this);

    builder = helper.getDrinkShopNotification(title,message,defaultSoundUri);

    helper.getManager().notify(new Random().nextInt(),builder.build());


}


private void sendNotification(RemoteMessage remoteMessage) {

    Map<String,String> data = remoteMessage.getData();

   String title = data.get("title");
   String message = data.get("message");



    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(title)
            .setContentText(message)
            .setAutoCancel(true)
            .setSound(defaultSoundUri);

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

    mn.notify(new Random().nextInt(),builder.build());

   }
}

=========================NotificationHelper =================================

//this class is used to implement notification for all android versions

public class NotificationHelper extends ContextWrapper {

private static final String CHANNEL_ID = "the_id";
private static final String CHANNEL_NAME = "Drink_Shop";

private NotificationManager notificationManager;

public NotificationHelper(Context base) {
    super(base);

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
        createChannel();
}

@TargetApi(Build.VERSION_CODES.O)
private void createChannel() {

    NotificationChannel nc = new NotificationChannel(CHANNEL_ID,CHANNEL_NAME,
            NotificationManager.IMPORTANCE_DEFAULT);

    nc.enableLights(false);
    nc.enableVibration(true);
    nc.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);

    getManager().createNotificationChannel(nc);

}

public NotificationManager getManager() {

    if(notificationManager == null)

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

    return notificationManager;

}

@TargetApi(Build.VERSION_CODES.O)
public Notification.Builder getDrinkShopNotification(String title,
                                                     String message,
                                                     Uri soundUri)
{

    return new Notification.Builder(getApplicationContext(),CHANNEL_ID)
            .setContentTitle(title)
            .setContentText(message)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setSound(soundUri)
            .setChannelId(CHANNEL_ID)
            .setAutoCancel(true);




   }


}

=============================Manifest=======================================

  <service
        android:name=".Services.MyFirebaseMessagingService"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

============================Build.gradle====================================

  implementation 'com.google.firebase:firebase-messaging:20.0.0'
  implementation 'com.google.firebase:firebase-core:17.2.1'
  implementation 'com.google.android.gms:play-services-auth:17.0.0'

===========================IFCMService=======================================

 public interface IFCMService {

@Headers({
        "Content-Type:application/json",
        "Authorization:mytoken"
})
 @POST("fcm/send")
 Call<MyResponse> sendNotification(@Body DataMessage body);

}

==========================sendNotificationToServer===============================

// this method used to send the notification to server device

  private void sendNotificationToServer(OrderResult orderResult) {

    mService.getToken("SERVER_01", "1")
            .enqueue(new Callback<Token>() {
                @Override
                public void onResponse(Call<Token> call, Response<Token> response) {

                    Map<String,String> contentSend = new HashMap<>();
                    contentSend.put("title","NEW ORDER");
                    contentSend.put("message","You have got new order" + orderResult.getOrderId());

                    DataMessage dataMessage = new DataMessage();
                    if(response.body().getToken() != null)
                        dataMessage.setTo(response.body().getToken());

                        dataMessage.setData(contentSend);

                        IFCMService ifcmService = Common.getFCMService();
                         ifcmService.sendNotification(dataMessage)
                            .enqueue(new Callback<MyResponse>() {
                                @Override
                                public void onResponse(Call<MyResponse> call, Response<MyResponse> response) {

                                    if(response.code() == 200){

                                        if(response.body().success == 1){

                                     Toast.makeText(CartActivity.this,
                                     getResources().getString(R.string.order_submitted), Toast.LENGTH_SHORT)
                                        .show();
                                            //Clear Carts From Room Database
                                            Common.cartRepository.emptyCart();
                                            //finish();
                                        }
                                        else {

                                            Toast.makeText(CartActivity.this, "Send Notification Failed", Toast.LENGTH_SHORT).show();
                                        }
                                    }

                                }

                                @Override
                                public void onFailure(Call<MyResponse> call, Throwable t) {

                                    Toast.makeText(CartActivity.this, ""+t.getMessage(), Toast.LENGTH_SHORT).show();

                                }
                            });

                }

                @Override
                public void onFailure(Call<Token> call, Throwable t) {

                    Toast.makeText(CartActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });



 }

I have solved this issue by downgrading firebase-messaging library as follow (implementation 'com.google.firebase:firebase-messaging:17.3.4') as will as.setColor(ContextCompat.getColor(this, R.color.colorAccent)) in NotificationCompat. However this has solved the issue for me for SDK version lower than 26. Anyone knows why it is still cashing on APIs higher than 26?! help me please

When the App is running in background the notification is received in the system tray, and when is tapped, the intent is sended to your activity default, with the notification with payload of content of it.

When your application is running in front, the notification is received with the FirebaseMessagingService and the logic that you overrided.

I think you should add the logic of the first point, when the app is running in background

Check here more information

Handling messages

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM