首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓AudioRecord故障

安卓AudioRecord故障
EN

Stack Overflow用户
提问于 2015-01-10 16:33:03
回答 2查看 1.1K关注 0票数 2
代码语言:javascript
复制
private static final int SampleRate = 8000; 
private static final int Channels = AudioFormat.CHANNEL_IN_MONO;
private static final int Encoding = AudioFormat.ENCODING_PCM_16BIT;

private void startRecording(){
    int bufferSize = AudioRecord.getMinBufferSize(SampleRate, Channels,  AudioFormat.ENCODING_PCM_16BIT);
       if (bufferSize > 0) {
            recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SampleRate, Channels, Encoding, BufferElements2Rec*BytesPerElement);
            recorder.startRecording();
            isRecording = true;
            recordingThread = new Thread(new Runnable(){
                public void run(){
                    writeAudioDataToFile();
                }
            },"AudioRecorder Thread");
            recordingThread.start();
       }
}

这在设备仿真器上工作,我有任何问题,但在一个真正的手机不工作。我得到了一个错误:

代码语言:javascript
复制
java.lang.IllegalStateException: startRecording() called on an unitialized AudioRecord.

我把我的舱单:

代码语言:javascript
复制
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-10 17:14:26

正如文档 for AudioRecord构造函数所述,

您应该在构造后立即调用getState(),以确认该对象是否可用。

可能的状态是:

STATE_INITIALIZED

STATE_UNINITIALIZED

在您的示例中,记录器没有正确初始化,因此在调用startRecording()时得到了IllegarArgumentException。

其中一个原因可能是你的SampleRate,也就是8000。根据文档,44100 as是保证在所有设备上工作的唯一速率,因此请先尝试此速率(同时,文档没有明确声明8000 as为有效速率)。

在代码中,将SampleRate更改为44100并检查对象状态,例如:

代码语言:javascript
复制
private static final int SampleRate = 44100;

后来:

代码语言:javascript
复制
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SampleRate, Channels, Encoding, BufferElements2Rec*BytesPerElement);

if (recorder.getState() == AudioRecord.STATE_INITIALIZED) {
    recorder.startRecording();
    isRecording = true;
    //rest of the code
}
else {
    //not initialized properly
}
票数 2
EN

Stack Overflow用户

发布于 2016-10-18 09:02:23

在某些情况下(我在安卓6上遇到了同样的问题,而不是5),当你第一次启动一个应用程序时,你需要去Settings>Apps>Yourapp>Permissions,让应用程序使用麦克风,在我打开它之后,错误就消失了。

更好的做法是像这样在启动时检查sdk号,并在应用程序内部请求用户的许可以防止错误(用您需要的权限替换PUT_YOUR_PERMISSION_HERE )-

代码语言:javascript
复制
//check for permission
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M  &&     checkSelfPermission(Manifest.permission.PUT_YOUR_PERMISSION_HERE)
                        != PackageManager.PERMISSION_GRANTED) {

                    requestPermissions(new String[]{Manifest.permission.PUT_YOUR_PERMISSION_HERE},
                            MY_PERMISSIONS_REQUEST_PUT_YOUR_PERMISSION_HERE);

                    // MY_PERMISSIONS_REQUEST_PUT_YOUR_PERMISSION_HERE is an
                    // app-defined int constant

                    return;
                }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27878458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档