Недавно я боролся с подобной проблемой.Как было сказано ранее, вы должны циклически просматривать все возможные комбинации частот дискретизации, конфигурации каналов, аудиоформатов, чтобы узнать, что подходит для данного телефона.Эмулятор AFAIK не поддерживает аудиовход и всегда выдаст ошибку инициализации объектов AudioRecord.Таким образом, вы должны проверить свой код на реальном устройстве.Но кроме того, я обнаружил, что существует максимальный размер буфера, который вы можете задать для объекта AudioRecord.Это должно быть где-то в нескольких КБ.Я попытался установить его на уровне около 10 МБ, и он продолжал выдавать ту же ошибку инициализации.Так что будьте осторожны.Вот код для циклического переключения между форматами и частотой дискретизации (любезно предоставлено где-то на StackEx):
private static int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 };
private static short [] aformats = new short[] { AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT };
private static short [] chConfigs = new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO };
public AudioRecord findAudioRecord() {
for (int rate : mSampleRates) {
for (short audioFormat : aformats) {
for (short channelConfig : chConfigs) {
try {
Log.d("Log:", "Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: "
+ channelConfig);
int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);
if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
// check if we can instantiate and have a success
AudioRecord recorder = new AudioRecord(android.media.MediaRecorder.AudioSource.MIC, rate, channelConfig, audioFormat, java.lang.Math.max(bufferSize,1024*800));
if (recorder.getState() == AudioRecord.STATE_INITIALIZED){
Chosen_SR = rate;
audFormat = audioFormat;
chanConfig = channelConfig;
return recorder;
}
}
} catch (Exception e) {
Log.e("Log:", rate + "Exception, keep trying.",e);
}
}
}
}
return null;
}
AudioRecorder mRecord = findAudioRecord();
Надеюсь, это поможет.