安卓:将 FCM 通知保存到房间 DB



我正在使用Firebase FCM来获取通知。我希望收到通知,它应该存储在我的房间数据库中。稍后,当用户打开应用程序时,将在通知部分中显示所有通知

正在使用MVVM,我试图通过ViewModel保存,但它不起作用。这是我现在的代码。

public class MessagingService extends FirebaseMessagingService {
    @Override
    public void onNewToken(String s) {
        super.onNewToken(s);
        Log.d("MessagingService", s);
    }
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        // Check if message contains a notification payload.
        if (remoteMessage.getData().isEmpty()){
            showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
        } else {
            showNotification(remoteMessage.getData());
        }
    }
    private void showNotification(Map<String, String> data) {

        Bitmap bitmap;
        String title = data.get("title").toString();
        String body = data.get("body").toString();
        String imageUri = data.get("image").toString();
        String TrueOrFalse = data.get("AnotherActivity").toString();
        bitmap = getBitmapfromUrl(imageUri);
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtra("AnotherActivity", TrueOrFalse);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);
       // LibraryViewModel libraryViewModel = ViewModelProviders.of(pendingIntent.get).get(HomeViewModel.class);

        //Notification FCM
        String NOTIFICATION_CHANNEL_ID = "vedicaim.com";
        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "ArticleNotification",
                    NotificationManager.IMPORTANCE_DEFAULT);
            notificationChannel.setDescription("VedicAim Channel");
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.BLUE);
            notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
            notificationChannel.enableLights(true);
            notificationManager.createNotificationChannel(notificationChannel);
        }
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
                .setDefaults(Notification.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.splash_logo)
                .setContentTitle(title)
                .setContentText(body)
                .setSound(defaultSoundUri)
                .setContentInfo("Info")
                .setContentIntent(pendingIntent);
        notificationManager.notify(new Random().nextInt(), notificationBuilder.build());
        FirebaseMessaging.getInstance().subscribeToTopic("article")
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        String msg = "Successfull";
                        if (!task.isSuccessful()) {
                            msg = "Failed";
                        }
                        Log.d("MessagingService", msg);
                    }
                });

    }
    private void showNotification(String title, String body) {
        //Notification FCM
        String NOTIFICATION_CHANNEL_ID = "vedicaim.com";
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "ArticleNotification",
                    NotificationManager.IMPORTANCE_DEFAULT);
            notificationChannel.setDescription("VedicAim Channel");
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.BLUE);
            notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
            notificationChannel.enableLights(true);
            notificationManager.createNotificationChannel(notificationChannel);
        }
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
                .setDefaults(Notification.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.splash_logo)
                .setContentTitle(title)
                .setContentText(body)
                .setContentInfo("Info");
        notificationManager.notify(new Random().nextInt(), notificationBuilder.build());
        FirebaseMessaging.getInstance().subscribeToTopic("article")
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        String msg = "Successfull";
                        if (!task.isSuccessful()) {
                            msg = "Failed";
                        }
                        Log.d("MessagingService", msg);
                    }
                });
    }

    /*
     *To get a Bitmap image from the URL received
     * */
    public Bitmap getBitmapfromUrl(String imageUrl) {
        try {
            URL url = new URL(imageUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap bitmap = BitmapFactory.decodeStream(input);
            return bitmap;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }}

您可以使用 Postman 而不是 Firebase 控制台来发送消息。因此,即使应用程序在后台或前台,也始终调用 onMessageReceived(( 方法。您应该在主活动中为您的应用订阅 FCM 主题,并从邮递员发送 JSON 消息。

使用邮递员发送 FCM 邮件

之后,在 onMessageReceived(( 中,您可以将消息数据保存到房间 DB。

下面是一个示例。我在我的应用程序中像这样做

我的食品接触管理系统服务

public class FCMService extends FirebaseMessagingService {
    private static final String DATABASE_NAME = "db_notification";
    private static int NOTIFICATION_ID = 1;
    private NotificationDatabase notificationDatabase;
    private String body, title, itemId, type;
    @Override
    public void onNewToken(String s) {
        super.onNewToken(s);
    }
    @Override
    public void onMessageReceived(final RemoteMessage remoteMessage) {
        notificationDatabase = Room.databaseBuilder(getApplicationContext(),
                NotificationDatabase.class, DATABASE_NAME)
                .build();
        if (!remoteMessage.getData().isEmpty()) {
            Map<String, String> data = remoteMessage.getData();
            title = data.get("title");
            body = data.get("body");
            itemId = data.get("itemId");
            type = data.get("type");
            Intent intent = new Intent(this, MainActivity.class);
            if (type.equals("review")) {
                intent.putExtra("itemId", itemId);
            }
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
            //Creating Notification
            Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(this, "2")
                    .setSmallIcon(R.drawable.ic_notifications)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.notification_list))
                    .setContentTitle(title)
                    .setContentText(body)
                    .setAutoCancel(true)
                    .setSound(defaultSoundUri)
                    .setPriority(NotificationCompat.PRIORITY_HIGH)
                    .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
                    .setStyle(new NotificationCompat.BigTextStyle().bigText(body))
                    .setContentIntent(pendingIntent);
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            if (NOTIFICATION_ID > 1073741824) {
                NOTIFICATION_ID = 0;
            }
            Objects.requireNonNull(notificationManager).notify(NOTIFICATION_ID++, mNotifyBuilder.build());
            //Saving to Room Database
            new Thread(() -> {
                Notification notification = new Notification();
                notification.setNotificationTitle(title);
                notification.setNotificationText(body);
                notification.setItemId(itemId);
                notification.setType(type);
                notificationDatabase.notificationAccess().insertOnlySingleNotification(notification);
            }).start();
        }
    }
}

我来自邮递员的 JSON 请求

{
    "to" : "/topics/sathyanga",
    "collapse_key" : "type_a",
    "data" : {
        "body" : "Notification Body",
        "title": "Notification Title",
        "type" : "review",//Custom Data
        "itemId" : "Item5"//Custom Data
    }
}

像这样使用它,我们可以确保接收 FCM 始终是数据消息。因此,即使应用程序不在前台,它也会运行。

您必须直接从服务访问数据库。它不是活动或片段,因此您将无法实例化 ViewModel。

考虑创建一个单独的存储库单例,它将作为数据库的访问点。

相关内容

  • 没有找到相关文章

最新更新