Flutter位置追踪插件traccar_flutter的使用

Flutter位置追踪插件traccar_flutter的使用

一个用于将Traccar跟踪平台集成到Flutter应用中的库。该包作为Android和iOS原生实现的桥梁,实现了无缝的位置跟踪和配置。


注意事项

此插件不是官方的Traccar项目。它由我独立开发,以帮助将Traccar的功能集成到Flutter应用程序中。

如果您有任何问题、建议或需要支持,可以随时联系:


功能特性

  • 跨平台支持Android和iOS。
  • 提供以下方法:
    • 初始化Traccar服务。
    • 配置跟踪设置。
    • 启动和停止跟踪服务。
    • 查看服务状态日志。
  • 使用官方Traccar原生SDK以确保可靠和高效的跟踪。

原生Traccar SDKs

该库利用了以下原生SDK:


必要权限

为确保插件正常运行,您需要向您的应用添加以下权限。

Android

AndroidManifest.xml文件中,包含以下权限:

<!-- 位置访问权限 -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<!-- Traccar服务权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />

<!-- 制造商特定权限 -->
<uses-permission android:name="oppo.permission.OPPO_COMPONENT_SAFE" />
<uses-permission android:name="com.huawei.permission.external_app_settings.USE_COMPONENT" />

<!-- 硬件功能 -->
<uses-feature android:name="android.hardware.location.network" />
<uses-feature android:name="android.hardware.location.gps" />

请确保处理Android 6.0(API级别23)及以上的运行时权限。

iOS

Info.plist文件中,添加以下键以定义所需的定位权限:

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>这是追踪应用,因此需要访问位置服务</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>这是追踪应用,因此需要访问位置服务</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>这是追踪应用,因此需要访问位置服务</string>
<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>

这些权限是为了使应用能够在前台和后台模式下访问位置服务。


其他注意事项

  • Android:对于Android API 23或更高的版本,必须动态请求位置权限。
  • iOS:必须由用户授予位置权限。当使用后台位置更新时,确保遵守Apple的App Store指南。

安装

pubspec.yaml文件中添加以下内容:

dependencies:
  traccar_flutter: ^1.0.0

然后运行:

flutter pub get

使用

以下是使用TraccarFlutter包的方法:

导入包

import 'package:traccar_flutter/traccar_flutter.dart';

示例代码

import 'package:traccar_flutter/traccar_flutter.dart';

void main() async {
  final traccar = TraccarFlutter();

  // 初始化服务
  await traccar.initTraccar();

  // 设置配置
  final configs = TraccarConfigs(
    deviceId: 'your-device-id',
    serverUrl: 'http://demo.traccar.org:5055',
    interval: 15000, // 15秒
    accuracy: AccuracyLevel.high,
    offlineBuffering: true,
  );
  await traccar.setConfigs(configs);

  // 启动服务
  await traccar.startService();

  // 可选:查看状态日志
  final logs = await traccar.showStatusLogs();
  print('服务日志: $logs');
}

配置参数

参数名 类型 是否必填 默认值 描述
deviceId String - 设备唯一标识符
serverUrl String - Traccar服务器的URL
accuracy AccuracyLevel AccuracyLevel.high 期望的位置精度(低、中、高)
interval int (毫秒) 10000 (10秒) 两次位置更新之间的间隔时间
distance int (米) 0 触发位置更新的最小距离(米)
angle int (度) 0 基于方向变化触发位置更新的角度阈值
offlineBuffering bool true 当设备离线时启用位置更新缓冲
wakelock bool true 追踪服务运行时保持设备唤醒
notificationIcon String null 自定义通知图标名称,必须存在于应用资源中

示例用法

final configs = TraccarConfigs(
  deviceId: 'unique-device-id',
  serverUrl: 'http://demo.traccar.org:5055',
  interval: 15000, // 每15秒发送一次更新
  distance: 10,    // 移动10米后发送更新
  angle: 30,       // 方向变化30度后发送更新
  accuracy: AccuracyLevel.high, // 使用高精度模式
  offlineBuffering: true, // 启用离线数据存储
  wakelock: true, // 保持设备唤醒
  notificationIcon: 'custom_icon', // 可选的通知图标
);

示例代码

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:traccar_flutter/entity/traccar_configs.dart';
import 'package:traccar_flutter/traccar_flutter.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

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

class _MyAppState extends State<MyApp> {
  final _traccarFlutterPlugin = TraccarFlutter();
  bool isServiceStarted = false;
  String? traccingMessage;

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

  // 平台消息异步初始化
  Future<void> initPlatformState() async {
    traccingMessage = await _traccarFlutterPlugin.initTraccar();
    traccingMessage = await _traccarFlutterPlugin.setConfigs(TraccarConfigs(
      deviceId: '1241234123',
      serverUrl: 'http://demo.traccar.org:5055',
      notificationIcon: 'ic_notification',
    ));

    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Traccar Demo'),
        ),
        body: Center(
          child: Text(
            'Traccar Message: \n\n ${traccingMessage ?? '-'}',
            textAlign: TextAlign.center,
          ),
        ),
        floatingActionButton: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            FloatingActionButton(
              onPressed: () {
                _traccarFlutterPlugin.showStatusLogs();
              },
              child: const Icon(Icons.screenshot_monitor),
            ),
            const SizedBox(height: 16),
            FloatingActionButton(
              onPressed: _toggleService,
              child: Icon(isServiceStarted ? Icons.stop : Icons.play_arrow),
            ),
          ],
        ),
      ),
    );
  }

  _toggleService() async {
    try {
      String? result;
      if (isServiceStarted) {
        result = await _traccarFlutterPlugin.stopService();
      } else {
        result = await _traccarFlutterPlugin.startService();
      }
      setState(() {
        traccingMessage = result;
        isServiceStarted = !isServiceStarted;
      });
    } catch (e) {
      setState(() {
        traccingMessage = e.toString();
      });
    }
  }
}

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

1 回复

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


当然,以下是如何在Flutter应用中使用traccar_flutter插件来实现位置追踪的一个简单示例。这个插件允许你与Traccar服务器进行交互,发送位置数据。

首先,确保你已经在pubspec.yaml文件中添加了traccar_flutter依赖:

dependencies:
  flutter:
    sdk: flutter
  traccar_flutter: ^最新版本号  # 请替换为实际最新版本号

然后运行flutter pub get来获取依赖。

接下来,在你的Flutter应用中,你可以使用以下代码来配置和使用traccar_flutter插件:

import 'package:flutter/material.dart';
import 'package:traccar_flutter/traccar_flutter.dart';
import 'package:geolocator/geolocator.dart';
import 'package:geolocator_platform_interface/geolocator_platform_interface.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  TraccarClient? _traccarClient;
  Position? _currentPosition;

  @override
  void initState() {
    super.initState();
    _initTraccarClient();
  }

  @override
  void dispose() {
    _traccarClient?.close();
    super.dispose();
  }

  Future<void> _initTraccarClient() async {
    // 配置Traccar服务器信息
    final String serverUrl = 'http://your-traccar-server-url/api/positions'; // 替换为你的Traccar服务器URL
    final String deviceId = 'your-device-id'; // 替换为你的设备ID
    _traccarClient = TraccarClient(serverUrl, deviceId);

    // 获取当前位置
    _getCurrentPosition();
  }

  Future<void> _getCurrentPosition() async {
    bool serviceEnabled;
    LocationPermission permission;

    // 检查位置服务是否启用
    serviceEnabled = await Geolocator.isLocationServiceEnabled();
    if (!serviceEnabled) {
      return Future.error('位置服务被禁用');
    }

    permission = await Geolocator.checkPermission();
    if (permission == LocationPermission.denied) {
      permission = await Geolocator.requestPermission();
      if (permission == LocationPermission.denied) {
        return Future.error('位置权限被拒绝');
      }
    }

    if (permission == LocationPermission.deniedForever) {
      return Future.error('位置权限被永久拒绝,我们无法请求权限');
    }

    Position position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high);

    setState(() {
      _currentPosition = position;
    });

    // 发送位置到Traccar服务器
    _sendPositionToTraccar(position);
  }

  Future<void> _sendPositionToTraccar(Position position) async {
    try {
      // 构建位置数据
      final Map<String, dynamic> positionData = {
        'latitude': position.latitude,
        'longitude': position.longitude,
        'timestamp': DateTime.now().toIso8601String(),
        // 可以根据需要添加更多字段,如速度、方向等
      };

      // 发送位置数据到Traccar服务器
      await _traccarClient!.sendPosition(positionData);
      print('位置已发送到Traccar服务器');
    } catch (e) {
      print('发送位置到Traccar服务器失败: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Traccar Flutter 示例'),
        ),
        body: Center(
          child: _currentPosition == null
              ? CircularProgressIndicator()
              : Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text('纬度: ${_currentPosition!.latitude}'),
                    Text('经度: ${_currentPosition!.longitude}'),
                  ],
                ),
        ),
      ),
    );
  }
}

在这个示例中,我们完成了以下步骤:

  1. 配置Traccar服务器信息:设置你的Traccar服务器URL和设备ID。
  2. 请求位置权限:使用geolocator插件来获取当前位置,这需要用户授予位置权限。
  3. 获取当前位置:一旦获得权限,我们请求当前设备的位置。
  4. 发送位置到Traccar服务器:构建位置数据并使用traccar_flutter插件将其发送到Traccar服务器。

请注意,这只是一个基础示例,你可能需要根据实际需求进行更多的配置和错误处理。此外,确保你的Traccar服务器已经正确配置并可以接受位置数据。

回到顶部