Flutter 位置插件

此 Flutter 插件可处理 Android 和 iOS 上的位置获取。它还提供位置更改时的回调。

Flutter-Location-Plugin

入门

Android

要在 Android 中使用此插件,您必须在 AndroidManifest.xml 中添加此权限

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

使用此项更新您的 gradle.properties 文件

android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536M

请同时确保您的 build.gradle 中有这些依赖项

  dependencies {
      classpath 'com.android.tools.build:gradle:3.3.0'
      classpath 'com.google.gms:google-services:4.2.0'
  }
...
  compileSdkVersion 28

iOS

要在 iOS 中使用,您必须在 Info.plist 中添加此权限

NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription

警告:目前 iOS 模拟器存在一个 bug,您必须手动选择一个位置几次,模拟器才能实际发送数据。请在测试 iOS 模拟器时牢记这一点。

示例应用

示例应用程序使用了 Google Maps Flutter Plugin,请在 AndroidManifest.xmlAppDelegate.m 中添加您的 API 密钥以使用 Google Maps 插件。

示例代码

然后您只需导入该包

import 'package:location/location.dart';

查看示例以了解用法,但一次性获取位置的基本实现可以这样完成

var currentLocation = LocationData;

var location = new Location();

// Platform messages may fail, so we use a try/catch PlatformException.
try {
  currentLocation = await location.getLocation();
} on PlatformException catch (e) {
  if (e.code == 'PERMISSION_DENIED') {
    error = 'Permission denied';
  } 
  currentLocation = null;
}

您还可以获取位置变化时的连续回调

var location = new Location();

location.onLocationChanged().listen((LocationData currentLocation) {
  print(currentLocation.latitude);
  print(currentLocation.longitude);
});

公共方法摘要

在此表中,您可以找到此插件公开的不同函数

返回 描述
Future<bool> requestPermission()
请求位置权限。返回一个布尔值以了解权限是否已获得。
Future<bool> hasPermission()
返回一个布尔值以了解位置权限的状态。
Future<bool> serviceEnabled()
返回一个布尔值以了解位置服务是否已启用,或者用户是否已手动禁用它。
Future<bool> requestService()
显示一个警报对话框以请求用户激活位置服务。在 iOS 上,由于 Apple 的指南,只会显示一个警报,用户必须手动前往设置。返回一个布尔值以了解位置服务是否已激活(在 iOS 上始终为 false)。
Future<bool> changeSettings(LocationAccuracy accuracy = LocationAccuracy.HIGH, int interval = 1000, double distanceFilter = 0)
将更改未来请求的设置。accuracy 将描述请求的精度(请参阅 LocationAccuracy 对象)。interval 将设置活动位置更新的所需间隔(以毫秒为单位)(仅影响 Android)。distanceFilter 设置两次位置更新之间的最小位移(以米为单位)。
Future<LocationData> getLocation()
允许获取用户的一次性位置。如果尚未获得权限,它将尝试请求权限,如果权限仍未获得,则会抛出 PERMISSION_DENIED 错误代码。
Stream<LocationData> onLocationChanged()
获取用户位置的流。如果尚未获得权限,它将尝试请求权限,如果权限仍未获得,则会抛出 PERMISSION_DENIED 错误代码。

您应该尝试使用 requestPermission() 手动管理权限以避免错误,但该插件会尝试为您处理一些情况。

对象

class LocationData {
  final double latitude; // Latitude, in degrees
  final double longitude; // Longitude, in degrees
  final double accuracy; // Estimated horizontal accuracy of this location, radial, in meters
  final double altitude; // In meters above the WGS 84 reference ellipsoid
  final double speed; // In meters/second
  final double speedAccuracy; // In meters/second, always 0 on iOS
  final double heading; //Heading is the horizontal direction of travel of this device, in degrees
  final double time; //timestamp of the LocationData
}


enum LocationAccuracy { 
  POWERSAVE, // To request best accuracy possible with zero additional power consumption, 
  LOW, // To request "city" level accuracy
  BALANCED, // To request "block" level accuracy
  HIGH, // To request the most accurate locations available
  NAVIGATION // To request location for navigation usage (affect only iOS)
}

注意:您可以使用以下方式将时间戳转换为 DateTimeDateTime.fromMillisecondsSinceEpoch(locationData.time.toInt())

GitHub

https://github.com/Lyokone/flutterlocation