-
-
Notifications
You must be signed in to change notification settings - Fork 60
Description
Android app crashes when recording a second time with error "startRecording() called on an uninitialized AudioRecord".
I am developing a .NET9 MAUI app with audio recording and playback capabilities. I have followed the examples and instructions in the documentation. I'm not allowed to post the exact code per business policy.
Plugin version: 4.0.0
.NET version: 9
Android emulator details: Android 16 API 36
Android physical device details: Android 14 API 34
I am using builder.AddAudio() in MauiProgram.cs. I am using dependency injection in my View Model
builder.AddAudio();
builder.Services.AddTransient<MyViewModel>();
...
private readonly IAudioManager audioManager;
private readonly IAudioRecorder audioRecorder;
public MyViewModel(IAudioManager audioManager) {
this.audioManager = audioManager;
audioRecorder = audioManager.CreateRecorder();
}
[RelayCommand]
private async Task StartRecording() {
var microphoneAllowed = [getting microphone permission]
if (microphoneAllowed) {
await audioRecorder.StartAsync();
}
}
[RelayCommand]
private async Task StopRecording() {
RecordedAudio = await audioRecorder.StopAsync();
}
[RelayCommand]
private async Task Replay() {
if (RecordedAudio != null) {
await using (var stream = RecordedAudio.GetAudioStream()) {
var player = AudioManager.Current.CreateAsyncPlayer(stream);
await player.PlayAsync(CancellationToken.None);
}
}
}
My AndroidManifest includes :
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
The first time this code gets run, everything works as expected. I get prompted to give microphone permissions. Recording works. Stopping works. Playback works. However, after stopping the audio, regardless of if I playback or not, the second time I try to record audio (re-recording), the app crashes. In the code above, I'm calling CreateRecorder() in the constructor, but the issue still occurs if I move that call to be within StartRecording() as well. The errors are:
java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
at android.media.AudioRecord.startRecording(AudioRecord.java: 1494)
at crc64fcf28c0e24b4cc31.ButtonHandler_ButtonClickListener.n_onClick(Native Method)
at crc64fcf28c0e24b4cc31.ButtonHandler_ButtonClickListener.onClick(ButtonHandler_ButtonClickListener.java:29)
at android.view.View.performClick(View.java:8083)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java: 1218)
at android.view.View.performClickInternal(View.java:8060)
at android.view.View .- $$Nest$mperformClickInternal(Unknown Source:0)
at android.view.View$PerformClick.run(View.java:31532)
at android.os.Handler.handleCallback(Handler.java:995)
at android.os.Handler.dispatchMessage(Handler.java: 103)
at android.os.Looper.loopOnce(Looper.java:248)
at android.os.Looper.loop(Looper.java:338)
at android.app.ActivityThread.main(ActivityThread.java:8982)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Runtimelnit$MethodAndArgsCaller.run(Runtimelnit.java:593)
at com.android.internal.os.Zygotelnit.main(Zygotelnit.java:932)
FATAL EXCEPTION: main
Error code -20 when initializing native AudioRecord object.
Error creating AudioRecord instance: initialization check failed with status -1.
createRecord_I(0): AudioFlinger could not create record track, status: -1
AudioFlinger Function: createRecord Line: 2423 Failed result (Status(-1, EX SECURITY): 'static BinderResult com :: android :: media :: permission :: ValidatedAttributionSourceState :: createFromTrustedUidNoPackage(AttributionSourceState,...