2013-08-16 3 views
1

Я использую приведенный ниже код, чтобы получить действительную частоту дискретизации для устройства, но он всегда отправляет 0 для audioRecorder.getState() для My Samsung Galaxy Tab 1 OS версии 2.3.6, но это отлично подходит для Samsung Galaxy S2.Android: audioRecorder.getState() отправляет 0 в Samsung Galaxy Tab

Средства для 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 = новый AudioRecord (AudioSource.MIC, rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat. ENCODING_PCM_16BIT, bufferSize + 2000); ' –

ответ

1

Я вижу две проблемы здесь:

  1. Используется жестко закодированное значение для bufferSizeInBytes. Согласно documentation, если вы используете значение, меньшее getMinBufferSize, это приведет к ошибке инициализации. Почему вы не используете свое значение bufferSize в конструкторе? Также используйте то же значение channelConfig при вызове getMinBufferSize.

  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; 
      } 
     } 
    } 
} 
Смежные вопросы