Android:audioRecorder.getState()在Samsung Galaxy Tab中发送0

时间:2013-08-16 05:54:33

标签: java android audio audiorecord

我使用下面的代码来获取设备的有效采样率,但它总是为{三星Galaxy Tab 1操作系统版本2.3.6发送audioRecorder.getState() 0但对三星Galaxy S2来说很好。

Galaxy Tab的手段我总是得到desiredRate = -1;

public static void getValidSampleRates() {
        int desiredRate = 0;
        for (int rate : new int[] {44100, 8000, 11025, 16000, 22050}) {  // add the rates you wish to check against
            int bufferSize = AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_CONFIGURATION_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);
            if (bufferSize > 0) {
                // buffer size is valid, Sample rate supported
                AudioRecord audioRecorder = new AudioRecord(AudioSource.MIC, rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, 21168);

                if (audioRecorder.getState() != AudioRecord.STATE_INITIALIZED)
                    desiredRate = -1;
                else
                    desiredRate = rate;
            }
        }
    }

我在 Android清单文件

中添加了以下权限
 <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="14" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />

    <application

请帮助

1 个答案:

答案 0 :(得分:1)

我在这里看到两个问题:

  1. 您正在使用bufferSizeInBytes的硬编码值。根据{{​​3}},如果使用小于getMinBufferSize的值将导致初始化失败。为什么不在构造函数中使用bufferSize的值?此外,在调用channelConfig时使用相同的getMinBufferSize值。

  2. 与此documentation中的答案类似,有人可能尚未发布AudioRecord资源。您可以对if语句进行一些更改,如下面的代码块所示。如果这是真的,那么在尝试初始化44100的比特率时,代码将失败,正确释放资源,然后成功初始化比特率为8000.如果您仍希望具有44100的比特率,请使用new int[] {44100, 44100, 8000, 11025, 16000, 22050}

  3. 下面的代码块包括对代码的更改。请尝试一下,让我知道你得到了什么。

    public static void getValidSampleRates() {
        int desiredRate = 0;
        for (int rate : new int[] {44100, 8000, 11025, 16000, 22050}) {
            int bufferSize = AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
            if (bufferSize > 0) {
                // buffer size is valid, Sample rate supported
                AudioRecord audioRecorder = new AudioRecord(AudioSource.MIC, rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
    
                if (audioRecorder.getState() != AudioRecord.STATE_INITIALIZED) {
                    desiredRate = -1;
                    audioRecorder.release();
                } else {
                    desiredRate = rate;
                    break;
                }
            }
        }
    }