Flutter闹钟管理插件alarm2的使用

Flutter闹钟管理插件alarm2的使用

简介

该插件提供了一个简单易用的接口来在iOS和Android设备上设置和取消闹钟。它使用原生代码处理音频播放、振动、系统音量和通知。

安装步骤

请仔细遵循以下安装步骤。这些步骤已经更新为插件版本 3.0.0

iOS 设置

请参阅此链接了解详细信息。

Android 设置

请参阅此链接了解详细信息。

如何使用

首先,在您的 pubspec.yaml 文件中添加插件:

dependencies:
  alarm2: ^3.0.0

然后,在您的项目中执行以下命令以添加依赖项:

flutter pub add alarm2

接下来,在您的 main 函数中初始化闹钟服务:

import 'package:alarm2/alarm2.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化闹钟服务
  await Alarm2.init();
  
  runApp(MyApp());
}

定义闹钟设置:

import 'package:alarm2/alarm2.dart';
import 'package:flutter/material.dart';
import 'dart:io';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化闹钟服务
  await Alarm2.init();

  final DateTime dateTime = DateTime.now().add(Duration(hours: 1)); // 设置一个小时后的闹钟时间
  
  final alarmSettings = AlarmSettings(
    id: 42, // 唯一标识符
    dateTime: dateTime, // 闹钟触发时间
    assetAudioPath: 'assets/alarm.mp3', // 铃声路径
    loopAudio: true, // 是否循环播放铃声
    vibrate: true, // 是否振动
    volume: 0.8, // 系统音量
    fadeDuration: 3.0, // 音量渐变时间
    notificationTitle: '这是标题', // 通知标题
    notificationBody: '这是内容', // 通知内容
    enableNotificationOnKill: Platform.isIOS, // 应用被杀时是否显示通知
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('闹钟管理'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 设置闹钟
              await Alarm2.set(alarmSettings: alarmSettings);
            },
            child: Text('设置闹钟'),
          ),
        ),
      ),
    );
  }
}

停止或取消闹钟:

await Alarm2.stop(id);

运行一些代码当闹钟开始响铃:

// 监听闹钟响铃事件
Alarm2.ringStream.instance.stream.listen((_) => print("闹钟响铃了!"));

示例应用

不要犹豫,查看示例代码,并查看应用程序:

home edit

闹钟行为

Sound Vibrate Volume Notification
Locked screen
Silent / Mute
Do not disturb Silenced
Sleep mode Silenced
While playing other media
App killed 🤖 🤖 🤖

✅ : iOS 和 Android。 🤖 : Android 仅。 Silenced: 意味着通知不会直接显示在屏幕顶部,用户需要进入通知中心才能看到。

常见问题解答

为什么我的闹钟在iOS上没有响?

可能的原因包括:

  • 您的iPhone进行了重启(手动重启或iOS更新)。
  • 应用程序被手动终止或因内存不足而关闭。

为什么我的闹钟在特定的Android设备上不响?

某些Android制造商更倾向于电池寿命而不是应用程序的正常功能。建议查看dontkillmyapp.com了解更多关于不同厂商的优化信息,并查找潜在的解决方案。最常见的解决方案是教育用户禁用电池优化设置。

为什么我不能在我的Android闹钟通知上取消闹钟?

闹钟插件使用Android的前台服务来确保即使应用程序被终止,闹钟也能触发。对于Android 12+,前台服务的通知不能被取消,因为新的Android规则确保用户始终意识到可能影响电池寿命或设备性能的正在进行的过程。

如何提高闹钟响铃的可靠性?

  • 电池优化: 教育用户禁用Android上的电池优化。
  • 定期使用应用程序: 鼓励用户每天至少打开一次应用程序。
  • 利用后台模式: 参与像天气API调用这样的活动,保持应用程序在后台活跃。
  • 用户设置: 教育用户在他们期望闹钟响的时候不要使用“勿扰”和“低电量模式”。

如何使我的闹钟周期性地响?

虽然可以在Android上实现周期性闹钟,但对iOS来说不可行。为了在两个平台上保持一致性,我将不在包中添加此功能(除非找到解决方案)。作为替代方案,您可以存储预定天数的闹钟,并在每次启动应用程序时重置它们。

为什么我的应用程序在iOS上崩溃?

如果同时调用 Alarm2.setAlarm2.stop 方法,可能会发生如 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 的崩溃,因为它们都修改共享资源。要防止这种情况,请确保每个方法调用完成后才开始下一个调用:

await Alarm2.set();
await Alarm2.stop();

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

1 回复

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


alarm2 是一个用于 Flutter 的插件,允许你在应用中设置和管理闹钟。它支持在应用处于后台或设备锁屏时触发闹钟。以下是使用 alarm2 插件的基本步骤和示例代码。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  alarm2: ^0.6.0+1

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

2. 配置 Android 和 iOS

Android

AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

iOS

Info.plist 文件中添加以下权限:

<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
</array>

3. 初始化插件

在你的 main.dart 文件中初始化 alarm2 插件:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Alarm2.init();
  runApp(MyApp());
}

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

4. 设置闹钟

AlarmHomePage 中,你可以设置闹钟:

class AlarmHomePage extends StatefulWidget {
  @override
  _AlarmHomePageState createState() => _AlarmHomePageState();
}

class _AlarmHomePageState extends State<AlarmHomePage> {
  DateTime? _alarmDateTime;

  Future<void> _setAlarm() async {
    final DateTime now = DateTime.now();
    final DateTime alarmTime = now.add(Duration(seconds: 10)); // 10秒后触发闹钟

    await Alarm2.set(
      alarmDateTime: alarmTime,
      assetAudioPath: 'assets/alarm.mp3', // 闹钟铃声文件路径
      loopAudio: true,
      vibrate: true,
      notificationTitle: 'Alarm',
      notificationBody: 'Your alarm is ringing!',
      enableNotificationOnKill: true,
    );

    setState(() {
      _alarmDateTime = alarmTime;
    });
  }

  Future<void> _stopAlarm() async {
    await Alarm2.stop();
    setState(() {
      _alarmDateTime = null;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Alarm2 Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            if (_alarmDateTime != null)
              Text('Alarm set for: ${_alarmDateTime!.toLocal()}'),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _setAlarm,
              child: Text('Set Alarm'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _stopAlarm,
              child: Text('Stop Alarm'),
            ),
          ],
        ),
      ),
    );
  }
}

5. 处理闹钟触发

当闹钟触发时,你可以通过监听 Alarm2 的事件来处理:

Alarm2.onAlarmEvent((alarmEvent) {
  if (alarmEvent == AlarmEvent.ringing) {
    // 处理闹钟响铃事件
  } else if (alarmEvent == AlarmEvent.stop) {
    // 处理闹钟停止事件
  }
});
回到顶部