Flutter鸿蒙跨平台插件:record_mp3 使用指南
record_mp3是一款支持鸿蒙平台的Flutter录音插件,提供MP3格式录音功能。主要特性包括高质量录音、暂停/继续功能、状态监听和自定义保存路径。使用方式:1)通过git引入依赖包;2)配置麦克风权限;3)调用API实现录音控制。示例代码展示了录音开始、暂停、停止和播放的实现方法,支持权限检查和状态提示。该插件兼容鸿蒙、iOS和Android平台,适合需要跨平台录音功能的开发者使用。
插件介绍
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
更多推荐


所有评论(0)