Flutter运动追踪插件motiontag_sdk的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter运动追踪插件motiontag_sdk的使用

概述

MOTIONTAG SDK Flutter Plugin 用于收集手机传感器数据,并以电池高效的方式将其传输到MOTIONTAG后端系统。该SDK支持iOS和Android平台,最低支持版本分别为API 23+(Android)和iOS 12.3+。

1. 安装

首先,在pubspec.yaml文件中添加motiontag_sdk作为依赖项:

dependencies:
  motiontag_sdk: ^latest_version

iOS

在应用委托的didFinishLaunchingWithOptions函数中初始化SDK,然后注册插件。确保在AppDelegate.swift中正确转发handleEventsForBackgroundURLSession调用。参考示例代码

Android

创建一个Application并在AndroidManifest.xml中注册它。在ApplicationonCreate回调中调用MotionTagWrapper.initialize()并提供必要的参数。参考示例代码

为了防止意外行为,建议禁用自动备份或排除SDK相关文件的备份。更多信息请参阅Android MOTIONTAG SDK文档

2. 权限管理

由于权限管理不在MOTIONTAG SDK范围内,应用程序需要在启动SDK之前获取用户权限。

iOS

在Xcode中添加以下功能:

  • 能力 -> 后台模式 -> 位置更新
  • Info.plist中添加以下键值对:
    • “Privacy - Motion Usage Description”
    • “Privacy - Location Always & When in Use Description”
    • “Privacy - When in Use Description”

如果使用permission_handler包,请确保在Podfile中添加相应的片段。

Android

在启动SDK前需要请求以下运行时权限:

  • android.permission.ACTIVITY_RECOGNITION
  • android.permission.ACCESS_FINE_LOCATION
  • android.permission.ACCESS_COARSE_LOCATION
  • android.permission.ACCESS_BACKGROUND_LOCATION

更多细节请参阅Android MOTIONTAG SDK文档

3. 使用

MotionTag类是SDK的主要入口点,包含以下公共方法:

import 'package:motiontag_sdk/motiontag.dart';

// 设置用户令牌
await MotionTag.setUserToken('your_jwt_token');

// 开始跟踪
await MotionTag.start();

// 停止跟踪
await MotionTag.stop();

// 获取当前是否正在跟踪
bool isTracking = await MotionTag.isTrackingActive();

// 清除未传输的数据
await MotionTag.clearData();

监听事件

设置观察者函数以接收SDK的相关事件通知:

MotionTag.setObserver((event) {
  if (event is StartedEvent) {
    print('Tracking started');
  } else if (event is StoppedEvent) {
    print('Tracking stopped');
  } else if (event is LocationEvent) {
    print('New location: ${event.location}');
  }
});

4. 用户认证

SDK必须在运行时配置用户特定的JWT令牌。更多信息请参阅AndroidiOS SDK文档。

5. 非标准后台进程限制(针对Android)

某些Android OEM厂商实施了非标准的后台进程限制。为确保SDK正常工作,建议开发者引导用户关闭电池优化设置。更多信息请参阅dontkillmyapp.com

示例Demo

以下是完整的Flutter示例项目结构:

import 'package:flutter/material.dart';
import 'package:motiontag_sdk/motiontag.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MOTIONTAG SDK Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'MOTIONTAG SDK Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  bool _isTracking = false;
  String _logMessage = '';

  void _startTracking() async {
    try {
      await MotionTag.setUserToken('your_jwt_token');
      await MotionTag.start();
      setState(() {
        _isTracking = true;
      });
      MotionTag.setObserver((event) {
        setState(() {
          _logMessage = event.toString();
        });
      });
    } catch (e) {
      setState(() {
        _logMessage = 'Error starting tracking: $e';
      });
    }
  }

  void _stopTracking() async {
    try {
      await MotionTag.stop();
      setState(() {
        _isTracking = false;
      });
    } catch (e) {
      setState(() {
        _logMessage = 'Error stopping tracking: $e';
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _isTracking ? null : _startTracking,
              child: Text('Start Tracking'),
            ),
            ElevatedButton(
              onPressed: _isTracking ? _stopTracking : null,
              child: Text('Stop Tracking'),
            ),
            Text(_logMessage),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用motiontag_sdk插件进行运动追踪的示例代码。motiontag_sdk是一个假设的Flutter插件,用于运动追踪功能。由于实际的motiontag_sdk插件可能并不存在或者其API可能有所不同,下面的代码是基于一个假设的API结构编写的。如果motiontag_sdk插件真实存在,请查阅其官方文档以获取准确的API说明。

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

dependencies:
  flutter:
    sdk: flutter
  motiontag_sdk: ^x.y.z  # 替换为实际版本号

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

接下来,你可以在你的Flutter项目中如下使用motiontag_sdk

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Motion Tracking Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MotionTrackingScreen(),
    );
  }
}

class MotionTrackingScreen extends StatefulWidget {
  @override
  _MotionTrackingScreenState createState() => _MotionTrackingScreenState();
}

class _MotionTrackingScreenState extends State<MotionTrackingScreen> {
  late MotionTagSdk _motionTagSdk;
  bool _isTracking = false;

  @override
  void initState() {
    super.initState();
    // 初始化MotionTagSdk
    _motionTagSdk = MotionTagSdk();
    // 请求权限(假设需要)
    _requestPermissions();
  }

  Future<void> _requestPermissions() async {
    // 假设有一个方法来请求必要的权限
    // 这取决于实际的插件API
    bool hasPermissions = await _motionTagSdk.requestPermissions();
    if (hasPermissions) {
      print("Permissions granted.");
    } else {
      print("Permissions denied.");
    }
  }

  Future<void> _startTracking() async {
    if (!_isTracking) {
      _isTracking = true;
      // 开始追踪
      _motionTagSdk.startTracking().then((trackingId) {
        print("Started tracking with ID: $trackingId");
        // 在这里可以添加逻辑来处理追踪数据
        _motionTagSdk.onTrackingDataReceived.listen((trackingData) {
          print("Received tracking data: $trackingData");
          // 更新UI或处理数据
          setState(() {}); // 如果需要更新UI,则调用此方法
        });
      }).catchError((error) {
        print("Error starting tracking: $error");
        _isTracking = false;
      });
    }
  }

  Future<void> _stopTracking() async {
    if (_isTracking) {
      _isTracking = false;
      // 停止追踪
      await _motionTagSdk.stopTracking();
      print("Stopped tracking.");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Motion Tracking Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              _isTracking ? 'Tracking...' : 'Not Tracking',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _isTracking ? _stopTracking : _startTracking,
              child: Text(_isTracking ? 'Stop Tracking' : 'Start Tracking'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    // 停止追踪并释放资源
    if (_isTracking) {
      _stopTracking();
    }
    _motionTagSdk.dispose();
    super.dispose();
  }
}

代码说明:

  1. 依赖添加:在pubspec.yaml文件中添加motiontag_sdk依赖。
  2. 初始化:在initState方法中初始化MotionTagSdk实例,并请求必要的权限。
  3. 追踪控制:提供_startTracking_stopTracking方法来控制追踪的开始和停止。
  4. 数据监听:使用_motionTagSdk.onTrackingDataReceived.listen来监听追踪数据的接收,并在接收到数据时更新UI或处理数据。
  5. UI更新:在UI中使用ElevatedButton来控制追踪的开始和停止,并使用Text组件显示当前追踪状态。
  6. 资源释放:在dispose方法中停止追踪并释放资源。

请注意,上述代码是一个假设性的示例,实际使用时需要根据motiontag_sdk插件的真实API进行调整。如果motiontag_sdk插件存在,请参考其官方文档以获取准确的使用方法和API说明。

回到顶部