2013-08-16 41 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; 
      } 
     } 
    } 
} 
相關問題