Intereting Posts
Как настроить панель выполнения на Android Android: отключен звук уведомления Как отправить данные из одного фрагмента в другой фрагмент? Android WebView неправильно обрабатывает символы новой строки в предварительно отформатированном тексте Предоставление пользовательского текста для диалогового окна разрешения Android M Использует Scala на Android? Много накладных расходов? Проблемы? Пользовательский макет уведомлений Android с помощью RemoteViews Ошибка: выполнение выполнено для задачи ': app: transformResourcesWithMergeJavaResForDebug' Android-устройство не отображается в списке adb Android 5.1.1 и выше – getRunningAppProcesses () возвращает только мой пакет приложений Событие выпадающего меню Actionbar Не удалось динамически установить параметр setVisibility () Как изменить представление внутри фрагмента? Использование пользовательской кнопки входа с Твиттером Twitter? Откройте диалог, когда я нажму кнопку

Объект AudioRecord не инициализируется

В приведенном ниже коде мой объект audioRecord не инициализируется. Я попытался переместить его в метод onCreate и сделал его глобальным. Я зарегистрировал состояние и возвращает значение 1 что означает готовность к использованию. Отладчик говорит, что startRecording вызывается на неинициализированном объекте. Он также говорит, что он не может получить источник звука.

Почему я получаю эти ошибки?

  package com.tecmark; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import android.app.Activity; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import android.widget.TextView; public class recorder extends Activity { private Thread thread; private boolean isRecording; private AudioRecord recorder; private FileOutputStream os; private BufferedOutputStream bos; private DataOutputStream dos; private TextView text; private int audioSource = MediaRecorder.AudioSource.MIC; private int sampleRate = 22050; private int channel = AudioFormat.CHANNEL_CONFIGURATION_MONO; private int encoding = AudioFormat.ENCODING_PCM_16BIT; private int result = 0; private int bufferSize; private byte[] buffer; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.v("onCreate", "layout set, about to init audiorec obj"); text = (TextView)findViewById(R.id.TextView01); bufferSize = AudioRecord.getMinBufferSize(sampleRate,channel,encoding); buffer = new byte[bufferSize]; recorder = new AudioRecord(audioSource, sampleRate,channel,encoding, AudioRecord.getMinBufferSize(sampleRate, channel,encoding)); Log.i("recorder obj state",""+recorder.getRecordingState()); } public void onClickPlay(View v){ } public void record(){ Log.i("inside record method", "******"); File path = Environment.getExternalStorageDirectory(); Log.v("file path", ""+path.getAbsolutePath()); File file = new File(path, "test.wav"); if(file.exists()){ file.delete(); } path.mkdirs(); Log.v("file path", ""+file.getAbsolutePath()); try { os = new FileOutputStream(file); bos = new BufferedOutputStream(os); dos = new DataOutputStream(bos); } catch (Exception e1) { e1.printStackTrace(); } int bufferSize = AudioRecord.getMinBufferSize(sampleRate,channel,encoding); byte[] buffer = new byte[bufferSize]; recorder.startRecording(); isRecording = true; try{ while (isRecording){ result = recorder.read(buffer, 0, bufferSize); for(int a=0; a<result;a++){ dos.write(buffer[a]); if(!isRecording){ recorder.stop(); break; } } } dos.flush(); dos.close(); }catch(Exception e){ e.printStackTrace(); } }// end of record method public void onClickStop(View v){ Log.v("onClickStop", "stop clicked"); isRecording=false; } public void onClickReverse(View v){ Log.v("onClickReverse", "reverse clicked"); } public void onClickRecord(View v){ Log.v("onClickRecourd", "record clicked, thread gona start"); text.setText("recording"); thread = new Thread(new Runnable() { public void run() { isRecording = true; record(); } }); thread.start(); isRecording = false; } }//end of class 

Logcat

 01-30 15:23:16.724: ERROR/AudioRecord(12817): Could not get audio input for record source 1 01-30 15:23:16.729: ERROR/AudioRecord-JNI(12817): Error creating AudioRecord instance: initialization check failed. 01-30 15:23:16.729: ERROR/AudioRecord-Java(12817): [ android.media.AudioRecord ] Error code -20 when initializing native AudioRecord object. 01-30 15:23:16.729: INFO/recorder obj state(12817): 1 01-30 15:23:16.729: WARN/dalvikvm(12817): threadid=13: thread exiting with uncaught exception (group=0x4001b180) 01-30 15:23:16.729: ERROR/AndroidRuntime(12817): Uncaught handler: thread Thread-7 exiting due to uncaught exception 01-30 15:23:16.739: ERROR/AndroidRuntime(12817): java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord. 01-30 15:23:16.739: ERROR/AndroidRuntime(12817): at android.media.AudioRecord.startRecording(AudioRecord.java:495) 01-30 15:23:16.739: ERROR/AndroidRuntime(12817): at com.tecmark.recorder.record(recorder.java:114) 01-30 15:23:16.739: ERROR/AndroidRuntime(12817): at com.tecmark.recorder$1.run(recorder.java:175) 01-30 15:23:16.739: ERROR/AndroidRuntime(12817): at java.lang.Thread.run(Thread.java:1096) 

Solutions Collecting From Web of "Объект AudioRecord не инициализируется"

Трюк с использованием AudioRecord заключается в том, что у каждого устройства могут быть разные настройки инициализации, поэтому вам придется создать метод, который объединяет все возможные комбинации скоростей передачи, кодирования и т. Д.

 private static int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 }; public AudioRecord findAudioRecord() { for (int rate : mSampleRates) { for (short audioFormat : new short[] { AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT }) { for (short channelConfig : new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO }) { try { Log.d(C.TAG, "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(AudioSource.DEFAULT, rate, channelConfig, audioFormat, bufferSize); if (recorder.getState() == AudioRecord.STATE_INITIALIZED) return recorder; } } catch (Exception e) { Log.e(C.TAG, rate + "Exception, keep trying.",e); } } } } return null; } AudioRecord recorder = findAudioRecord(); recorder.release(); 

У меня была та же проблема, она была решена путем

 <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission> 

В манифест

Согласно javadocs, всем устройствам гарантируется поддержка этого формата (для записи):

44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT.

Для воспроизведения нажмите CHANNEL_OUT_MONO.

Теперь, с леденцом, вам нужно конкретно спросить пользователя о каждом разрешении. Убедитесь, что разрешение предоставлено.

Проблема с инициализацией нескольких объектов AudioRecord может быть исправлена ​​с помощью audioRecord.release(); Перед созданием следующего объекта … Подробнее здесь: Android AudioRecord – не будет инициализировать второй раз

Даже после выполнения всех вышеперечисленных шагов я получал ту же проблему, что сработало для меня, так это то, что мой os был зефиром, и я должен был просить разрешения .

Просто была та же проблема. Решением было перезапустить устройство. Во время игры с кодом я не выпустил объект AudioRecord, который, очевидно, заставлял звуковое устройство застревать. Чтобы проверить, работает ли аудиоустройство или нет, я загрузил Audalyzer из Google Play.

Если ваша мобильная телефонная система – Android M или выше, возможно, вам нужно применить разрешение записи звука в Android M. http://developer.android.com/guide/topics/security/permissions.html

Я заметил, что когда SDCard на avd, который я запускаю, заполняется, конструктор AudioRecord возвращает null. Вы пробовали очистить SDCard?

Я думаю, что это связано с потоком, не зная, что вы приостановили основное действие и все еще пытаетесь записать после того, как остановили рекордер.

Я решил это, изменив методы onResume () и onPause (), чтобы изменить isRecording boolean.

 public void onResume() { ... isRecording = true; } public void onPause() { ... isRecording = false; } 

Затем в вашем потоке startRecording() оба параметра startRecording() и stop() с проверкой if-statements на isRecording:

 if(isRecording) recorder.startRecording(); ... if(isRecording) recorder.stop(); // which you've done 

Я переписал ответ от @DustinB для тех, кто использует Xamarin Android AudioRecord с C #.

 int[] sampleRates = new int[] { 44100, 22050, 11025, 8000 }; Encoding[] encodings = new Encoding[] { Encoding.Pcm8bit, Encoding.Pcm16bit }; ChannelIn[] channelConfigs = new ChannelIn[]{ ChannelIn.Mono, ChannelIn.Stereo }; //Not all of the formats are supported on each device foreach (int sampleRate in sampleRates) { foreach (Encoding encoding in encodings) { foreach (ChannelIn channelConfig in channelConfigs) { try { Console.WriteLine("Attempting rate " + sampleRate + "Hz, bits: " + encoding + ", channel: " + channelConfig); int bufferSize = AudioRecord.GetMinBufferSize(sampleRate, channelConfig, encoding); if (bufferSize > 0) { // check if we can instantiate and have a success AudioRecord recorder = new AudioRecord(AudioSource.Mic, sampleRate, channelConfig, encoding, bufferSize); if (recorder.State == State.Initialized) { mBufferSize = bufferSize; mSampleRate = sampleRate; mChannelConfig = channelConfig; mEncoding = encoding; recorder.Release(); recorder = null; return true; } } } catch (Exception ex) { Console.WriteLine(sampleRate + "Exception, keep trying." + ex.Message); } } } }