Flutter应用包管理插件carp_apps_package的使用

Flutter应用包管理插件carp_apps_package的使用

本库包含一个用于应用相关采样的采样包,以配合carp_mobile_sensing框架使用。此包支持以下Measure类型:

  • dk.cachet.carp.apps - 手机上安装的应用列表。
  • dk.cachet.carp.appusage - 应用使用活动日志。

这些测量仅在Android设备上可用。

安装

要使用此包,请将以下内容添加到你的pubspec.yaml文件中。注意,此包只能与carp_mobile_sensing一起使用。

dependencies:
  flutter:
    sdk: flutter
  carp_core: ^latest
  carp_mobile_sensing: ^latest
  carp_apps_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">

   <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions"/>
   <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
   ...
</manifest>

从Android 11开始,针对API级别30的应用程序,如果想列出"外部"应用程序,则必须在其AndroidManifest.xml文件中声明一个新的"正常"权限,称为QUERY_ALL_PACKAGES

自2021年5月5日起,Google将对请求QUERY_ALL_PACKAGES的应用程序进行更改。引用文档中的内容:

允许使用的条件包括应用程序必须发现设备上的所有已安装应用程序,用于意识或互操作性目的,可能有资格获得该权限。允许的用途包括设备搜索、防病毒应用程序、文件管理器和浏览器等。

授予访问此权限的应用程序必须遵守用户数据政策,包括显著披露和同意要求,并且不得将其使用扩展到未披露或无效的目的。

iOS集成

不支持。

使用

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

import 'package:carp_core/carp_core.dart';
import 'package:carp_mobile_sensing/carp_mobile_sensing.dart';
import 'package:carp_apps_package/apps.dart';

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

SamplingPackageRegistry().register(AppsSamplingPackage());

可以像这样将APPSAPP_USAGE测量添加到研究协议中:

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

// 添加一个自动任务,收集安装的应用列表
// 和应用使用活动的日志
protocol.addTaskControl(
    ImmediateTrigger(),
    BackgroundTask(measures: [
      Measure(type: AppsSamplingPackage.APPS),
      Measure(type: AppsSamplingPackage.APP_USAGE),
    ]),
    phone);

示例代码

这是一个非常简单的示例,展示了如何使用此采样包与CARP Mobile Sensing(CAMS)一起使用。请注意,下面的代码不会运行。有关如何使用CAMS的详细信息,请参阅文档:CARP Mobile Sensing Wiki

import 'package:carp_core/carp_core.dart';
import 'package:carp_apps_package/apps.dart';
import 'package:carp_mobile_sensing/carp_mobile_sensing.dart';

void main() async {
  // 注册此采样包以使用其测量
  SamplingPackageRegistry().register(AppsSamplingPackage());

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

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

  // 添加一个自动任务,收集安装的应用列表
  // 和应用使用活动的日志
  protocol.addTaskControl(
      ImmediateTrigger(),
      BackgroundTask(measures: [
        Measure(type: AppsSamplingPackage.APPS),
        Measure(type: AppsSamplingPackage.APP_USAGE),
      ]),
      phone);
}

更多关于Flutter应用包管理插件carp_apps_package的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


在Flutter开发中,carp_apps_package 插件通常用于管理和操作应用包信息。虽然具体的使用细节可能会根据插件的版本和具体需求有所不同,但以下是一个基本示例,展示了如何在Flutter应用中使用 carp_apps_package 插件来获取应用包信息。

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

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

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

接下来,在你的 Dart 文件中导入该插件,并使用它来获取应用包信息。以下是一个简单的示例代码:

import 'package:flutter/material.dart';
import 'package:carp_apps_package/carp_apps_package.dart';  // 导入插件

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  String? packageName;
  String? versionName;
  int? versionCode;

  @override
  void initState() {
    super.initState();
    _fetchAppInfo();
  }

  Future<void> _fetchAppInfo() async {
    try {
      PackageInfo packageInfo = await PackageInfo.fromPlatform();
      setState(() {
        packageName = packageInfo.packageName;
        versionName = packageInfo.version;
        versionCode = packageInfo.buildNumber;
      });
    } catch (e) {
      print("Failed to fetch app info: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('App Info Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Package Name: $packageName',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            Text(
              'Version Name: $versionName',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            Text(
              'Version Code: $versionCode',
              style: TextStyle(fontSize: 20),
            ),
          ],
        ),
      ),
    );
  }
}

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

  1. pubspec.yaml 中添加了 carp_apps_package 依赖。
  2. 在 Dart 文件中导入了 carp_apps_package 插件。
  3. 使用 PackageInfo.fromPlatform() 方法异步获取应用包信息。
  4. 在 UI 中展示了包名、版本名和版本号。

请注意,carp_apps_package 插件的具体 API 可能会随着版本更新而变化,因此建议查阅最新的官方文档或插件仓库中的 README 文件以获取最准确的信息。如果 carp_apps_package 插件的 API 有所不同,或者你需要更高级的功能,可能需要根据实际情况调整代码。

回到顶部