我在 Android 上遇到有关 AudioRecord 初始化的问题。我的应用程序只是在实时讲话时聆听扬声器的声音。
但我从一开始就有问题。我的初始化代码如下:
int Rate = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_MUSIC);
int MinBufferAM = AudioRecord.getMinBufferSize(Rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
AudioRecord AR = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, Rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, MinBufferAM);
int MinBufferAT = AudioTrack.getMinBufferSize(Rate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
AudioTrack AT = new AudioTrack(AudioManager.MODE_IN_COMMUNICATION, Rate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, MinBufferAT, AudioTrack.MODE_STREAM);
运行应用程序时出现的错误是这样的:
E/AudioRecord: Could not get audio input for session 89, record source 7, sample rate 44100, format 0x1, channel mask 0x10, flags 0
E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed with status -22.
Error code -20 when initializing native AudioRecord object.
如您所见,这是一个非常简单的代码,取自 Android 及其变体的官方文档(位于 stackoverflow)。但没有人为我工作。与我在这里看到的其他错误代码不同,除了数字 -20 之外,我还看到数字 -22。这是什么意思?我已经在两台计算机和真实设备上测试了代码。总是犯同样的错误。
显然我已经设置了权限(RECORD_AUDIO)并在模拟器/设备上激活,但什么也没有。这就是为什么我冒昧地问这个问题,因为他们给每个人的解决方案是权限。所以请问我哪里错了?
我还想问是否有任何书籍解释如何在 Android 中利用音频。和iOS版的《学习核心音频》这本书很相似。 最后有一些网站可以识别 Android 中的错误,例如 iOS 的“OSStatus.com”?
感谢您的关注。
更新1
我继续尝试,但没有任何效果。我还尝试添加非推荐的代码行,例如 System.exit() 但它不起作用。我看到其他用户将我的问题归为错误-22,但没有答案。我尝试了其他方法来实现 AudioRecord,但没有任何结果。
同样,问题不是第一次初始化AudioRecord并在最后释放,而是在应用程序的第二次运行时。我还看到,如果我更改项目并尝试运行另一个应用程序(始终是 AudioRecord),我会立即收到错误。所以这让我思考:这是我的应用程序的问题吗?这是AndroidStudio的问题吗?否则我还可以进行哪些其他测试来理解这个问题?
我认为问题出在你的程序上。我也遇到了这个问题,我解决了它,然后在设备的设置中手动为我的应用程序打开记录权限。因此,问题在于程序文件中的权限设置错误,而不是 Android Studio 中。
这是因为没有授予使用麦克风的权限。
为此,您可以通过添加清单文件来授予权限。并在开始录制时在应用程序 UI 中添加权限提示。