Flutter车载通信插件telematics_sdk的使用
Flutter车载通信插件telematics_sdk的使用
Telematics SDK 是一个用于跟踪用户的驾驶行为(如超速、转弯、刹车等)的 Flutter 插件,适用于 iOS 和 Android 平台。
免责声明: 本项目使用了属于 DAMOOV PTE. LTD. 的 Telematics SDK。在使用 Telematics SDK 时,请参阅这些使用条款。
开始使用
初始应用设置与凭证
对于商业用途,您需要在 DataHub 中创建一个开发者工作区,并获取 InstanceId
和 InstanceKey
鉴权密钥以与我们的 API 进行交互。
Android 设置
注意事项
Android SDK 只支持 Gradle 8+ 版本。
修改 AndroidManifest.xml
在文件 ./app/src/main/AndroidManifest.xml
中添加以下属性:
<manifest
xmlns:tools="http://schemas.android.com/tools">
<application
tools:replace="android:label,android:name">
...
</application>
...
</manifest>
添加网络权限:
<manifest>
...
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
...
</manifest>
修改 build.gradle
在文件 (module)/build.gradle
中添加以下配置:
android {
...
buildTypes {
release {
...
shrinkResources false
minifyEnabled false
...
}
}
...
}
ProGuard 配置
在 ProGuard 配置文件中添加以下内容:
-keep public class com.raxeltelematics.** {*;}
### Android 高级设置
#### 设置跟踪设置
1. 覆盖应用程序类并扩展 `TelematicsSDKApp` 类:
```kotlin
import com.telematicssdk.TelematicsSDKApp
class App: TelematicsSDKApp() {
override fun onCreate() {
val api = TrackingApi.getInstance()
api.initialize(this, setTelematicsSettings())
super.onCreate()
}
override fun setTelematicsSettings(): Settings {
val settings = Settings(
stopTrackingTimeout = Settings.stopTrackingTimeHigh,
accuracy = Settings.accuracyHigh,
autoStartOn = true,
elmOn = false,
hfOn = true
)
return settings
}
}
- 在文件
./app/src/main/AndroidManifest.xml
的<application>
标签中添加以下内容:
<application
android:name=".App">
...
</application>
- 在文件
(module)/build.gradle
中添加 Telematics SDK 依赖项:
dependencies {
//...
implementation "com.telematicssdk:tracking:2.2.263"
}
iOS 设置
在项目的 ios/Runner/Info.plist
文件中添加以下权限:
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>location</string>
<string>remote-notification</string>
</array>
<key>NSMotionUsageDescription</key>
<string>请提供此 Demo 的权限</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>请提供此 Demo 的权限</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>请提供此 Demo 的权限</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>请提供此 Demo 的权限</string>
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>sdk.damoov.apprefreshtaskid</string>
<string>sdk.damoov.appprocessingtaskid</string>
</array>
从 iOS 15 版本及更高版本以及 Flutter 2.0.6 开始,需要修改 ios/Runner/AppDelegate.swift
文件。必须在 GeneratedPluginRegistrant
之前请求权限。
启用和禁用 SDK
首先,创建一个 TrackingApi
对象以与 SDK 交互:
import 'package:telematics_sdk/telematics_sdk.dart';
final _trackingApi = TrackingApi();
登录
await _trackingApi.setDeviceID(deviceId: "DEVICE_TOKEN");
注销
await _trackingApi.clearDeviceID();
启用 SDK
await _trackingApi.setEnableSdk(enable: true);
禁用 SDK
await _trackingApi.setEnableSdk(enable: false);
强制上传数据后禁用 SDK
await _trackingApi.setDisableWithUpload();
可用方法
手动启动跟踪
await _trackingApi.startManualTracking();
手动启动持续跟踪
await _trackingApi.startManualPersistentTracking();
注意:持续跟踪会忽略所有停止跟踪的原因,并在调用 stopTracking
方法之前一直进行。最大持续跟踪时长为 10 小时。
手动停止跟踪
await _trackingApi.stopManualTracking();
上传未发送的行程
await _trackingApi.uploadUnsentTrips();
获取未发送的行程数量
final unsentTripsCount = await _trackingApi.getUnsentTripCount();
发送自定义心跳
String reason = 'CustomHeartbeat';
await _trackingApi.sendCustomHeartbeats(reason: reason);
检查是否正在跟踪
final isTracking = await _trackingApi.isTracking();
启用高频率数据收集 (HF)
我们强烈建议默认启用此功能。
await _trackingApi.enableHF(value: true);
添加未来轨迹标签
String tag = 'TAG';
String source = 'App';
await _trackingApi.addFutureTrackTag(tag: tag, source: source);
删除一个标签
String tag = 'TAG';
await _trackingApi.removeFutureTrackTag(tag: tag);
删除所有标签
await _trackingApi.removeAllFutureTrackTags();
设置权限向导
如果没有这些权限,SDK 将无法启用。如果您希望用自己的方式请求权限,可以跳过此部分。
要显示权限向导,请执行以下步骤:
- 在您的小部件中创建并初始化
StreamSubscription
:
late StreamSubscription<PermissionWizardResult?> _onPermissionWizardStateChanged;
[@override](/user/override)
void initState() {
_onPermissionWizardStateChanged = _trackingApi
.onPermissionWizardClose
.listen(_onPermissionWizardResult);
void _onPermissionWizardResult(PermissionWizardResult result) {
if (result == PermissionWizardResult.allGranted) {
//所有权限已授予。在此处执行操作。
} else {
//权限未授予。在此处执行操作。
}
}
- 请求显示权限向导:
await _trackingApi.showPermissionWizard(
enableAggressivePermissionsWizard: false,
enableAggressivePermissionsWizardPage: true
);
如果 [enableAggressivePermissionsWizard]
设置为 true
,则向导将在所有所需权限授予后完成(用户不能通过返回按钮取消),否则如果设置为 false
,则向导可以在未授予所有权限或通过返回按钮取消的情况下完成。
如果 [enableAggressivePermissionsWizardPage]
设置为 true
,则向导将在当前页面上的请求权限授予后滑到下一页,否则如果设置为 false
,则向导可以在未授予权限的情况下滑动。
iOS 仅限方法
启用/禁用自动跟踪
bool disableTracking = false;
//true 以禁用自动跟踪(跟踪默认启用)
await _trackingApi.setDisableTracking(value: disableTracking);
检查自动跟踪状态
final isTrackingDisabled = await _trackingApi.isDisableTracking();
启用/禁用激进心跳
Telematics SDK (仅限 iOS) 支持两种心跳模式:
- 激进心跳 - 心跳每 20 分钟发送一次。SDK 始终处于活动状态。
- 普通心跳 - 心跳每 20 分钟发送一次,但在 SDK 进入待机模式时,只有新行程触发时才会激活,相应的心跳会被发送。
模式切换器
bool enable = true; //false 以禁用激进心跳
await _trackingApi.setAggressiveHeartbeats(value: enable)
检查状态
final isAggressiveHeartbeats = await _trackingApi.isAggressiveHeartbeat()
启用事故检测
事故检测默认禁用。您可以启用检测。为了使事故检测正常工作,您需要启用高频率数据收集。
await _trackingApi.enableAccidents(value: true);
//检查当前事故状态
final isEnabledAccidents = await _trackingApi.isEnabledAccidents();
示例代码
以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:telematics_sdk/telematics_sdk.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'TelematicsSDK Example',
home: TitleScreen(),
);
}
}
更多关于Flutter车载通信插件telematics_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter车载通信插件telematics_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中集成并使用telematics_sdk
插件进行车载通信的示例代码。请注意,这只是一个基本示例,实际项目中可能需要根据具体需求进行调整和扩展。
首先,确保你已经在pubspec.yaml
文件中添加了telematics_sdk
依赖:
dependencies:
flutter:
sdk: flutter
telematics_sdk: ^最新版本号 # 请替换为实际的最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,我们编写一个简单的Flutter应用来演示如何使用telematics_sdk
插件。
main.dart
import 'package:flutter/material.dart';
import 'package:telematics_sdk/telematics_sdk.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Telematics SDK Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: TelematicsScreen(),
);
}
}
class TelematicsScreen extends StatefulWidget {
@override
_TelematicsScreenState createState() => _TelematicsScreenState();
}
class _TelematicsScreenState extends State<TelematicsScreen> {
late TelematicsSdk _telematicsSdk;
String _status = 'Not Initialized';
@override
void initState() {
super.initState();
_initializeTelematicsSdk();
}
Future<void> _initializeTelematicsSdk() async {
try {
// 初始化Telematics SDK,这里假设需要一些初始化参数
// 具体的初始化参数和方法请参照telematics_sdk的文档
_telematicsSdk = TelematicsSdk();
await _telematicsSdk.initialize(
apiKey: 'your_api_key', // 替换为你的API密钥
userId: 'user_12345', // 替换为用户ID
);
setState(() {
_status = 'Initialized';
});
// 开始监听车辆状态变化
_telematicsSdk.onVehicleStatusChanged.listen((VehicleStatus status) {
print('Vehicle Status Changed: $status');
// 更新UI或执行其他操作
});
// 开始监听位置更新
_telematicsSdk.onLocationUpdated.listen((Location location) {
print('Location Updated: $location');
// 更新UI或执行其他操作
});
} catch (e) {
print('Failed to initialize Telematics SDK: $e');
setState(() {
_status = 'Initialization Failed';
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Telematics SDK Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Telematics SDK Status: $_status',
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
try {
// 示例:发送车辆控制命令
// 具体的命令和参数请参照telematics_sdk的文档
await _telematicsSdk.sendVehicleCommand(
command: 'START_ENGINE', // 示例命令
params: {'key': 'value'}, // 示例参数
);
print('Command sent successfully');
} catch (e) {
print('Failed to send command: $e');
}
},
child: Text('Send Vehicle Command'),
),
],
),
),
);
}
@override
void dispose() {
// 释放资源
_telematicsSdk.dispose();
super.dispose();
}
}
// 示例数据结构,具体结构请参照telematics_sdk的文档
class VehicleStatus {
String status;
// 其他属性...
@override
String toString() {
return 'VehicleStatus{status: $status}';
}
}
class Location {
double latitude;
double longitude;
// 其他属性...
@override
String toString() {
return 'Location{latitude: $latitude, longitude: $longitude}';
}
}
注意事项:
- 依赖版本:确保你使用的是
telematics_sdk
的最新版本,并查阅其官方文档以获取最新的API和初始化方法。 - 初始化参数:上述代码中的
apiKey
和userId
是示例参数,你需要根据实际情况替换为有效的值。 - 命令和参数:
sendVehicleCommand
方法中的命令和参数是示例,你需要根据telematics_sdk
的文档发送正确的命令和参数。 - 错误处理:在实际项目中,你需要添加更多的错误处理逻辑以确保应用的稳定性。
- UI更新:上述代码在接收到车辆状态变化或位置更新时只是简单地打印了日志,你可以根据需要更新UI或执行其他操作。
希望这个示例能帮助你快速上手telematics_sdk
的使用。如果你有任何其他问题或需要进一步的帮助,请随时提问。