尚未收到android fcm通知

时间:2019-11-14 18:10:36

标签: java android

未接收到android fcm通知,而应该接收该通知的设备在Logcat中显示此消息(从FCM TITLE接收:null,从FCM BODY接收:null)。我已经检查过<26和> 26 SDK版本

均未收到通知

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




   }


}

============================清单================= =====================

  <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 ==================== ==========

//此方法用于将通知发送到服务器设备

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



 }

2 个答案:

答案 0 :(得分:0)

我已通过降级firebase-messaging库(实现'com.google.firebase:firebase-messaging:17.3.4')以及.setColor(ContextCompat.getColor(this,R.color)来解决此问题。 colorAccent))。但是,这已经为我解决了低于26的SDK版本的问题。任何人都知道为什么它仍然可以使用高于26的API获利?请帮助我

答案 1 :(得分:-1)

当应用程序在后台运行时,系统托盘中会收到通知,而在点击该通知后,该意图会发送到您的活动默认值,并带有有效内容的通知。

当您的应用程序在前面运行时,FirebaseMessagingService和您重写的逻辑会收到通知。

我认为,当应用程序在后台运行时,您应该添加第一点的逻辑

在此处查看更多信息

Handling messages