繁体   English   中英

未收到 android fcm 通知

[英]android fcm notification not received

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



 }

我已经通过降级firebase-messaging库解决了这个问题(实现'com.google.firebase:firebase-messaging:17.3.4')以及as.setColor(ContextCompat.getColor(this,R.color)。在 NotificationCompat 中。 然而,这已经为我解决了低于 26 的 SDK 版本的问题。任何人都知道为什么它仍然在高于 26 的 API 上兑现?! 请帮帮我

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

当您的应用程序在前面运行时,将使用 FirebaseMessagingService 和您覆盖的逻辑接收通知。

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

在这里查看更多信息

处理消息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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