Flutter无安卓权限录音插件record_without_android的使用

Flutter无安卓权限录音插件record_without_android的使用

简介

record_without_android 插件允许从麦克风录制音频到指定的文件路径或流。它支持多种平台,无需外部依赖。

平台功能对比矩阵

功能 Android iOS Web Windows macOS Linux
暂停/恢复 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
幅度(dBFS) ✔️ ✔️ ✔️ ✔️ ✔️
权限检查 ✔️ ✔️ ✔️ ✔️
音频通道数 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
设备选择 ✔️ 1 / 2 (自动BT/麦克风) ✔️ ✔️ ✔️ ✔️
自动增益 ✔️ 2 (始终激活?) ✔️
回声消除 ✔️ 2 ✔️
噪声抑制 ✔️ 2 ✔️

文件编码支持

编码器 Android iOS Web Windows macOS Linux
aacLc ✔️ ✔️ ? ✔️ ✔️ ✔️
aacEld ✔️ ✔️ ? ✔️
aacHe ✔️ ? ✔️
amrNb ✔️ ? ✔️
amrWb ✔️ ?
opus ✔️ ✔️ 3 ✔️
wav ✔️ 2 ✔️ ✔️ ✔️ ✔️ ✔️
flac ✔️ 2 ✔️ ? ✔️ ✔️ ✔️
pcm16bits ✔️ 2 ✔️ ✔️ ✔️ ✔️

流编码支持

编码器 Android iOS Web Windows macOS Linux
aacLc ✔️ 2
aacEld ✔️ 2
aacHe ✔️ 2
pcm16bits ✔️ 2 ✔️ ✔️ ✔️ ✔️
  • AAC以原始AAC格式(带ADTS头)流式传输,可以直接通过文件读取!

使用方法

import 'package:record/record.dart';

final record = AudioRecorder();

// 检查并请求权限
if (await record.hasPermission()) {
  // 开始录制到文件
  await record.start(const RecordConfig(), path: 'aFullPath/myFile.m4a');
  // ... 或者到流
  final stream = await record.startStream(const RecordConfig(AudioEncoder.pcm16bits));
}

// 停止录制...
final path = await record.stop();
// ... 或取消录制(并隐式删除文件/流)。
await record.cancel();

record.dispose(); // 别忘了这个

设置权限和其他配置

Android

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 可选:如果要使用蓝牙耳机/耳塞等蓝牙电话设备 -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- 可选:如果要在公共文件夹中保存录制文件 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • 最低SDK版本:23(amrNb/amrWb: 26, Opus: 29)

iOS

<key>NSMicrophoneUsageDescription</key>
<string>Some message to describe why you need this permission</string>
  • 最低SDK版本:11.0

macOS

<key>NSMicrophoneUsageDescription</key>
<string>Some message to describe why you need this permission</string>
  • 在能力选项卡中,激活“音频输入”在调试和发布方案中。
  • 或直接在*.entitlements文件中添加:
<key>com.apple.security.device.audio-input</key>
<true/>
  • 最低SDK版本:10.15

示例代码

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

import 'package:record_example/audio_player.dart';
import 'package:record_example/audio_recorder.dart';

void main() => runApp(const MyApp());

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool showPlayer = false;
  String? audioPath;

  [@override](/user/override)
  void initState() {
    showPlayer = false;
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: showPlayer
              ? Padding(
                  padding: const EdgeInsets.symmetric(horizontal: 25),
                  child: AudioPlayer(
                    source: audioPath!,
                    onDelete: () {
                      setState(() => showPlayer = false);
                    },
                  ),
                )
              : Recorder(
                  onStop: (path) {
                    if (kDebugMode) print('Recorded file path: $path');
                    setState(() {
                      audioPath = path;
                      showPlayer = true;
                    });
                  },
                ),
        ),
      ),
    );
  }
}

更多关于Flutter无安卓权限录音插件record_without_android的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter无安卓权限录音插件record_without_android的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,如果你想使用录音功能但不想请求安卓权限,你可以使用 record_without_android 插件。这个插件允许你在不请求安卓权限的情况下进行录音。以下是如何使用 record_without_android 插件的步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  record_without_android: ^1.0.0  # 请检查最新版本

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

2. 导入插件

在你的 Dart 文件中导入 record_without_android 插件:

import 'package:record_without_android/record_without_android.dart';

3. 初始化录音器

你可以通过 RecordWithoutAndroid 类来初始化录音器:

final recorder = RecordWithoutAndroid();

4. 开始录音

你可以使用 start 方法来开始录音。你可以指定录音文件的路径和格式:

void startRecording() async {
  String path = await recorder.start();
  print('Recording started at: $path');
}

5. 停止录音

你可以使用 stop 方法来停止录音:

void stopRecording() async {
  String? path = await recorder.stop();
  if (path != null) {
    print('Recording stopped and saved at: $path');
  } else {
    print('Recording could not be stopped');
  }
}

6. 检查录音状态

你可以使用 isRecording 方法来检查当前是否正在录音:

bool isRecording = await recorder.isRecording();
print('Is recording: $isRecording');

7. 处理录音文件

录音文件会被保存到指定的路径,你可以使用 path 变量来访问录音文件并进行进一步处理。

8. 释放资源

录音完成后,你可以使用 dispose 方法来释放资源:

void disposeRecorder() {
  recorder.dispose();
}

完整示例

以下是一个完整的示例,展示了如何使用 record_without_android 插件进行录音:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Record Without Android Permission'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: startRecording,
                child: Text('Start Recording'),
              ),
              ElevatedButton(
                onPressed: stopRecording,
                child: Text('Stop Recording'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  final recorder = RecordWithoutAndroid();

  void startRecording() async {
    String path = await recorder.start();
    print('Recording started at: $path');
  }

  void stopRecording() async {
    String? path = await recorder.stop();
    if (path != null) {
      print('Recording stopped and saved at: $path');
    } else {
      print('Recording could not be stopped');
    }
  }
}
回到顶部