Flutter上下文管理插件carp_context_package的使用
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
更多关于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
插件的实际实现有所不同。因此,强烈建议查阅插件的官方文档和示例代码以获取最准确的信息。