system_audio_recorder

A Simple flutter plugin used to record audio played by the Android system

Functions

requestRecord

This function is used to request system permission to record played audio. When this function is called, the system will display a prompt. Clicking 'Allow' returns true, while clicking 'Deny' returns false.(Although this function can accept parameters, it is unnecessary to pass any)

startRecord

Call this function to start recording the audio played by the system. You must first call requestRecord to request permission before calling this function. Currently, only PCM16 encoding is supported.

Argument Type Description Default
sampleRate int 16000
bufferSize int Buffer size in bytes 640
toStream bool Whether to receive the recorded audio as a stream true
toFile bool Whether to save the recorded audio to a file false
filePath String? File path where the recorded audio is saved null

stopRecord

This function is used to stop the recording. If toFile is true, it returns the file path; otherwise, it returns ""

Example

Permission configuration

In android/app/src/main/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application
        ...
        >
        
        <!-- Add Service begin -->
        <service
            android:name="com.foregroundservice.ForegroundService"
            android:foregroundServiceType="mediaProjection">
        </service>
        <!-- Add Service end -->

		...
    </application>

    ...
    
    <!-- Add Permission begin -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
    <!-- Add Permission end -->
    
</manifest>

Start record

bool isConfirmed = await SystemAudioRecorder.requestRecord(
    titleNotification: "titleNotification",
    messageNotification: "messageNotification",
);
bool toStream = true;
bool toFile = true;
String? path;    // path can not be null when toFile is true
if (isConfirmed) {
    audioData.clear();
    if (toFile){ // if record to file, get filepath
        var tempDir = await getExternalStorageDirectory();

        path = '${tempDir?.parent.path}/record.mp3';
        var outputFile = File(path);
        if (outputFile.existsSync()) {
            await outputFile.delete();
        }
    }
    bool isStart = await SystemAudioRecorder.startRecord(toStream: toStream, toFile: toFile, filePath: path);
    if (toStream){  // if record to stream, set stream listener
        _audioSubscription ??=
            SystemAudioRecorder.audioStream.receiveBroadcastStream({}).listen((data) {
            audioData.addAll(List<int>.from(data));   // data.length = bufferSize * 2
        });
    }

}

Stop record

String path = await SystemAudioRecorder.stopRecord();
if (_audioSubscription != null) {   // if record to stream, cancel subscription when stop
    _audioSubscription?.cancel();
    _audioSubscription = null;
}

References

flutter_screen_recording

SystemAudioCaptureAndroid