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
更多关于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}'),
],
),
),
),
);
}
}
在这个示例中,我们完成了以下步骤:
- 配置Traccar服务器信息:设置你的Traccar服务器URL和设备ID。
- 请求位置权限:使用
geolocator
插件来获取当前位置,这需要用户授予位置权限。 - 获取当前位置:一旦获得权限,我们请求当前设备的位置。
- 发送位置到Traccar服务器:构建位置数据并使用
traccar_flutter
插件将其发送到Traccar服务器。
请注意,这只是一个基础示例,你可能需要根据实际需求进行更多的配置和错误处理。此外,确保你的Traccar服务器已经正确配置并可以接受位置数据。