Flutter行程分析插件flutter_drivekit_trip_analysis的使用

Flutter行程分析插件flutter_drivekit_trip_analysis的使用

安装

要使用此插件,请在项目中运行以下命令:

flutter pub add drivekit_trip_analysis

现在,您可以导入 package:flutter_drivekit_trip_analysis/flutter_drivekit_trip_analysis.dart 并在Dart代码中使用 DriveKitTripAnalysis

使用

您需要安装 flutter_drivekit_core 插件,并按照说明指定API密钥和用户标识符。然后,您可以开始使用DriveKit行程分析插件。例如,您可以激活自动启动模式,如下所示:

await DriveKitTripAnalysis.instance.activateAutoStart(true);

请参阅DriveKit行程分析文档以获取更多关于我们提供的功能的信息。

手动初始化

如果您已禁用DriveKit自动初始化:

Android项目

在您的 MainApplication 类中调用 DriveKitTripAnalysis 类的 initialize 方法。

// MainApplication.kt

// …
override fun onCreate() {
    super.onCreate()
    DriveKit.initialize()

    val tripNotification: TripNotification = ...
    DriveKitTripAnalysis.initialize(tripNotification)

    // 初始化其他您使用的DriveKit模块:
    // DriveKitDriverData.initialize()
    // 等等。
}

iOS项目

在您的 AppDelegate 中调用 initialize 方法。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    DriveKit.shared.initialize()
    DriveKitTripAnalysis.shared.initialize(appLaunchOptions: launchOptions)
    (…)
}

API

方法 返回类型 iOS Android
isAutoStartActivated Future<bool>
activateAutoStart Future<void>
startTrip Future<void>
stopTrip Future<void>
cancelTrip Future<void>
isTripRunning Future<bool>
setCustomTimeOut Future<void>
addTripListener Future<void>
removeTripListener Future<void>
removeAllTripListeners Future<void>
isCrashDetectionActivated Future<bool>
activateCrashDetection Future<void>
isMonitoringPotentialTripStart Future<bool>
setMonitorPotentialTripStart Future<void>
setVehicle Future<bool>
getTripMetadata Future<Map<String, String>?
updateTripMetadata Future<void>
deleteTripMetadata Future<void>
deleteAllTripMetadata Future<void>
getCurrentTripInfo Future<CurrentTripInfo?>
getLastTripLocation Future<LastTripLocation?>

isAutoStartActivated

Future<bool> isAutoStartActivated();

此方法返回 true 如果启用了自动启动。

final isAutoStartActivated = await DriveKitTripAnalysis.instance.isAutoStartActivated();

activateAutoStart

Future<void> activateAutoStart(bool activate);

自动模式检测车辆移动并触发行程分析,无需驾驶员干预,同时应用程序处于后台。分析会在行程结束时自动停止。

此功能推荐用于避免驾驶时分散注意力和处理手机。自动模式经过优化,以限制电池消耗。

默认情况下,自动启动是禁用的。要启用自动行程检测模式,请调用以下方法:

await DriveKitTripAnalysis.instance.activateAutoStart(true);

要禁用自动行程检测,请将参数设置为 false

await DriveKitTripAnalysis.instance.activateAutoStart(false);

⚠️ 如果在禁用自动行程检测时行程正在进行,则行程不会被取消。如果要取消行程,还应调用 cancelTrip 方法。

startTrip

Future<void> startTrip();

您可以调用以下方法开始行程:

await DriveKitTripAnalysis.instance.startTrip();

ℹ️ 如果行程已经开始了,调用此方法将不起作用。

stopTrip

Future<void> stopTrip();

您可以调用以下方法停止行程。行程会立即停止:

await DriveKitTripAnalysis.instance.stopTrip();

ℓ 如果车辆停止时间超过配置的超时时间,行程将自动停止。

ℓ 如果没有进行中的行程,调用此方法将不起作用。

cancelTrip

Future<void> cancelTrip();

如果要取消行程,可以调用此方法:

await DriveKitTripAnalysis.instance.cancelTrip();

isTripRunning

Future<bool> isTripRunning();

此方法返回 false 如果SDK处于 INACTIVE 状态且没有行程正在运行。

final isTripRunning = await DriveKitTripAnalysis.instance.isTripRunning();

setCustomTimeOut

Future<void> setStopTimeOut(int timeOut)

一个正在分析的行程会在一段时间的不活动后自动停止(从车辆停止时开始)。DriveQuant SDK允许设置行程结束的时间。

默认情况下,行程分析在240秒后停止。您可以根据需要调整该值,并选择120到480秒之间的任何整数值。调用以下方法:

await DriveKitTripAnalysis.instance.setStopTimeOut(123);

ℓ 如果设置了大于 480 的值,该值将被强制设置为 480

ℓ 如果设置了小于 120 的值,该值将被强制设置为 120

addTripListener

TripListener 接口提供了关于行程分析有用的信息和事件。

例如,您可以使用以下方法来了解行程分析何时开始、完成、取消、何时检测到碰撞等:

void addTripListener(TripListener listener);

TripListener 接口包含多个需要实现的方法:

方法 描述
tripRecordingStarted 当行程记录开始时立即调用。此回调在调用DriveKit SDK的 startTrip() 方法或自动行程检测之后触发。DKTripRecordingStartedState 对象描述见这里
tripRecordingConfirmed 每次行程确认时调用。DKTripRecordingConfirmedState 对象描述见这里
tripRecordingCanceled 当行程记录被取消时调用。DKTripRecordingCanceledState 指示哪个事件取消了行程。DKTripRecordingCanceledState 对象描述见这里
tripRecordingFinished 当行程记录结束时调用,在发送行程数据到DriveQuant服务器之前。DKTripRecordingFinishedState 对象描述见这里
tripPoint 当行程开始并确认时,每条由SDK记录的GPS点都会调用。
tripSavedForRepost 如果在行程结束时,行程可以发送到DriveQuant的服务器进行分析,SDK将保存行程并稍后发送。
tripFinished 当SDK记录行程并发送到DriveQuant的服务器进行分析时调用。TripResponseStatus 对象包含行程响应状态详细信息。更多信息见这里
potentialTripStart 每次潜在行程开始时调用。StartMode 表示哪个事件开始潜在行程。
beaconDetected 当SDK中设置的信标被检测到时调用。
significantLocationChangeDetected 仅限iOS。当检测到用户重要位置变化时调用。
sdkStateChanged 每次SDK状态改变时调用,带有新的 State 作为参数
crashDetected 当检测到碰撞事件时调用。仅当启用了碰撞检测时触发。
crashFeedbackSent 当启用了碰撞反馈并且检测到确认的碰撞时调用。仅当启用了碰撞检测并且配置了反馈时触发。
tripStarted (废弃) 每次行程开始时调用。StartMode 表示哪个事件开始行程。
tripCancelled (废弃) 当行程被取消时调用。CancelTrip 表示哪个事件取消了行程。

有关所有可能值的更多信息,请参阅本地文档:Android / iOS

removeTripListener

您可以使用以下方法移除特定的 TripListener

void removeTripListener(TripListener listener);

removeAllTripListeners

您可以使用以下方法移除所有注册的 TripListener

void removeAllTripListeners();

isCrashDetectionActivated

Future<bool> isCrashDetectionActivated();

此方法返回 true 如果启用了碰撞检测。

final isCrashDetectionActivated = await DriveKitTripAnalysis.instance.isCrashDetectionActivated();

activateCrashDetection

碰撞检测功能包括在DriveKit行程分析组件中,能够收集和分析智能手机传感器数据,自动检测汽车事故的发生。

了解更多功能详情:iOS / Android

DriveKitTripAnalysis有一个输入参数可用于启用或禁用该功能:

Future<void> activateCrashDetection(bool activate);

要启用碰撞检测,请将参数设为 true

await DriveKitTripAnalysis.instance.activateCrashDetection(true);

要禁用碰撞检测,请将参数设为 false

await DriveKitTripAnalysis.instance.activateCrashDetection(false);

isMonitoringPotentialTripStart

Future<bool> isMonitoringPotentialTripStart();

使用以下命令检查功能是否已激活:

final isMonitoringPotentialTripStart = await DriveKitTripAnalysis.instance.isMonitoringPotentialTripStart();

setMonitorPotentialTripStart

Future<void> setMonitorPotentialTripStart(bool activate);

DriveKit的自动启动模式会检测行程并立即开始记录。这种操作模式可能并不适用于所有用例。

您的应用可能需要其他信息或业务逻辑才能启用行程记录。例如,可能需要检查:

  • 是否有连接设备靠近智能手机。
  • 该行程记录是否在给定的时间段内可接受。

在这种情况下,您可能希望订阅那些指示行程可能开始的事件,但不一定启动GPS传感器和行程分析。

这就是为什么DriveKit允许您订阅那些指示行程可能开始的触发事件。

了解更多功能详情:iOS / Android

默认情况下,该配置是禁用的。调用以下方法将参数设为 true 来启用它。

await DriveKitTripAnalysis.instance.setMonitorPotentialTripStart(true);

要禁用该功能,请将参数设为 false

await DriveKitTripAnalysis.instance.setMonitorPotentialTripStart(false);

setVehicle

Future<void> setVehicle(Vehicle vehicle);

为了获得更精确的驾驶行为分析,建议配置驾驶员所使用的车辆。通过调用以下方法可以做到这一点:

await DriveKitTripAnalysis.instance.setVehicle(
  const Vehicle(
    carTypeIndex: 2,
    carEngineIndex: 2,
    carPower: 200,
    carMass: 1500,
    carGearboxIndex: 3,
    carConsumption: 6.5,
    carAutoGearboxNumber: 1,
    engineDisplacement: 1500,
    carPassengers: 2,
    length: 4.7,
    width: 1.9,
    height: 1.5,
    engineCylinderNb: 6,
    driveWheels: 1,
  ),
);

车辆参数的详细描述见这里

ℓ 如果未配置车辆,将使用默认车辆,其参数如下:

carTypeIndex = 1

carEngineIndex = 1

carPower = 150

carMass = 1400

carGearboxIndex = 2

carConsumption = 4.5

engineDisplacement = 1200

frontTireSize = “205/55/16”

rearTireSize = “205/55/16”

length = 4.5

width = 1.8

height = 1.45

engineCylinderNb = 4

driveWheels = 0

getTripMetadata

Future<Map<String, String>?> getTripMetadata()

要获取配置的元数据副本,请调用以下方法:

final tripMetadata = await DriveKitTripAnalysis.instance.getTripMetadata();

ℓ 对返回对象的任何修改都不会影响与行程一起发送的元数据。

setTripMetadata

Future<void> setTripMetadata(Map<String, String>? metadata)

可以为行程添加一些元数据。

const tripMetadata = {
  'key1': 'value1',
  'key2': 'value2',
};
await DriveKitTripAnalysis.instance.setTripMetadata(tripMetadata);

元数据必须表示为键/值对的对象,其中键和值都是字符串类型。 可以在行程结束前的任何时候设置元数据。

ℓ 如果发送了元数据,它也会添加到推送数据请求的metaData字段中。

updateTripMetadata

Future<void> updateTripMetadata(String key, String? value)

可以更新特定键的元数据值。

await DriveKitTripAnalysis.instance.updateTripMetadata('key', 'newValue');

deleteTripMetadata

Future<void> deleteTripMetadata(String key)

可以删除特定键的元数据值。

await DriveKitTripAnalysis.instance.deleteTripMetadata('key');

deleteAllTripMetadata

Future<void> deleteAllTripMetadata()

可以删除所有行程元数据。

await DriveKitTripAnalysis.instance.deleteAllTripMetadata();

getCurrentTripInfo

Future<CurrentTripInfo?> getCurrentTripInfo()

当行程分析开始时,您可能需要一些关于它的信息,如触发行程记录的 StartMode、本地唯一标识符等。

await DriveKitTripAnalysis.instance.getCurrentTripInfo();

如果行程没有运行,该方法将返回 null。否则,返回以下数据:

字段 类型 描述
localTripId String DriveKit SDK生成的本地唯一行程标识符。⚠️ 这与 itinId 属性不同,后者是在数据分析后生成的唯一行程标识符。
date String 行程记录的开始日期。⚠️ 这与 startDate 属性不同,后者是在 Trip 对象中返回的。
startMode StartMode 触发行程记录的 StartMode

getLastTripLocation

Future<LastTripLocation?> getLastTripLocation()

此函数返回用户最后一次行程的结束位置。

位置由GPS坐标(纬度和经度)、行程结束日期以及GPS读数的精度指标定义。

您可以使用行程结束时的坐标用于多种目的,例如:

  • 帮助用户找到他们的车辆。
  • 通知客户用户已到达特定目的地。
  • 创建地理围栏以定位车辆。

ℓ 最后一次行程是指DriveKit SDK记录的最后行程,无论使用何种交通工具。

await DriveKitTripAnalysis.instance.getLastTripLocation();

如果用户未认证、未进行行程或者没有有效行程,该方法可能会返回 null。否则,返回以下数据:

字段 类型 描述
date String 行程结束日期。
latitude double 行程结束时的纬度。
longitude double 行程结束时的经度。
accuracymeter double GPS数据精度值(单位:米)。
accuracyLevel AccuracyLevel GPS数据精度级别。可能的值如下所述。

AccuracyLevel

名称 描述
good GPS精度严格低于10米。
fair GPS精度在10到30米之间。
poor GPS精度严格高于30米。

示例代码

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(home: HomePage());
  }
}

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

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('DriveKitTripAnalysis Example')),
      body: const Column(
        children: [
          Text('请参考主flutter示例SDK'),
          Text(
            'https://github.com/DriveQuantPublic/flutter-drivekit/tree/main/example',
          ),
        ],
      ),
    );
  }
}

更多关于Flutter行程分析插件flutter_drivekit_trip_analysis的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter行程分析插件flutter_drivekit_trip_analysis的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 flutter_drivekit_trip_analysis 插件的示例代码案例。这个插件假设是用来分析行程数据的,虽然具体功能和API可能因插件版本而异,但以下代码提供了一个基本的框架,展示了如何集成和使用该插件进行行程分析。

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

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

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

接下来,在你的 Flutter 项目中,你可以按照以下步骤使用 flutter_drivekit_trip_analysis 插件:

1. 导入插件

在你的 Dart 文件中导入插件:

import 'package:flutter_drivekit_trip_analysis/flutter_drivekit_trip_analysis.dart';

2. 初始化插件

通常,你可能需要在应用启动时初始化插件。这可以在你的主文件中完成,例如在 main.dart 中:

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

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

3. 使用插件进行行程分析

假设你有一个行程数据对象,你可以使用插件提供的方法来分析这些数据。以下是一个简单的例子,展示如何创建一个行程对象并进行分析:

class TripAnalysisScreen extends StatefulWidget {
  @override
  _TripAnalysisScreenState createState() => _TripAnalysisScreenState();
}

class _TripAnalysisScreenState extends State<TripAnalysisScreen> {
  TripAnalysisResult? analysisResult;

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

  Future<void> _performTripAnalysis() async {
    // 假设你有一个行程数据对象,这里用示例数据代替
    final tripData = TripData(
      startLocation: Location(latitude: 37.7749, longitude: -122.4194), // 旧金山
      endLocation: Location(latitude: 34.0522, longitude: -118.2437),   // 洛杉矶
      startTime: DateTime.now().subtract(Duration(hours: 2)),
      endTime: DateTime.now(),
      // 其他行程相关数据...
    );

    try {
      final result = await FlutterDrivekitTripAnalysis.analyzeTrip(tripData);
      setState(() {
        analysisResult = result;
      });
    } catch (e) {
      print('Error analyzing trip: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Trip Analysis'),
      ),
      body: Center(
        child: analysisResult != null
            ? Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text('Distance: ${analysisResult!.distance} km'),
                  Text('Duration: ${analysisResult!.duration} minutes'),
                  // 显示其他分析结果...
                ],
              )
            : CircularProgressIndicator(),
      ),
    );
  }
}

// 假设的行程数据模型
class TripData {
  final Location startLocation;
  final Location endLocation;
  final DateTime startTime;
  final DateTime endTime;
  // 其他行程数据字段...

  TripData({
    required this.startLocation,
    required this.endLocation,
    required this.startTime,
    required this.endTime,
    // 初始化其他字段...
  });
}

class Location {
  final double latitude;
  final double longitude;

  Location({required this.latitude, required this.longitude});
}

class TripAnalysisResult {
  final double distance;
  final int duration; // 假设以分钟为单位
  // 其他分析结果字段...

  TripAnalysisResult({required this.distance, required this.duration});
}

注意:上述代码中的 TripData, Location, 和 TripAnalysisResult 类是假设的,实际使用时你需要根据 flutter_drivekit_trip_analysis 插件提供的API和数据结构进行调整。同时,FlutterDrivekitTripAnalysis.analyzeTrip 方法也是假设的,你需要查阅插件的官方文档以获取正确的方法名和参数。

此外,由于 flutter_drivekit_trip_analysis 插件的具体实现和API可能有所不同,因此上述代码仅作为示例,实际使用时请根据插件的最新版本和文档进行调整。

回到顶部