Flutter: PendingIntents не получены при выполнении кода через flutter

#android-intent #flutter

#android-намерение #flutter

Вопрос:

Я написал некоторый собственный код Android на Java, который мне нужен для сборки моего приложения в flutter. В этом коде я планирую использовать уведомления PendingIntent . Когда я запускаю код при редактировании части Android (открываю папку Android в android studio и запускаю app ), мои уведомления отображаются и работают так, как ожидалось. Однако, когда я открываю часть моего приложения dart / flutter и запускаю main.dart все свои функции, связанные с PendingIntent s перерывами.

Странный артефакт в этом заключается в том, что, похоже, это происходит только при трансляциях, а не при действиях. Чтобы объяснить: основное действие крана — вывести MainActivity на передний план, что всегда работает. Я также добавил кнопки действий в уведомление, которые выполняют трансляции, которые показывают ранее описанную проблему.

Я попытался просмотреть свой AndroidManifest.xml и build.gradle и проверить, обновлены ли все мои библиотеки из AndroidX (также дважды проверил зависимости).

Код для создания уведомления (показывающий, что он просто использует NotificationManager.notify() )

 private static NotificationCompat.Builder getBuilder(Context context, NotificationData data) {
        Intent tapIntent = new Intent(context, getMainActivityClass(context));
//      tapIntent.setAction(ACTION_OPEN);
        PendingIntent tapPendingIntent = PendingIntent.getActivity(context, 0, tapIntent, PendingIntent.FLAG_CANCEL_CURRENT);

        Intent snoozeIntent = new Intent(context, SnoozeBroadcast.class);
//      snoozeIntent.setAction(ACTION_SNOOZE);
        snoozeIntent.putExtra(SnoozeBroadcast.SNOOZE_ID, data.id);
        snoozeIntent.putExtra(SnoozeBroadcast.SNOOZE_TITLE, data.title);
        snoozeIntent.putExtra(SnoozeBroadcast.SNOOZE_MESSAGE, data.message);
        snoozeIntent.putExtra(SnoozeBroadcast.SNOOZE_DELAY, data.snoozeDelay);
        PendingIntent snoozePendingIntent = PendingIntent.getBroadcast(context, 1, snoozeIntent, PendingIntent.FLAG_CANCEL_CURRENT);

        Intent cancelIntent = new Intent(context, CancelBroadcast.class);
//      cancelIntent.setAction(ACTION_CANCEL);
        cancelIntent.putExtra(CancelBroadcast.CANCEL_ID, data.id);
        PendingIntent cancelPendingIntent = PendingIntent.getBroadcast(context, 2, cancelIntent, PendingIntent.FLAG_CANCEL_CURRENT);

        if(snoozePendingIntent == null) System.out.println("snooze null");
        if(cancelPendingIntent == null) System.out.println("cancel null");

        // TODO: get channel from arguments
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
                .setSmallIcon(R.drawable.notification_icon)
                .setContentTitle(data.title)
                .setContentText(data.message)
                .setContentIntent(tapPendingIntent)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .addAction(R.drawable.notification_icon, "Snooze", snoozePendingIntent)
                .addAction(R.drawable.notification_icon, "Cancel", cancelPendingIntent)
                .setAutoCancel(true);
        return builder;
    }
  

Код для получения CancelBroadcast

 public class CancelBroadcast extends BroadcastReceiver {
    public static final String CANCEL_ID = "com.example.my_app.cancel_id";

    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("received");
        Bundle data = intent.getExtras();
        int id = data.getInt(CANCEL_ID);
        FlutterNotificationsPlugin.cancelById(context, id);
    }
}
  

Как было сказано ранее, я ожидаю onReceive() , что будет выполнен метод, в который записывается строка stdout , когда я нажимаю кнопку «Повтор» в уведомлении (которое отображается нормально). Это происходит при запуске app , но не при запуске main.dart .

Комментарии:

1. Как вы заставили это работать?

2. Я этого не сделал. Проблема заключалась в компиляции. Я скомпилировал код для конкретной платформы отдельно, каким-то образом создав несоответствие между кодом flutter и java. Чистая перестройка решила все мои проблемы.