Flutter网络连接状态检测插件carp_connectivity_package的使用

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

Flutter网络连接状态检测插件carp_connectivity_package的使用

此库包含一个采样包,用于收集与连接相关的度量,以配合carp_mobile_sensing框架工作。此包支持以下度量类型:

  • dk.cachet.carp.wifi
  • dk.cachet.carp.connectivity
  • dk.cachet.carp.bluetooth

更多文档请参见Wiki

有隐私保护功能,包括对WiFi和蓝牙名称的默认隐私模式。

安装

要使用此包,请在你的pubspec.yaml文件中添加以下依赖项。请注意,此包仅与carp_mobile_sensing一起使用。

dependencies:
  flutter:
    sdk: flutter
  carp_mobile_sensing: ^latest
  carp_connectivity_package: ^latest

Android集成

从Android 10(API级别29)开始,访问WiFi信息需要不同的权限设置。对于Android >= 10,需要ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION权限。对于Android >= 12(API级别31),确保应用具有ACCESS_NETWORK_STATE权限。

在你的应用的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 Connectivity 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_NETWORK_STATE"/>

</manifest>

注意:从Android 8(SDK 26)开始,后台应用程序不会收到网络连接状态的变化通知。因此,只有当您的应用处于恢复状态时,才会收集连接状态。

iOS集成

从iOS >= 13 开始,不再可以访问WiFi信息。

要启用蓝牙跟踪,在Info.plist文件中添加这些权限:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>Bluetooth needed</string>
<key>UIBackgroundModes</key>
  <array>
  <string>bluetooth-central</string>
  <string>bluetooth-peripheral</string>
  <string>external-accessory</string>
  <string>fetch</string>
</array>

注意:在iOS上,无法在屏幕关闭或应用在后台时进行常规的蓝牙扫描。这将导致扫描结果为空。因此,蓝牙设备仅在应用处于前台时被收集。

使用

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

import 'package:carp_core/carp_core.dart';
import 'package:carp_mobile_sensing/carp_mobile_sensing.dart';
import 'package:carp_connectivity_package/connectivity.dart';

在创建并运行研究之前,注册此包:

SamplingPackageRegistry().register(ConnectivitySamplingPackage());

收集连接度量可以像这样添加到研究协议中:

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

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

// 添加一个自动任务,立即开始收集连接状态、附近的蓝牙设备和WiFi信息。
protocol.addTaskControl(
    ImmediateTrigger(),
    BackgroundTask(measures: [
      Measure(type: ConnectivitySamplingPackage.CONNECTIVITY),
      Measure(type: ConnectivitySamplingPackage.BLUETOOTH),
      Measure(type: ConnectivitySamplingPackage.WIFI),
    ]),
    phone);

示例代码

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

import 'package:carp_core/carp_core.dart';
import 'package:carp_mobile_sensing/carp_mobile_sensing.dart';
import 'package:carp_connectivity_package/connectivity.dart';

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

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

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

  // 添加一个自动任务,立即开始收集连接状态、附近的蓝牙设备和WiFi信息。
  protocol.addTaskControl(
      ImmediateTrigger(),
      BackgroundTask(measures: [
        Measure(type: ConnectivitySamplingPackage.CONNECTIVITY),
        Measure(type: ConnectivitySamplingPackage.BLUETOOTH),
        Measure(type: ConnectivitySamplingPackage.WIFI),
      ]),
      phone);
}

更多关于Flutter网络连接状态检测插件carp_connectivity_package的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络连接状态检测插件carp_connectivity_package的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用carp_connectivity_package插件来检测网络连接状态的示例代码。这个插件是CARP(Continuous Assessment in Real-life and Psychological)生态系统的一部分,通常用于健康与福祉应用中,但也可以用于任何需要网络连接状态监控的场景。

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

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

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

接下来,你可以在你的Flutter应用中导入并使用这个插件。以下是一个简单的示例,展示如何检测网络连接状态的变化:

import 'package:flutter/material.dart';
import 'package:carp_connectivity_package/carp_connectivity.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _connectivityStatus = 'Unknown';

  @override
  void initState() {
    super.initState();
    // 初始化ConnectivityService并监听网络连接状态变化
    ConnectivityService().connectivitySubject.listen((ConnectivityStatus status) {
      setState(() {
        _connectivityStatus = describeEnum(status);
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('网络连接状态检测'),
        ),
        body: Center(
          child: Text('当前网络连接状态: $_connectivityStatus'),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 导入carp_connectivity_package包。
  2. 创建一个Flutter应用,其中包含一个显示网络连接状态的文本。
  3. initState方法中,初始化ConnectivityService并监听其connectivitySubject流。每当网络连接状态发生变化时,更新UI以显示新的状态。
  4. 使用describeEnum函数将ConnectivityStatus枚举转换为字符串,以便在UI中显示。

请注意,carp_connectivity_package可能不是官方Flutter社区中广为人知的插件,因此在实际使用时,你可能需要参考该插件的官方文档或源代码以获取更多详细信息和最新API。如果插件的API有所变化,上述代码可能需要进行相应的调整。

回到顶部