Android Alarm Manager arbeitet nicht für die Flutter-App-Projekt

Android Alarm Manager arbeitet nicht für die Flutter-App-Projekt
Ich habe installiert die Android-Alarm-Manager-plugin in meinem Neuen Flattern app. Ich benutze den Beispiel-code der Plugin – aber es gibt Fehlermeldung in der Konsole.

Bitte vorschlagen, wie man android-alarm-manager-plugins funktioniert.
Wie Integriere ich die Dart android_alarm_manager, um die app so, dass Benutzer alarm, wenn die Zeit, die Sie nahm in den Zeitplan erreicht?

Verwende ich den code aus diesem link:
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): 

Dies ist meine aktuelle Code:

/////////////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): 

Android Alarm Manager arbeitet nicht für die Flutter-App-Projekt

  • welcher Fehler ? fügen Sie bitte die Fehlermeldung
  • Fehler aktualisiert in Frage
  • lassen Sie mich überprüfen…
  • hast du eine aktuelle configration github.com/flutter/flutter/issues/26526
  • Welche version von android_alarm_manager verwenden Sie?>
  • Ich Benutze android_alarm_manager: ^0.4.1+2.
  • Nachdem Sie änderungen/Ergänzungen zu ‚pipedreambomb‘, können Sie ‚flutterLocalNotificationsPlugin‘. Methoden sind beschrieben in pub.dev/packages/flutter_local_notifications#-readme-tab-

InformationsquelleAutor Manpreet Kaur | 2019-02-19



6 Replies
  1. 5

    Habe ich endlich das Problem behoben mich nach kämpfen für ein paar Stunden (fühlte sich aber viel länger!). Der Durchbruch kam, als ich tatsächlich geklont Flattern Plugins Github-repository enthält android_alarm_manager und stocherte die Beispiel-code und sah, wie er war angelegt in einer IDE, anstatt in isolierten Dateien online.

    Die Readme-Datei ist nicht ganz klar, was genau zu tun ist, wenn Sie nicht versiert in der Android-Entwicklung mit Java, aber es wird klar, wenn man sich die Beispiel-code.

    Müssen Sie drop in die Application.java – Datei, die Sie geben Sie im Beispiel-Verzeichnis in Ihr Aktuelles Projekt, in dem gleichen Ordner wie die vorhandene MainActivity.java – Datei. Der Inhalt sollte wie folgt Aussehen:

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

    Als für wo Sie brauchen, um diese Datei, Ihrem Beispiel sieht es so aus, aber deiner ist wahrscheinlich in so etwas wie <your project dir>/android/app/src/main/java/com/example/<your project name>:

    Android Alarm Manager arbeitet nicht für die Flutter-App-Projekt

    Nachdem Sie dies getan haben, Sie muss update der Paket-name in der ersten Zeile der Application.java aus package io.flutter.plugins.androidalarmmanagerexample; zu entsprechen, was auch immer Paket Ihr Projekt verwendet (siehe die erste Zeile in der vorhandenen MainActivity.java). Wenn Sie dies nicht tun, gradle nicht finden es und nichts funktioniert!

    Können Sie jetzt Folgen Sie dem Rat im Readme, hinzufügen der Berechtigungen und etc:

    Nach dem Import dieses plugin, um Ihr Projekt wie gewohnt, fügen Sie Folgendes zu Ihrer AndroidManifest.xml innerhalb der <manifest></manifest> tags:

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

    Nächsten, in der <application></application> – tags hinzufügen:

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

    Der Letzte Teil ist der Teil, der die meisten verwirrt mich. Es klingt wie Sie sind sehr vage, aber wenn Sie nicht alles andere genau richtig erwähnt, es ist eigentlich genau das, was Sie tun müssen.

    Werden muss, spiegelt sich in der Anwendung AndroidManifest.xml. E. g.:

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

    Ändern Sie einfach Ihre android:name zu .Application, das heißt, es wird jetzt nutzen, dass Application.java wir zuvor Hinzugefügt.

    Das ist es! Hoffentlich können Sie jetzt führen Sie Ihre app aus.

    • Vielen Dank für Ihre Antwort. Ich Versuchen, diese Antwort, aber ich bin immer der Fehler auf alarm services, die ich definiert Application.java Datei. Ich Teile auch die Fehler als auch der code Application.java Klasse.
    • Sorry, ich weiß nicht, wie Sie helfen können. Ich hatte Glück, es funktioniert für mich, weil ich wirklich nicht verstehen, viel über Android Entwicklung! Edit, tatsächlich, Blick auf den screenshot, die Tatsache, dass AlarmService ist in rot sieht aus wie es ist nicht zu importieren, vielleicht, weil es nicht installiert ist. Ich würde damit beginnen, indem er in das.
    • Es wäre besser, die Application.java code in der Antwort statt verweisen an Sie. Ich wusste nicht, dass die Bedeutung, bis ich sah, den tatsächlichen code Sen Sokha Antwort. Vielleicht ändern Sie auch den Namen „MyApplication“, um den link deutlicher, d.h. es ist Ihre Wahl des namens.
    • Ich habe den Inhalt der Application.java Datei auf meine Antwort, wie Sie vorgeschlagen. Ich lasse den Namen das gleiche wie in Ihrer Dokumentation, insbesondere seit ich weiß nicht genug über ihn selbst, um zuverlässig geht um die Umbenennung Dinge brauche ich nicht! Wenig cargo cult Programmierung hier, aber es funktioniert.
    • Cannot resolve symbol ‚AlarmService‘. Nicht auflösen kann ‚androidalarmmanager“ in der import-Anweisung. Wat tun?
  2. 2

    Problem: Unbehandelte Ausnahme: MissingPluginException(Keine Implementierung für die Methode AlarmService.initialisiert auf Kanal plugins.flattern.io/android_alarm_manager_background)

    Grund: Alarm Rückrufe müssen Zugang zu anderen Flattern Plug-ins, einschließlich der alarm-manager-plugin selbst, es ist notwendig, zu lehren, die hintergrund-Dienst, wie zum initialisieren von plugins. Da AlarmManager verwendet, trennen, isolieren, jedes plugin, das verwendet wird, in den geplanten code initialisiert werden muss, für AlarmManager getrennt.

    Lösung: Register alarm-manager-plugin selbst in Application.java wie unten;(gelöst offiziellen flattern repo-Probleme #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"));
      }
    }
  3. 1

    Ich hatte das gleiche problem. Öffnen Sie einfach den android-Projekt. Führen Sie eine Gradle-sync. Next, machen Sie eine „build -> clean project“ und „build -> rebuild project“.

  4. 0

    Du hast nicht die Initialisierung der alarm-Objekt-und callback-handler.

    erwarten AndroidAlarmManager.initialize();

    Was passiert ist, wenn Sie die app starten, läuft diese:

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

    Die app einfach laufen, und zeichnen Sie die UI für Sie. Sobald Sie auf die Schaltfläche klicken, wird die folgende Methode aufgerufen:

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

    Diese Funktion ist einfach, einen Rückruf zu vereinbaren, nachdem die delay-Zeit angegeben. Dies würde fehlschlagen, da die Callback-Prozedur wird nicht registriert. Bedeutung, nach dem timeout, es konnte nicht finden, dass ‚jemand‘ verantwortlich, die Ausführung der ‚printHello‘.

    edit:

    Müssen Sie auch eine Methode überschreiben, um zu helfen-plugin registrieren selbst erstellen.

    Erstellen Sie eine neue Datei wie folgt Aussehen:

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

    Innerhalb der .java-Datei, setzen Sie diese:

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

    oder in Kt-Dateien:

    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);
          }
    }
    • Danke für deine Antwort.Ich update mein code, aber dennoch gibt es Fehler.
    • Das ist ein neuer Fehler, nehme ich an. Aktualisierte Antwort. Nicht nur das kopieren ein plugin blind und erwarten, dass es funktioniert, vielleicht versuchen, es zu verstehen.
    • Ich benutze diesen code vor. Wie Sie erwähnen, dieser code ist in Application.java Klasse aber, dass die Datei Fehler gibt und es nicht Holen einige AlarmService. und wie ich das ändern das android:name in manifest Datei? [email protected]
    • Anwendung von java in den Ordner von Android, es ist nicht kompiliert werden, da Flattern. Dieses plugin ist ein bisschen kompliziert, es muss Zeug sein, genannt im hintergrund. Manifest-Datei in android/src/main.
    • Ich update meine Frage mit screenshot wo gibt es einen Fehler auf AlarmService und sagt, dass AlarmService ist nicht aufgelösten [email protected]
    • Denn das Beispiel ist in Java, aber es in Kotlin…die Aktualisierung meiner Antwort kurz.
    • Ich habe die .java-Datei, aber ich verstehe immer noch nicht, wie Referenz es aus meiner manifest Datei. Ich bin immer noch lernen, Flattern mit VS Code und ich habe keine Ahnung, wie das Android-Zeug in Android Studio funktionieren soll. Die Idee ist in der Regel, die es generiert, es für mich.

  5. 0

    Wenn Sie die Entwicklung dieser app für android nur dann können Sie native foreground/background service die Pisten für jedes gegebene Zeitintervall. Dann mit der platform channel Sie können rufen Sie den Dienst von dart entweder auf button Tippen Sie auf wenn Sie es wollen, laufen jedes mal nach dem bestimmten Zustand oder mit shared prefrence Aufruf der nativen service von initState() in Ihre homepage. Wie Sie vielleicht wissen, wenn die native-Dienst gestartet wird, es wird aufgerufen, sich nach jeder gegebenen Zeitspanne(wie minute oder 24 Stunden).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.