Android Alarm Manager не работает для приложения Flutter Project - PullRequest
0 голосов
/ 19 февраля 2019

Error Я установил плагин Android Alarm Manager в своем приложении New Flutter.Я использую пример кода плагина, но он выдает ошибку в консоли.

Подскажите, пожалуйста, как заставить работать плагины для android alarm manager.Как интегрировать android_alarm_manager Dart в приложение, чтобы пользователи получали сигнал тревоги, когда время, выбранное ими в расписании, достигает?

Я использую код по этой ссылке: https://github.com/flutter/plugins/tree/master/packages/android_alarm_manager

 //////  main.dart://///////

    import 'dart:isolate';
    import 'package:android_alarm_manager/android_alarm_manager.dart';
    import 'package:flutter/material.dart';

    void printHello() {
      final DateTime now = DateTime.now();
      final int isolateId = Isolate.current.hashCode;
      print("[$now] Hello, world! isolate=${isolateId} function='$printHello'");
    }
    void main() async {
      final int helloAlarmID = 0;
      await AndroidAlarmManager.initialize();
      runApp(MaterialApp(home: Application()));
      await AndroidAlarmManager.periodic(const Duration(minutes: 1), helloAlarmID, printHello);
    }
    class Application extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Container(),
        );
      }
    }


///////////////Application.java/////////////////////

    package io.flutter.plugins.androidalarmmanagerexample;
    import io.flutter.app.FlutterApplication;
    import io.flutter.plugin.common.PluginRegistry;
    import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
    import io.flutter.plugins.GeneratedPluginRegistrant;

    public class Application extends FlutterApplication implements PluginRegistrantCallback {
        @Override
        public void onCreate() {
            super.onCreate();

            AlarmService.setPluginRegistrant(this);
        }
        @Override
        public void registerWith(PluginRegistry registry) {
            GeneratedPluginRegistrant.registerWith(registry);
        }
    }



///// When I run this code it gives error in console as given below://////

E/flutter ( 6831): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: PlatformException(error, Attempt to invoke interface method 'void io.flutter.plugin.common.PluginRegistry$PluginRegistrantCallback.registerWith(io.flutter.plugin.common.PluginRegistry)' on a null object reference, null)
E/flutter ( 6831): #0      JSONMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:149:7)
E/flutter ( 6831): #1      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:302:33)
E/flutter ( 6831): <asynchronous suspension>
E/flutter ( 6831): #2      AndroidAlarmManager.initialize (package:android_alarm_manager/android_alarm_manager.dart:76:10)
E/flutter ( 6831): <asynchronous suspension>
E/flutter ( 6831): #3      main (package:alarmdemo/main.dart:12:29)
E/flutter ( 6831): <asynchronous suspension>
E/flutter ( 6831): #4      _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:189:25)
E/flutter ( 6831): #5      _rootRun (dart:async/zone.dart:1124:13)
E/flutter ( 6831): #6      _CustomZone.run (dart:async/zone.dart:1021:19)
E/flutter ( 6831): #7      _runZoned (dart:async/zone.dart:1516:10)
E/flutter ( 6831): #8      runZoned (dart:async/zone.dart:1500:12)
E/flutter ( 6831): #9      _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:180:5)
E/flutter ( 6831): #10     _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:300:19)
E/flutter ( 6831): #11     _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)
E/flutter ( 6831): 
E/flutter ( 6831): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: MissingPluginException(No implementation found for method AlarmService.initialized on channel plugins.flutter.io/android_alarm_manager_background)
E/flutter ( 6831): #0      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:300:7)
E/flutter ( 6831): <asynchronous suspension>
E/flutter ( 6831): #1      _alarmManagerCallbackDispatcher (package:android_alarm_manager/android_alarm_manager.dart:49:12)
E/flutter ( 6831): #2      _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:189:25)
E/flutter ( 6831): #3      _rootRun (dart:async/zone.dart:1124:13)
E/flutter ( 6831): #4      _CustomZone.run (dart:async/zone.dart:1021:19)
E/flutter ( 6831): #5      _runZoned (dart:async/zone.dart:1516:10)
E/flutter ( 6831): #6      runZoned (dart:async/zone.dart:1500:12)
E/flutter ( 6831): #7      _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:180:5)
E/flutter ( 6831): #8      _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:300:19)
E/flutter ( 6831): #9      _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)
E/flutter ( 6831): 

Это мой обновленный код:

/////////////main.dart//////////

    void printHello() {
      final DateTime now = new DateTime.now();
      final int isolateId = Isolate.current.hashCode;
      print("[$now] Hello, world! isolate=${isolateId} 
      function='$printHello'");
    }

    void main() async {
    runApp(MaterialApp(home: Application()));
    }

     class Application extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Container(
            child: Center(
              child: RaisedButton(
                child: Text('Hello'),
                onPressed: () {
                  runAlarm();
                },
              ),
            ),
          ),
        );
      }

  void runAlarm() {
    AndroidAlarmManager.oneShot(
      Duration(seconds: 10),
      0,
      printHello,
      wakeup: true,
    ).then((val) => print(val));
  }
  static void alarmTest() {
    print("test");
  }

}

It does not give any Error in console but print two statements as below:

E/AlarmService(11943): Fatal: failed to find callback
I/AlarmService(11943): AlarmService has not yet started.


I also initialize the alarm manager but it gives error in console:


 void runAlarm() {
    AndroidAlarmManager.periodic(
      Duration(seconds: 10),
      0,
      printHello,
      wakeup: true,
    ).then((val) => print(val)).catchError((e) {
      print(e);
    });
  }


Error:

E/flutter ( 6831): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: PlatformException(error, Attempt to invoke interface method 'void io.flutter.plugin.common.PluginRegistry$PluginRegistrantCallback.registerWith(io.flutter.plugin.common.PluginRegistry)' on a null object reference, null)
    E/flutter ( 6831): #0      JSONMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:149:7)
    E/flutter ( 6831): #1      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:302:33)
    E/flutter ( 6831): <asynchronous suspension>
    E/flutter ( 6831): #2      AndroidAlarmManager.initialize (package:android_alarm_manager/android_alarm_manager.dart:76:10)
    E/flutter ( 6831): <asynchronous suspension>
    E/flutter ( 6831): #3      main (package:alarmdemo/main.dart:12:29)
    E/flutter ( 6831): <asynchronous suspension>
    E/flutter ( 6831): #4      _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:189:25)
    E/flutter ( 6831): #5      _rootRun (dart:async/zone.dart:1124:13)
    E/flutter ( 6831): #6      _CustomZone.run (dart:async/zone.dart:1021:19)
    E/flutter ( 6831): #7      _runZoned (dart:async/zone.dart:1516:10)
    E/flutter ( 6831): #8      runZoned (dart:async/zone.dart:1500:12)
    E/flutter ( 6831): #9      _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:180:5)
    E/flutter ( 6831): #10     _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:300:19)
    E/flutter ( 6831): #11     _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)
    E/flutter ( 6831): 
    E/flutter ( 6831): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: MissingPluginException(No implementation found for method AlarmService.initialized on channel plugins.flutter.io/android_alarm_manager_background)
    E/flutter ( 6831): #0      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:300:7)
    E/flutter ( 6831): <asynchronous suspension>
    E/flutter ( 6831): #1      _alarmManagerCallbackDispatcher (package:android_alarm_manager/android_alarm_manager.dart:49:12)
    E/flutter ( 6831): #2      _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:189:25)
    E/flutter ( 6831): #3      _rootRun (dart:async/zone.dart:1124:13)
    E/flutter ( 6831): #4      _CustomZone.run (dart:async/zone.dart:1021:19)
    E/flutter ( 6831): #5      _runZoned (dart:async/zone.dart:1516:10)
    E/flutter ( 6831): #6      runZoned (dart:async/zone.dart:1500:12)
    E/flutter ( 6831): #7      _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:180:5)
    E/flutter ( 6831): #8      _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:300:19)
    E/flutter ( 6831): #9      _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)
    E/flutter ( 6831): 

enter image description here

Ответы [ 6 ]

0 голосов
/ 24 апреля 2019

Я наконец-то исправил эту проблему сам, после нескольких часов борьбы (но чувствовал себя намного дольше!).Прорыв произошел, когда я фактически клонировал репозиторий Flutter Plugins Github , который содержит android_alarm_manager, и изучил пример кода и посмотрел, как он был выложен в IDE, а не смотрел на изолированные файлы в Интернете.

В файле Readme не очень ясно, что именно делать, если вы не разбираетесь в разработке Android Java, но становится ясно, когда вы посмотрите на рабочий пример кода.

Вам нужночтобы вставить файл Application.java, который вам дают в каталоге с примером, в ваш реальный проект, в ту же папку, что и существующий файл MainActivity.java.Содержимое должно выглядеть так:

package io.flutter.plugins.androidalarmmanagerexample;

import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugins.androidalarmmanager.AlarmService;

public class Application extends FlutterApplication implements PluginRegistrantCallback {
  @Override
  public void onCreate() {
    super.onCreate();
    AlarmService.setPluginRegistrant(this);
  }

  @Override
  public void registerWith(PluginRegistry registry) {
    GeneratedPluginRegistrant.registerWith(registry);
  }
}

Что касается того, куда вам нужно поместить этот файл, их пример выглядит так, но ваш, вероятно, находится в чем-то вроде <your project dir>/android/app/src/main/java/com/example/<your project name>:

The Application.java file goes in the same folder as your MainActivity.java

После этого вы должны обновить имя пакета в первой строке Application.java с package io.flutter.plugins.androidalarmmanagerexample;, чтобы соответствовать пакету, используемому вашим проектом.(см. первую строку вашего существующего MainActivity.java).Если вы этого не сделаете, Gradle не найдет его и ничего не работает!

Теперь вы можете следовать совету в Readme , добавив разрешения и т. Д .:

После обычного импорта этого плагина в свой проект добавьте следующее к своему AndroidManifest.xml в тегах <manifest></manifest>:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

Далее, в пределах<application></application> тегов, добавьте:

<service
    android:name="io.flutter.plugins.androidalarmmanager.AlarmService"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:exported="false"/>
<receiver
    android:name="io.flutter.plugins.androidalarmmanager.AlarmBroadcastReceiver"
    android:exported="false"/>
<receiver
    android:name="io.flutter.plugins.androidalarmmanager.RebootBroadcastReceiver"
    android:enabled="false">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>

Последняя часть - часть, которая меня больше всего смутила.Звучит так, будто они очень расплывчаты, но если вы сделали все остальное точно раньше, это именно то, что вам нужно сделать.

Что должно быть отражено в AndroidManifest.xml приложения.Например:

    <application
        android:name=".Application"
        ...

Просто измените ваш android:name на .Application, что означает, что теперь он будет использовать Application.java, который мы добавили ранее.

Вот и все!Надеюсь, теперь вы можете запустить свое приложение.

0 голосов
/ 07 марта 2019

Проблема : необработанное исключение: MissingPluginException (реализация не найдена для метода AlarmService.initialized на канале plugins.flutter.io/android_alarm_manager_background)

Причина : аварийные обратные вызовыпотребуется доступ к другим плагинам Flutter, включая сам плагин менеджера тревог, необходимо научить фоновую службу инициализации плагинов.Поскольку AlarmManager использует отдельный изолятор, любой плагин, который используется в запланированном коде, должен быть инициализирован для AlarmManager отдельно.

Решение : Зарегистрируйте сам плагин менеджера аварийных сигналов в Application.java, как показано ниже; (устранены официальные проблемы с репозиторием флаттера # 21969 )

import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugins.androidalarmmanager.AlarmService;
import io.flutter.plugins.androidalarmmanager.AndroidAlarmManagerPlugin;

public class Application extends FlutterApplication implements PluginRegistrantCallback {
  @Override
  public void onCreate() {
    super.onCreate();
    AlarmService.setPluginRegistrant(this);
  }

  @Override
  public void registerWith(PluginRegistry registry) {
    // GeneratedPluginRegistrant.registerWith(registry);
    AndroidAlarmManagerPlugin.registerWith(registry.registrarFor("io.flutter.plugins.androidalarmmanager.AndroidAlarmManagerPlugin"));
  }
}
0 голосов
/ 03 марта 2019

У меня была такая же проблема.Просто откройте проект Android.Выполните синхронизацию Gradle.Затем выполните «build -> clean project» и «build -> rebuild project».

0 голосов
/ 02 марта 2019

Вы ссылаетесь на Application в вашем AndroidManifest.xml?Кстати (я бы использовал другое имя, чтобы не путать с Android Application, например MyFlutterApplication).

Обратите внимание на документацию к плагину , в которой говорится:

Что должно быть отражено в AndroidManifest.xml приложения.Например:

<application
    android:name=".Application"
    ...

Для получения дополнительной информации см. Документация по элементам для разработчиков Android .

0 голосов
/ 28 февраля 2019

Если вы разрабатываете это приложение для Android только тогда, вы можете создать native foreground/background service, который работает для каждого данного интервала времени.Затем, используя platform channel, вы можете позвонить в службу из dart либо по нажатию button, если хотите, чтобы она запускалась каждый раз при определенных условиях, либо при помощи shared prefrence вызвать собственную службу из initState() на своей домашней странице.Как вы, возможно, знаете, после запуска нативной службы она будет вызываться сама по себе через каждый заданный интервал времени (, например, минута или 24 часа ).

0 голосов
/ 26 февраля 2019

Вы не инициализировали объект тревоги и обработчик обратного вызова.

await AndroidAlarmManager.initialize ();

Что происходит, когда приложение запускает следующее:

 void main() async {
    runApp(MaterialApp(home: Application()));
 }

Приложение просто запустится и нарисует для вас пользовательский интерфейс.После нажатия кнопки вызывается следующий метод:

AndroidAlarmManager.oneShot(
   Duration(seconds: 10),
   0,
   printHello,
   wakeup: true,
)

Эта функция просто планирует обратный вызов по истечении указанного времени задержки.Это не удастся, потому что обработчик обратного вызова не зарегистрирован.Это означает, что после истечения времени ожидания он не может найти «кого-либо», ответственного за запуск «printHello».

edit:

Вам также необходимо переопределить метод, чтобы плагин регистрировался при создании.

Создайте новый файл, как показано ниже:

yourapprootfolder/android/app/src/main/java/io/flutter/plugins/androidalarmmanagerexample/Application.java

Внутри файла .java укажите это:

package io.flutter.plugins.androidalarmmanagerexample;

import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugins.androidalarmmanager.AlarmService;

public class Application extends FlutterApplication implements PluginRegistrantCallback {
  @Override
  public void onCreate() {
    super.onCreate();
    AlarmService.setPluginRegistrant(this);
  }

  @Override
  public void registerWith(PluginRegistry registry) {
    GeneratedPluginRegistrant.registerWith(registry);
  }
}

или в файлах Kt:

package io.flutter.plugins.androidalarmmanagerexample;

import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugins.androidalarmmanager.AlarmService;

class Application : FlutterApplication(), PluginRegistrantCallback {
      override fun onCreate() {
        super.onCreate();
        AlarmService.setPluginRegistrant(this);
      }

      override fun registerWith(registry: PluginRegistry) {
        GeneratedPluginRegistrant.registerWith(registry);
      }
}
...