Flutter上下文管理插件carp_context_package的使用

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

Flutter上下文管理插件carp_context_package的使用

简介

CARP Context Sampling Package 是一个用于收集上下文数据的库,它与 CARP Mobile Sensing (CAMS) 框架协同工作。此包支持以下 Measure 类型的数据采集:

  • dk.cachet.carp.activity
  • dk.cachet.carp.location
  • dk.cachet.carp.currentlocation
  • dk.cachet.carp.geofence
  • dk.cachet.carp.mobility
  • dk.cachet.carp.weather
  • dk.cachet.carp.air_quality

更多文档和可用的 Measure 类型请参阅 wiki,以及如何在Flutter中构建移动感知应用的示例,请参考 CARP Mobile Sensing App

安装

要使用此包,需在项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  carp_mobile_sensing: ^latest_version
  carp_context_package: ^latest_version

注意:确保同时安装了 carp_mobile_sensing 包,因为它们是协同工作的。

权限配置

Android

需要在 android/app/src/main/AndroidManifest.xml 文件中添加权限声明:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="<your_package_name>"
    xmlns:tools="http://schemas.android.com/tools">

   ...
   
    <!-- The following permissions are used in the Context Package -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    <!-- For Android 9 (API 28 and earlier), use: -->
    <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
    <!-- for Android 10 (API 29 and later), use: -->
    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />

</manifest>

iOS

iOS 需要设置最低部署目标为 iOS 13.0 或更高版本,并启用来自 permission_handler 插件的宏定义。修改 ios/Podfile 中的 post_install 部分如下:

platform :ios, '14.0'


...

post_install do |installer|
  installer.generated_projects.each do |project|
    project.targets.each do |target|
      target.build_configurations.each do |config|
          config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0'
      end
    end
  end
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)

    target.build_configurations.each do |config|
      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
        '$(inherited)',
        # See https://pub.dev/packages/permission_handler#setup - under iOS setup

        # the app uses the following permissions:
        'PERMISSION_LOCATION=1',      # Location access
        'PERMISSION_NOTIFICATIONS=1', # CARP Mobile Sensing uses notifications
        'PERMISSION_SENSORS=1',       # Core Motion sensors on iOS (pedometer)
      ]
    end
  end
end

并且,在 Info.plist 文件中添加必要的权限声明:

<key>NSLocationWhenInUseUsageDescription</key>
<string>Uses the location API to record location.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Uses the location API to record location.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Uses the location API to record location.</string>
<key>NSMotionUsageDescription</key>
<string>Detects activity.</string>
<key>UIBackgroundModes</key>
  <array>
    <string>fetch</string>
    <string>location</string>
  </array>

最后,确保激活 Background mode。打开 XCode 并进入 “Signing & Capabilities”,添加 “Background Modes” 并选择 “Location updates”。

使用方法

首先导入必要的包:

import 'package:carp_core/carp_core.dart';
import 'package:carp_mobile_sensing/carp_mobile_sensing.dart';
import 'package:carp_context_package/context.dart';

然后注册这个采样包到 SamplingPackageRegistry 中:

SamplingPackageRegistry().register(ContextSamplingPackage());

接下来可以根据需求创建研究协议并添加任务控制。以下是几个具体的例子:

Activity Measure 示例

// 创建研究协议
StudyProtocol protocol = StudyProtocol(
  ownerId: 'owner@dtu.dk',
  name: 'Context Sensing Example',
);

// 定义智能手机作为主设备
Smartphone phone = Smartphone();
protocol.addPrimaryDevice(phone);

// 添加后台任务以从手机收集活动数据
protocol.addTaskControl(
    ImmediateTrigger(),
    BackgroundTask(measures: [
      Measure(type: ContextSamplingPackage.ACTIVITY),
    ]),
    phone);

Location Measures 示例

// 定义在线位置服务并将其作为“连接设备”添加
final locationService = LocationService(
    accuracy: GeolocationAccuracy.high,
    distance: 10,
    interval: const Duration(minutes: 1));

protocol.addConnectedDevice(locationService, phone);

// 添加后台任务定期收集当前位置
protocol.addTaskControl(
    PeriodicTrigger(period: Duration(minutes: 5)),
    BackgroundTask(measures: [
      Measure(type: ContextSamplingPackage.CURRENT_LOCATION),
    ]),
    locationService);

Weather 和 Air Quality Measures 示例

// 定义在线天气服务并将其作为“设备”添加
final weatherService = WeatherService(apiKey: 'OW_API_key_goes_here');
protocol.addConnectedDevice(weatherService, phone);

// 添加后台任务每30分钟收集一次天气数据
protocol.addTaskControl(
    PeriodicTrigger(period: Duration(minutes: 30)),
    BackgroundTask(measures: [
      Measure(type: ContextSamplingPackage.WEATHER),
    ]),
    weatherService);

// 定义在线空气质量服务并将其作为“设备”添加
final airQualityService = AirQualityService(apiKey: 'WAQI_API_key_goes_here');
protocol.addConnectedDevice(airQualityService, phone);

// 添加后台任务每30分钟收集一次空气质量数据
protocol.addTaskControl(
    PeriodicTrigger(period: Duration(minutes: 30)),
    BackgroundTask(measures: [
      Measure(type: ContextSamplingPackage.AIR_QUALITY),
    ]),
    airQualityService);

以上就是如何在Flutter项目中使用 carp_context_package 的详细说明和示例代码。希望这些信息对您有所帮助!如果有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter上下文管理插件carp_context_package的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter上下文管理插件carp_context_package的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter上下文管理插件carp_context_package的代码示例。请注意,由于我无法实时验证外部插件的API和版本变化,以下代码基于插件的一般使用方式和假设的API设计。如果插件的API有变化,请参考插件的官方文档。

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

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

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

接下来,我们来看一个如何使用carp_context_package进行上下文管理的示例。

1. 初始化上下文管理器

在你的应用的入口文件(通常是main.dart)中,初始化上下文管理器:

import 'package:flutter/material.dart';
import 'package:carp_context_package/carp_context.dart';  // 假设这是插件的导入路径

void main() {
  // 初始化上下文管理器
  CarpContext.instance.init();

  runApp(MyApp());
}

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

2. 设置和获取上下文数据

在需要管理上下文的组件中,使用CarpContext来设置和获取数据。

import 'package:flutter/material.dart';
import 'package:carp_context_package/carp_context.dart';  // 假设这是插件的导入路径

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  void _setContextData() {
    // 设置上下文数据
    CarpContext.instance.setData('user', {'name': 'John Doe', 'age': 30});
  }

  void _getContextData() {
    // 获取上下文数据
    final userData = CarpContext.instance.getData('user');
    print('User Data: ${userData}');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Context Management Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _setContextData,
              child: Text('Set Context Data'),
            ),
            ElevatedButton(
              onPressed: _getContextData,
              child: Text('Get Context Data'),
            ),
          ],
        ),
      ),
    );
  }
}

3. 监听上下文变化(可选)

如果你需要监听上下文数据的变化,可以使用CarpContext提供的监听功能。

import 'package:flutter/material.dart';
import 'package:carp_context_package/carp_context.dart';  // 假设这是插件的导入路径

class _MyHomePageState extends State<MyHomePage> {

  // 监听上下文变化
  void _addListener() {
    CarpContext.instance.addListener('user', (newData) {
      print('User Data Updated: ${newData}');
      // 更新UI等操作
      setState(() {
        // 例如,更新UI状态
      });
    });
  }

  @override
  void initState() {
    super.initState();
    _addListener();  // 在组件初始化时添加监听器
  }

  @override
  Widget build(BuildContext context) {
    // ...(与之前相同)
  }
}

请注意,上述代码是假设性的,并且基于一般的上下文管理插件的使用方式。具体的API和方法可能会根据carp_context_package插件的实际实现有所不同。因此,强烈建议查阅插件的官方文档和示例代码以获取最准确的信息。

回到顶部