2013-08-16 109 views
1

我正在使用下面的代码来获取该设备的有效采样率,但对于我的Samsung Galaxy Tab 1 OS版本2.3.6,它始终发送0为audioRecorder.getState(),但它适用于三星Galaxy S2。Android:audioRecorder.getState()在Samsung Galaxy Tab中发送0

手段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

你在logcat中得到任何错误打印?我会期望从'AudioRecord'构造函数发出错误信息。如果将'bufferSize'传递给'AudioRecord'构造函数而不是使用'21168'的硬编码值? – Michael

+0

尝试更改您的代码到'int bufferSize = AudioRecord.getMinBufferSize(rate,AudioFormat.CHANNEL_IN_DEFAULT,AudioFormat.ENCODING_PCM_16BIT);'和instatiaton行到'AudioRecord audioRecorder = new AudioRecord(AudioSource.MIC,rate,AudioFormat.CHANNEL_IN_MONO,AudioFormat。 ENCODING_PCM_16BIT,bufferSize + 2000);' –

回答

1

我在这里看到两个问题:

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

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

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

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; 
      } 
     } 
    } 
} 
相关问题