Flutter穿戴设备持续活动管理插件wear_ongoing_activity的使用

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

Flutter穿戴设备持续活动管理插件wear_ongoing_activity的使用

wear_ongoing_activity 是一个 Flutter 插件,用于在 Wear OS 设备上创建和维护持续活动通知。本文将详细介绍如何使用该插件,并提供一个完整的示例代码。

Getting Started

AndroidManifest.xml

首先,在 AndroidManifest.xml 文件中添加必要的权限和服务配置:

<!-- Add permissions for the types specified in `foregroundServiceType` below -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH" />
<uses-permission android:name="android.permission.BODY_SENSORS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_REMOTE_MESSAGING" />

<application>
    ...
    <service
        android:name="dev.rexios.wear_ongoing_activity.OngoingActivityService"
        android:exported="false"
        android:foregroundServiceType="health|remoteMessaging|..."
        android:stopWithTask="true" />
    ...
</application>

确保在启动活动之前请求通知权限和其他所需的权限:

import 'package:permission_handler/permission_handler.dart';

void main() {
  [Permission.notification, Permission.sensors].request();
}

Usage

Start an Activity

启动一个持续活动通知:

import 'package:wear_ongoing_activity/wear_ongoing_activity.dart';

void main() {
  WearOngoingActivity.start(
    channelId: 'ongoing_activity',
    channelName: 'Ongoing Activity',
    notificationId: 12345,
    category: NotificationCategory.workout,
    // This must be a file in `android/app/src/main/res/drawable`
    smallIcon: 'ic_launcher',
    // This must be a file in `android/app/src/main/res/drawable`
    staticIcon: 'ic_launcher',
    status: OngoingActivityStatus(
      templates: [
        '#type#: #time#',
      ],
      parts: [
        TextPart(name: 'type', text: 'countup'),
        StopwatchPart(name: 'time', timeZero: DateTime.now()),
      ],
    ),
  );
}

Update an Activity

更新一个正在进行的活动:

import 'package:wear_ongoing_activity/wear_ongoing_activity.dart';

void main() async {
  if (!await WearOngoingActivity.isOngoing()) {
    // Attempting to update an activity that is not ongoing will throw an error
    return;
  }

  await WearOngoingActivity.update(
    OngoingActivityStatus(
      templates: [
        '#type#: #time#',
      ],
      parts: [
        TextPart(name: 'type', text: 'countdown'),
        TimerPart(
          name: 'time',
          timeZero: DateTime.now().add(const Duration(minutes: 5)),
        ),
      ],
    ),
  );
}

Stop an Activity

停止一个正在进行的活动:

import 'package:wear_ongoing_activity/wear_ongoing_activity.dart';

void main() {
  WearOngoingActivity.stop();
}

完整示例

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 wear_ongoing_activity 插件:

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:wear_ongoing_activity/wear_ongoing_activity.dart';

void main() {
  runApp(const MaterialApp(home: MyHomePage()));
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  var _counter = 0;
  var _ongoing = false;
  Timer? _updateTimer;

  OngoingActivityStatus get _status => OngoingActivityStatus(
        templates: [
          '#label#: #count#',
        ],
        parts: [
          TextPart(name: 'label', text: 'Count'),
          TextPart(name: 'count', text: '$_counter'),
        ],
      );

  void _start() async {
    setState(() => _ongoing = true);
    await WearOngoingActivity.start(
      channelId: 'ongoing_activity',
      channelName: 'Ongoing Activity',
      notificationId: 12345,
      category: NotificationCategory.workout,
      smallIcon: 'ic_launcher',
      staticIcon: 'ic_launcher',
      status: _status,
    );

    _updateTimer = Timer.periodic(
      const Duration(seconds: 1),
      (timer) async {
        setState(() => _counter++);

        // If the activity is not started yet, return and try again later
        if (!await WearOngoingActivity.isOngoing()) return;
        unawaited(WearOngoingActivity.update(_status));
      },
    );
  }

  void _stop() async {
    setState(() => _ongoing = false);
    await WearOngoingActivity.stop();
    _updateTimer?.cancel();
  }

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

    [Permission.notification, Permission.sensors].request();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
            if (_ongoing)
              IconButton(icon: const Icon(Icons.stop), onPressed: _stop)
            else
              IconButton(
                icon: const Icon(Icons.play_arrow),
                onPressed: _start,
              ),
          ],
        ),
      ),
    );
  }
}

说明

  1. 权限请求:在 initState 方法中请求通知和传感器权限。
  2. 启动活动:点击播放按钮时启动活动,并设置定时器每秒更新计数。
  3. 更新活动:定时器每秒调用 WearOngoingActivity.update 方法更新活动状态。
  4. 停止活动:点击停止按钮时停止活动并取消定时器。

通过以上步骤,你可以在 Wear OS 设备上创建和管理持续活动通知。希望这个示例对你有所帮助!


更多关于Flutter穿戴设备持续活动管理插件wear_ongoing_activity的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter穿戴设备持续活动管理插件wear_ongoing_activity的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter穿戴设备应用中使用wear_ongoing_activity插件的示例代码。这个插件主要用于管理穿戴设备上的持续活动通知,以告知用户某个活动正在进行中。

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

dependencies:
  flutter:
    sdk: flutter
  wear_ongoing_activity: ^最新版本号 # 请替换为当前最新版本号

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

接下来,是一个简单的示例代码,展示了如何使用wear_ongoing_activity插件来启动和停止一个持续活动通知。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Wear Ongoing Activity Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  // 启动持续活动通知
                  await WearOngoingActivity.start(
                    title: 'Activity in Progress',
                    description: 'This is an ongoing activity notification.',
                    icon: 'drawable/ic_notification', // 确保你有这个资源文件
                  );
                },
                child: Text('Start Ongoing Activity'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  // 停止持续活动通知
                  await WearOngoingActivity.stop();
                },
                child: Text('Stop Ongoing Activity'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 图标资源:在icon参数中指定的图标资源(例如'drawable/ic_notification')需要你在Android项目中提供。确保在android/app/src/main/res/drawable目录下有一个名为ic_notification的图标文件。

  2. 权限和配置:某些情况下,你可能需要在AndroidManifest.xml中添加特定的权限或配置来支持持续活动通知。不过,wear_ongoing_activity插件通常已经处理了大部分配置工作。

  3. 错误处理:在实际应用中,你应该添加适当的错误处理逻辑,比如处理WearOngoingActivity.startWearOngoingActivity.stop方法可能抛出的异常。

  4. 测试:确保在真实的穿戴设备或模拟器上测试你的应用,因为持续活动通知在普通手机模拟器上可能无法正确显示。

这个示例代码展示了基本的启动和停止持续活动通知的功能。根据你的具体需求,你可以进一步自定义通知的内容和行为。

回到顶部