Flutter - 使用 AndroidAlarmManager 和 Location 获取位置

问题描述

我目前正在寻找一种每分钟左右发送一次设备位置的解决方案。

我正在尝试使用 AndroidAlarmManager 和 Location 库来实现。这是我的代码片段:

import 'package:android_alarm_manager/android_alarm_manager.dart';
import 'package:Flutter/material.dart';
import 'package:jardiparc/services/sync.dart';
import 'package:location/location.dart';
import 'package:provider/provider.dart';

import 'jardiparc.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await AndroidAlarmManager.initialize();
  runApp(Provider(create: (_) => SyncService(),lazy: false,child: JardiParc()));
  await AndroidAlarmManager.periodic(Duration(seconds: 5),1,sendLocation,exact: true);
}

void sendLocation() async {
  print(DateTime.Now().minute.toString() + ':' + DateTime.Now().second.toString());
  print('send location');

  Location location = new Location();
  var currentPosition = await location.getLocation();
}

当我运行此代码时,我不断收到此错误

E/Flutter (14488): [ERROR:Flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: MissingPluginException(No implementation found for method getLocation on channel lyokone/location)
E/Flutter (14488): #0      MethodChannel._invokeMethod (package:Flutter/src/services/platform_channel.dart:156:7)
E/Flutter (14488): <asynchronous suspension>
E/Flutter (14488): #1      Location.getLocation (package:location/location.dart:135:10)

我曾尝试执行 Flutter clean,但没有奏效。

对此的任何帮助将不胜感激。

干杯

解决方法

  • 检查您是否正确初始化了插件:follow this link
  • 检查您是否拥有位置权限:
Location location = new Location();

bool _serviceEnabled;
PermissionStatus _permissionGranted;
LocationData _locationData;

_serviceEnabled = await location.serviceEnabled();
if (!_serviceEnabled) {
  _serviceEnabled = await location.requestService();
  if (!_serviceEnabled) {
    return;
  }
}

_permissionGranted = await location.hasPermission();
if (_permissionGranted == PermissionStatus.denied) {
  _permissionGranted = await location.requestPermission();
  if (_permissionGranted != PermissionStatus.granted) {
    return;
  }
}

_locationData = await location.getLocation();
  • 改变
await AndroidAlarmManager.periodic(Duration(seconds: 5),1,sendLocation,exact: true);

await AndroidAlarmManager.periodic(Duration(seconds: 5),exact: true);

您输入的参数1不应该是