java - fcm 通知崩溃仅适用于 api 26

标签 java android

API 低于 26 的 Android 上会收到 Android fcm 通知,但 API 26(Oreo 8.0) 不会收到,这会导致应用程序崩溃

====================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)
        .setColor(ContextCompat.getColor(this, R.color.colorAccent))
        .setSound(defaultSoundUri);

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

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

    }
  }

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

//该类用于实现API 26+的通知

  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)
        .setColor(ContextCompat.getColor(this, R.color.colorAccent))
        .setAutoCancel(true);

  }


}

================================ list ================== =====================

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

}

============================发送通知到服务器==================== ===========

//该方法用于向服务器应用程序发送通知

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



   }

最佳答案

我认为您使代码变得不必要的复杂。

尝试下面的代码

private void createNotification(String title, String message) {

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

    // only create notification channel if SDK >= 26
    if (android.os.Build.VERSION.SDK_INT >= 26) {
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);

        channel.enableLights(false);
        channel.enableVibration(true);
        channel.setDescription(CHANNEL_DESC);

        manager.createNotificationChannel(channel);
    }

    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
            .setSmallIcon(android.R.drawable.stat_notify_more)
            .setContentTitle(title)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setSound(defaultSoundUri)
            .setColor(ContextCompat.getColor(this, R.color.colorAccent))
            .setContentText(message);


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

}

关于java - fcm 通知崩溃仅适用于 api 26,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58958162/

相关文章:

java - 如何在没有任何 XML 和 spring 特定注释的情况下使用 JSR 330 和 Spring 作为实现?

android - 密码生成器显示kotlin.Unit

java - 以编程方式检测 Android 中的 SIM 卡更改

java - 套接字编程 : Delay

java - 类型不匹配 : cannot convert from List<class name> to Cursor: android error

Java 条件(检查条件中的第一个条件)

java - 多语言 Android 应用程序开发

java - 从另一个类调用扩展 Thread 的类的方法

java - Junit 保护方法

java - Android donut chart 根据时间戳填充多种颜色