我在New Flutter应用程序中安装了Android Alarm Manager插件。我使用插件的示例代码 - 但它在控制台中出错。
请建议如何使android报警管理器插件工作。如何将Dart的android_alarm_manager集成到应用程序中,以便用户在计划中选择的时间到达时会收到警报?
我使用此链接中的代码: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):
在经过几个小时的挣扎之后,我终于自己解决了这个问题(但感觉要长得多!)。当我实际克隆包含Flutter Plugins Github repository的android_alarm_manager
并在示例代码中查看它是如何在IDE中进行布局而不是在线查看隔离文件时,取得了突破。
如果您不熟悉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>
:
完成此操作后,您必须更新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
。
而已!希望您现在可以运行您的应用程序。
我有同样的问题。只需打开android项目。执行Gradle同步。接下来,执行“构建 - >清理项目”和“构建 - >重建项目”。
问题:未处理的异常:MissingPluginException(在通道plugins.flutter.io/android_alarm_manager_background上找不到方法AlarmService.initialized的实现)
原因:报警回调需要访问其他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"));
}
}
您没有初始化警报对象和回调处理程序。
等待AndroidAlarmManager.initialize();
当应用程序开始运行时会发生什么:
void main() async {
runApp(MaterialApp(home: Application()));
}
该应用程序只是为您运行并绘制UI。单击该按钮后,将调用以下方法:
AndroidAlarmManager.oneShot(
Duration(seconds: 10),
0,
printHello,
wakeup: true,
)
此函数只是在指定的延迟时间后调度回调。这将失败,因为Callback处理程序未注册。意思是,在超时后,它找不到“任何人”负责运行'printHello'。
编辑:
您还需要覆盖一个方法来帮助插件在创建时注册。
创建一个如下所示的新文件:
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);
}
}
如果您正在为Android开发此应用程序,那么您可以创建native foreground/background service
,它运行每个给定的时间间隔。然后使用platform channel
你可以在button
tap上调用dart服务,如果你希望它在某些条件下每次都运行或者使用shared prefrence
从你主页上的initState()
调用本机服务。正如您可能知道的那样,一旦本机服务启动,它将在每个给定的时间间隔(如分钟或24小时)后自行调用。
你在AndroidManifest.xml中引用了qazxsw poi吗? BTW(我会用一个不同的名字与Android的qazxsw poi没有任何混淆,例如Application
)。
请注意,在Application
中,它指出:
哪个必须反映在应用程序的AndroidManifest.xml中。例如。:
MyFlutterApplication
有关更多信息,请参阅the documentation of the plugin。