Flutter地理位置获取插件flutter_tamap_location的使用

Flutter地理位置获取插件flutter_tamap_location的使用

简介

flutter_tamap_location 是一个用于获取地理位置信息的 Flutter 插件。它支持 Android 和 iOS 平台,并且可以获取高精度的地理位置数据。


使用步骤

1. 添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter_tamap_location: ^1.0.0
  permission_handler: ^10.0.0

然后运行 flutter pub get 安装依赖。


2. 初始化插件

main.dart 中初始化插件并设置必要的配置。

import 'package:flutter/material.dart';
import 'package:flutter_tamap_location/amap_location_option.dart';
import 'dart:async';
import 'dart:io';
import 'package:permission_handler/permission_handler.dart';
import 'package:flutter_tamap_location/flutter_amap_location.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  Map<String, Object>? _locationResult;

  StreamSubscription<Map<String, Object>>? _locationListener;

  final FlutterAmapLocation _locationPlugin = FlutterAmapLocation(pluginKey: "background");

  [@override](/user/override)
  void initState() {
    super.initState();

    // 设置高德隐私政策是否已展示
    FlutterAmapLocation.updatePrivacyShow(true, true);

    // 设置是否已获得用户同意
    FlutterAmapLocation.updatePrivacyAgree(true);

    // 动态申请定位权限
    requestPermission();

    // 设置高德地图的 apiKey(Android 和 iOS)
    FlutterAmapLocation.setApiKey("your_android_api_key", "your_ios_api_key");

    // iOS 获取精度类型
    if (Platform.isIOS) {
      requestAccuracyAuthorization();
    }

    // 注册定位结果监听
    _locationListener = _locationPlugin.onLocationChanged().listen((Map<String, Object> result) {
      setState(() {
        _locationResult = result;
      });
    });
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();

    // 移除定位监听
    if (null != _locationListener) {
      _locationListener?.cancel();
    }

    // 销毁定位插件
    _locationPlugin.destroy();
  }

  // 设置定位参数
  void _setLocationOption() {
    AMapLocationOption locationOption = AMapLocationOption();

    // 是否单次定位
    locationOption.onceLocation = false;

    // 是否需要逆地理信息
    locationOption.needAddress = true;

    // 逆地理信息的语言类型
    locationOption.geoLanguage = GeoLanguage.DEFAULT;

    // 设置定位模式
    locationOption.locationMode = AMapLocationMode.Hight_Accuracy;

    // 设置定位间隔
    locationOption.locationInterval = 2000;

    // 设置 iOS 的最小更新距离
    locationOption.distanceFilter = -1;

    // 设置 iOS 的期望定位精度
    locationOption.desiredAccuracy = DesiredAccuracy.Best;

    // 将定位参数设置给插件
    _locationPlugin.setLocationOption(locationOption);
  }

  // 开始定位
  void _startLocation() {
    _setLocationOption(); // 设置定位参数
    FlutterAmapLocation.startBackgroundLocation();
  }

  // 停止定位
  void _stopLocation() {
    FlutterAmapLocation.stopBackgroundLocation();
  }

  // 请求定位权限
  void requestPermission() async {
    bool hasPermission = await requestLocationPermission();
    if (hasPermission) {
      print("定位权限申请通过");
    } else {
      print("定位权限申请不通过");
    }
  }

  // 请求定位权限的具体实现
  Future<bool> requestLocationPermission() async {
    var status = await Permission.location.status;
    if (status == PermissionStatus.granted) {
      return true;
    } else {
      status = await Permission.location.request();
      return status == PermissionStatus.granted;
    }
  }

  // 获取 iOS 的精度类型
  void requestAccuracyAuthorization() async {
    AMapAccuracyAuthorization accuracy = await _locationPlugin.getSystemAccuracyAuthorization();
    if (accuracy == AMapAccuracyAuthorization.AMapAccuracyAuthorizationFullAccuracy) {
      print("精确定位类型");
    } else if (accuracy == AMapAccuracyAuthorization.AMapAccuracyAuthorizationReducedAccuracy) {
      print("模糊定位类型");
    } else {
      print("未知定位类型");
    }
  }

  // 创建按钮容器
  Container _createButtonContainer() {
    return Container(
      alignment: Alignment.center,
      child: Row(
        mainAxisSize: MainAxisSize.min,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          ElevatedButton(
            onPressed: _startLocation,
            child: const Text('开始定位'),
            style: ButtonStyle(
              backgroundColor: MaterialStateProperty.all(Colors.blue),
              foregroundColor: MaterialStateProperty.all(Colors.white),
            ),
          ),
          SizedBox(width: 20),
          ElevatedButton(
            onPressed: _stopLocation,
            child: const Text('停止定位'),
            style: ButtonStyle(
              backgroundColor: MaterialStateProperty.all(Colors.blue),
              foregroundColor: MaterialStateProperty.all(Colors.white),
            ),
          ),
        ],
      ),
    );
  }

  // 显示定位结果
  Widget _resultWidget(key, value) {
    return Row(
      mainAxisSize: MainAxisSize.min,
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        Container(
          alignment: Alignment.centerRight,
          width: 100,
          child: Text('$key :'),
        ),
        SizedBox(width: 5),
        Flexible(child: Text('$value', softWrap: true)),
      ],
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    List<Widget> widgets = [];
    widgets.add(_createButtonContainer());

    if (_locationResult != null) {
      _locationResult?.forEach((key, value) {
        widgets.add(_resultWidget(key, value));
      });
    }

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('AMap Location Plugin Example'),
        ),
        body: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          mainAxisSize: MainAxisSize.min,
          children: widgets,
        ),
      ),
    );
  }
}

更多关于Flutter地理位置获取插件flutter_tamap_location的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地理位置获取插件flutter_tamap_location的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_tamap_location 是一个用于在 Flutter 应用中获取地理位置的插件。它基于高德地图的定位服务,提供了获取设备当前位置的功能。以下是如何使用 flutter_tamap_location 插件的详细步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 flutter_tamap_location 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_tamap_location: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 配置高德地图

在使用 flutter_tamap_location 之前,你需要在高德开放平台注册一个应用,并获取 API Key

Android 配置

android/app/src/main/AndroidManifest.xml 文件中添加以下内容:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <application
        android:name="io.flutter.app.FlutterApplication"
        android:label="yourapp"
        android:icon="@mipmap/ic_launcher">
        
        <!-- 高德地图 API Key -->
        <meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="YOUR_AMAP_API_KEY" />
        
    </application>
</manifest>

iOS 配置

ios/Runner/Info.plist 文件中添加以下内容:

<key>NSLocationWhenInUseUsageDescription</key>
<string>我们需要您的位置信息来提供更好的服务</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>我们需要您的位置信息来提供更好的服务</string>
<key>AMapApiKey</key>
<string>YOUR_AMAP_API_KEY</string>

3. 使用插件获取位置

在你的 Flutter 代码中,你可以使用 flutter_tamap_location 来获取设备的位置信息。

import 'package:flutter/material.dart';
import 'package:flutter_tamap_location/flutter_tamap_location.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: LocationScreen(),
    );
  }
}

class LocationScreen extends StatefulWidget {
  @override
  _LocationScreenState createState() => _LocationScreenState();
}

class _LocationScreenState extends State<LocationScreen> {
  String _locationInfo = 'Unknown';

  Future<void> _getLocation() async {
    try {
      // 初始化定位服务
      await FlutterTamapLocation.init();

      // 获取当前位置
      LocationResult result = await FlutterTamapLocation.getLocation();

      setState(() {
        _locationInfo = 'Latitude: ${result.latitude}, Longitude: ${result.longitude}';
      });
    } catch (e) {
      setState(() {
        _locationInfo = 'Failed to get location: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Location Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Location:',
              style: TextStyle(fontSize: 20),
            ),
            Text(
              _locationInfo,
              style: TextStyle(fontSize: 16),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _getLocation,
              child: Text('Get Location'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 运行应用

现在你可以运行你的 Flutter 应用,点击 “Get Location” 按钮来获取设备的位置信息。

5. 处理权限

在 Android 和 iOS 上,获取位置信息需要用户授权。确保你在应用中正确处理了权限请求。

Android

AndroidManifest.xml 中添加以下权限:

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

iOS

Info.plist 中添加以下权限描述:

<key>NSLocationWhenInUseUsageDescription</key>
<string>我们需要您的位置信息来提供更好的服务</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>我们需要您的位置信息来提供更好的服务</string>
回到顶部