Flutter通信插件carp_communication_package的使用

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

Flutter通信插件carp_communication_package的使用

本库包含一个用于通信采样的包,旨在与 carp_mobile_sensing 包一起工作。该包支持以下 Measure 类型的采样:

  • dk.cachet.carp.phone_log - 电话日志。
  • dk.cachet.carp.text_message_log - 短信(SMS)日志。
  • dk.cachet.carp.text_message - 接收的短信(SMS)。
  • dk.cachet.carp.calendar - 所有日历条目。

注意,电话和短信数据的收集仅在Android上受支持。

安装

要使用此包,请将其添加到您的 pubspec.yaml 文件中。请注意,该包仅在与 carp_mobile_sensing 一起使用时有效。

dependencies:
  carp_mobile_sensing: ^latest
  carp_communication_package: ^latest

Android集成

在您的应用的 AndroidManifest.xml 文件中添加以下内容(位于 android/app/src/main 目录下):

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

  ...
   
  <!-- 以下权限用于CARP移动感知 -->
  <uses-permission android:name="android.permission.CALL_PHONE"/>
  <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
  <uses-permission android:name="android.permission.READ_PHONE_NUMBERS"/>
  <uses-permission android:name="android.permission.READ_SMS"/>
  <uses-permission android:name="android.permission.RECEIVE_SMS"/>
  <uses-permission android:name="android.permission.READ_CALENDAR"/>
  <!-- 即使我们只想读取日历,出于某些未知原因,还需要添加写入权限 -->
  <uses-permission android:name="android.permission.WRITE_CALENDAR"/>

  <application>
   ...
   ...
    <!-- 注册广播接收器以监听应用在后台时收到的短信 -->
    <receiver android:name="com.shounakmulay.telephony.sms.IncomingSmsReceiver"
      android:permission="android.permission.BROADCAST_SMS" android:exported="true">
     <intent-filter>
         <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
       </intent-filter>
    </receiver>

   </application>
</manifest>

iOS集成

Info.plist 文件中(位于 ios/Runner 目录下)添加以下内容:

<key>NSCalendarsUsageDescription</key>
<string>INSERT_REASON_HERE</string>

使用它

要使用此包,请将其导入到您的应用中,并与 carp_mobile_sensing 包一起使用。

import 'package:carp_core/carp_core.dart';
import 'package:carp_mobile_sensing/carp_mobile_sensing.dart';
import 'package:carp_communication_package/communication.dart';

在创建并运行研究之前,需要在 SamplingPackageRegistry 中注册此包。

SamplingPackageRegistry().register(CommunicationSamplingPackage());

可以像这样将通信测量添加到研究协议中。

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

// 定义用于数据收集的设备
// 在这种情况下,只有这台智能手机
Smartphone phone = Smartphone();
protocol.addPrimaryDevice(phone);

// 添加一个自动任务,连续收集短信(SMS)
protocol.addTaskControl(
    ImmediateTrigger(),
    BackgroundTask(
        measures: [Measure(type: CommunicationSamplingPackage.TEXT_MESSAGE)]),
    phone);

// 添加一个每3小时收集一次的自动任务,收集:
//  * 进出短信(SMS)
//  * 进出电话记录
//  * 日历条目
protocol.addTaskControl(
    PeriodicTrigger(period: const Duration(hours: 3)),
    BackgroundTask(measures: [
      Measure(type: CommunicationSamplingPackage.PHONE_LOG),
      Measure(type: CommunicationSamplingPackage.TEXT_MESSAGE_LOG),
      Measure(type: CommunicationSamplingPackage.CALENDAR),
    ]),
    phone);

示例代码

以下是一个简单的示例,展示了如何使用此采样包与 CARP Mobile Sensing 一起工作。

import 'package:carp_core/carp_core.dart';
import 'package:carp_mobile_sensing/carp_mobile_sensing.dart';
import 'package:carp_communication_package/communication.dart';

/// 这是一个非常简单的示例,展示了如何使用此采样包与CARP Mobile Sensing (CAMS)一起工作。
/// 注意,下面的代码无法直接运行。
/// 有关如何使用CARP Mobile Sensing的文档,请访问:https://github.com/cph-cachet/carp.sensing-flutter/wiki
void main() async {
  // 在使用其测量值之前,注册此采样包
  SamplingPackageRegistry().register(CommunicationSamplingPackage());

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

  // 定义用于数据收集的设备
  // 在这种情况下,只有这台智能手机
  Smartphone phone = Smartphone();
  protocol.addPrimaryDevice(phone);

  // 添加一个自动任务,连续收集短信(SMS)
  protocol.addTaskControl(
      ImmediateTrigger(),
      BackgroundTask(
          measures: [Measure(type: CommunicationSamplingPackage.TEXT_MESSAGE)]),
      phone);

  // 添加一个自动任务,每3小时收集一次:
  //  * 进出短信(SMS)
  //  * 进出电话记录
  //  * 日历条目
  protocol.addTaskControl(
      PeriodicTrigger(period: const Duration(hours: 3)),
      BackgroundTask(measures: [
        Measure(type: CommunicationSamplingPackage.PHONE_LOG),
        Measure(type: CommunicationSamplingPackage.TEXT_MESSAGE_LOG),
        Measure(type: CommunicationSamplingPackage.CALENDAR),
      ]),
      phone);
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用carp_communication_package插件的代码示例。假设这个插件提供了基础的发送和接收消息的功能。请注意,具体的API和方法名可能需要根据实际的插件文档进行调整。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加carp_communication_package的依赖:

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

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

2. 导入插件

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

import 'package:carp_communication_package/carp_communication_package.dart';

3. 初始化插件

通常在应用的入口文件(如main.dart)中进行插件的初始化:

void main() {
  // 初始化插件(如果需要)
  CarpCommunication.initialize();
  
  runApp(MyApp());
}

4. 使用插件发送和接收消息

以下是一个简单的示例,展示如何使用插件发送和接收消息:

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

void main() {
  CarpCommunication.initialize();
  runApp(MyApp());
}

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

class CommunicationScreen extends StatefulWidget {
  @override
  _CommunicationScreenState createState() => _CommunicationScreenState();
}

class _CommunicationScreenState extends State<CommunicationScreen> {
  final TextEditingController _messageController = TextEditingController();
  String _receivedMessage = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Communication Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _messageController,
              decoration: InputDecoration(
                labelText: 'Enter message',
              ),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                sendMessage(_messageController.text);
                _messageController.clear();
              },
              child: Text('Send Message'),
            ),
            SizedBox(height: 16),
            Text(
              'Received Message: $_receivedMessage',
              style: TextStyle(fontSize: 18),
            ),
          ],
        ),
      ),
    );
  }

  void sendMessage(String message) {
    // 发送消息(假设插件提供了一个send方法)
    CarpCommunication.sendMessage(message).then((response) {
      // 处理发送响应(如果有)
      print('Message sent successfully: $response');
    }).catchError((error) {
      // 处理发送错误
      print('Error sending message: $error');
    });
  }

  // 监听接收到的消息(假设插件提供了消息监听功能)
  @override
  void initState() {
    super.initState();
    CarpCommunication.addMessageListener((message) {
      setState(() {
        _receivedMessage = message;
      });
    });
  }

  @override
  void dispose() {
    // 移除消息监听器
    CarpCommunication.removeMessageListener();
    super.dispose();
  }
}

注意事项

  1. 插件API:上面的代码是基于假设的插件API编写的。实际使用时,请查阅carp_communication_package的官方文档,了解具体的API和使用方法。
  2. 错误处理:在实际应用中,应添加更多的错误处理和用户反馈机制。
  3. 权限:如果插件需要特定的权限(如网络访问),请确保在AndroidManifest.xmlInfo.plist中正确配置。

希望这个示例能帮助你开始使用carp_communication_package插件。如果有任何进一步的问题,请查阅插件的官方文档或联系插件的维护者。

回到顶部