插件介绍

record_mp3是一个功能强大的Flutter插件,用于在鸿蒙平台上实现MP3录音功能。该插件基于Record Mp3@3.0.0开发,提供了跨平台的录音能力,支持鸿蒙、iOS和Android平台。

主要功能特点:

  • 高质量MP3录音
  • 支持录音暂停和继续
  • 实时录音状态监听
  • 自定义录音文件保存路径
  • 录音错误回调处理

如何使用插件

1. 包的引入

由于该三方库为自定义修改版本,需要以git形式引入。在引用的项目中,pubspec.yaml中dependencies新增配置:

dependencies:
  record_mp3:
    git:
      url: "https://atomgit.com/"
      path: "fluttertpc_record_mp3-master"

dev_dependencies:
  record_mp3_ohos:
    git:
      url: "https://atomgit.com/"
      path: "fluttertpc_record_mp3-master/ohos"

执行命令安装依赖:

flutter pub get

2. 权限配置

2.1 添加麦克风权限

打开entry/src/main/module.json5,添加麦克风权限配置:

"requestPermissions": [
  {
    "name": "ohos.permission.MICROPHONE",
    "reason": "$string:reason",
    "usedScene": {
      "when": "always",
      "abilities": [
        "EntryAbility"
      ]
    }
  }
]
2.2 添加权限说明

打开entry/src/main/resources/base/element/string.json,添加权限说明:

{
  "string": [
    {
      "name": "reason",
      "value": "使用麦克风进行录音"
    }
  ]
}

3. API的调用

3.1 基本使用示例
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:record_mp3_ohos/record_mp3.dart';
import 'package:audioplayers/audioplayers.dart';

class RecordMp3Example extends StatefulWidget {
  const RecordMp3Example({Key? key}) : super(key: key);

  
  State<RecordMp3Example> createState() => _RecordMp3ExampleState();
}

class _RecordMp3ExampleState extends State<RecordMp3Example> {
  String statusText = "";
  bool isComplete = false;
  AudioPlayer? audioPlayer;
  String? recordFilePath;

  
  void initState() {
    super.initState();
    audioPlayer = AudioPlayer();
    _initRecordPath();
  }

  Future<void> _initRecordPath() async {
    final directory = await getApplicationDocumentsDirectory();
    final filePath = '${directory.path}/record_${DateTime.now().millisecondsSinceEpoch}.mp3';
    setState(() {
      recordFilePath = filePath;
    });
  }

  // 开始录音
  Future<void> startRecord() async {
    if (await Permission.microphone.request().isGranted) {
      if (recordFilePath != null) {
        bool result = RecordMp3.instance.start(
          recordFilePath!,
          (type) {
            setState(() {
              statusText = "录音出错: $type";
            });
          },
        );
        if (result) {
          setState(() {
            statusText = "正在录音...";
          });
        } else {
          setState(() {
            statusText = "录音启动失败";
          });
        }
      }
    } else {
      setState(() {
        statusText = "麦克风权限被拒绝";
      });
    }
  }

  // 暂停录音
  void pauseRecord() {
    if (RecordMp3.instance.status == RecordStatus.PAUSE) {
      bool result = RecordMp3.instance.resume();
      if (result) {
        setState(() {
          statusText = "继续录音...";
        });
      }
    } else {
      bool result = RecordMp3.instance.pause();
      if (result) {
        setState(() {
          statusText = "录音已暂停";
        });
      }
    }
  }

  // 停止录音
  void stopRecord() {
    bool result = RecordMp3.instance.stop();
    if (result) {
      setState(() {
        statusText = "录音已停止,文件路径: $recordFilePath";
        isComplete = true;
      });
    }
  }

  // 播放录音
  Future<void> play() async {
    if (isComplete && recordFilePath != null) {
      await audioPlayer?.play(DeviceFileSource(recordFilePath!));
    }
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('MP3录音示例'),
      ),
      body: Column(
        children: [
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              Expanded(
                child: GestureDetector(
                  child: Container(
                    height: 48.0,
                    decoration: BoxDecoration(color: Colors.red.shade300),
                    child: const Center(
                      child: Text(
                        '开始录音',
                        style: TextStyle(color: Colors.white),
                      ),
                    ),
                  ),
                  onTap: startRecord,
                ),
              ),
              Expanded(
                child: GestureDetector(
                  child: Container(
                    height: 48.0,
                    decoration: BoxDecoration(color: Colors.blue.shade300),
                    child: Center(
                      child: Text(
                        RecordMp3.instance.status == RecordStatus.PAUSE
                            ? '继续录音'
                            : '暂停录音',
                        style: const TextStyle(color: Colors.white),
                      ),
                    ),
                  ),
                  onTap: pauseRecord,
                ),
              ),
              Expanded(
                child: GestureDetector(
                  child: Container(
                    height: 48.0,
                    decoration: BoxDecoration(color: Colors.green.shade300),
                    child: const Center(
                      child: Text(
                        '停止录音',
                        style: TextStyle(color: Colors.white),
                      ),
                    ),
                  ),
                  onTap: stopRecord,
                ),
              ),
            ],
          ),
          Padding(
            padding: const EdgeInsets.only(top: 20.0),
            child: Text(
              statusText,
              style: const TextStyle(color: Colors.red, fontSize: 16),
            ),
          ),
          if (isComplete)
            GestureDetector(
              behavior: HitTestBehavior.opaque,
              onTap: play,
              child: Container(
                margin: const EdgeInsets.only(top: 20.0),
                padding: const EdgeInsets.all(10.0),
                decoration: BoxDecoration(
                  border: Border.all(color: Colors.blue),
                  borderRadius: BorderRadius.circular(5.0),
                ),
                child: const Text(
                  '播放录音',
                  style: TextStyle(color: Colors.blue, fontSize: 16),
                ),
              ),
            ),
        ],
      ),
    );
  }
}

API说明

方法名 返回值 描述 鸿蒙支持
start(String path, Function(RecordErrorType) onRecordError) bool 开始录音 yes
pause() bool 暂停录音 yes
resume() bool 继续录音 yes
stop() bool 停止录音并导出文件 yes

约束与限制

兼容性

在以下版本中已测试通过:

  • Flutter: 3.7.12-ohos-1.0.6; SDK: 5.0.0(12); IDE: DevEco Studio: 5.0.13.200; ROM: 5.1.0.120 SP3;

权限注意事项

该插件需要使用麦克风权限,而默认的应用权限是normal,只能使用normal等级的权限。如果在安装hap包时报错9568289,需要参考官方文档修改应用等级为system_basic。

总结

record_mp3为鸿蒙平台提供了强大的MP3录音功能,使开发者能够轻松实现高质量的录音功能。该插件具有良好的跨平台兼容性,使用方法一致,大大提高了开发效率。

通过本文的介绍,您可以快速上手使用record_mp3,实现MP3录音功能。如果您在使用过程中遇到问题,可以参考插件的示例代码或社区文档。

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐