Android AudioRecord.read devuelve una matriz de 0 elementos

Lo que estoy tratando de hacer: Estoy tratando de escribir un programa que lee audio desde el micrófono android (sin grabación) y captura alguna medida de lo alto que es usar un servicio. Por ahora estoy enviando un pulso de mi actividad a mi servicio para obtener una lectura de sonido rápida y comprobar la impresión Logcat de la amplitud como mi volúmetro.

Mi problema: El método de lectura de AudioRecord devuelve 0.

Lo que he probado: Grabar audio completo en lugar de usar el NullOutputStream no hace ninguna diferencia. Algunas versiones anteriores comenzaron a funcionar aleatoriamente después de que algunos cambios triviales como una llamada logcat se agregaran y luego dejaran de funcionar más tarde.

Mis pensamientos: Pensé originalmente que tal vez el micrófono estaba siendo utilizado por otra aplicación, pero todavía devuelve 0 incluso cuando este es el único servicio notable que se está ejecutando.

Mi servicio:

import org.apache.commons.io.output.NullOutputStream; public class RecordingService extends Service { public static final int SAMPLE_RATE = 16000; private AudioRecord mRecorder; private File mRecording; private short[] mBuffer; public static final NullOutputStream NULL_OUTPUT_STREAM = new NullOutputStream(); public double amplitude = 0.0; public String TAG = "TAG"; public void onCreate() { super.onCreate(); } public int onStartCommand(Intent intent, int flags, int startId){ initRecorder(); mRecorder.startRecording(); mRecording = getFile("raw"); startBufferedWrite(mRecording, intent); mRecorder.stop(); mRecorder.release(); stopSelf(); return START_STICKY; } private void initRecorder() { int bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); mBuffer = new short[bufferSize]; mRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize); } private void startBufferedWrite(final File file, Intent intent) { Log.i(TAG, "WRITING"); new Thread(new Runnable() { @Override public void run() { DataOutputStream output = null; Log.i(TAG, "running"); try { output = new DataOutputStream(NULL_OUTPUT_STREAM); Log.i(TAG, "outputset"); double sum = 0; //problems! Log.i(TAG, "mBufferlength= " + mBuffer.length); int readSize = mRecorder.read(mBuffer, 0, mBuffer.length); Log.i(TAG, "readSize1= " + readSize); Log.i(TAG, mBuffer.toString()); //problems! Log.i(TAG, "read"); for (int i = 0; i < readSize; i++) { output.writeShort(mBuffer[i]); sum += mBuffer[i] * mBuffer[i]; } Log.i(TAG, "summed up"); if (readSize > 0) { Log.i(TAG, "readSize2= "+readSize); Log.i(TAG, "setting progress"); amplitude = sum / readSize; Log.i(TAG, "amplitude= " + amplitude); Log.i(TAG, "sqrt= " + Math.sqrt(amplitude)); } else { Log.i(TAG, "readsize <= 0"); } } catch (IOException e) { Log.e(TAG, e.getMessage()); } finally { if (output != null) { try { output.flush(); } catch (IOException e) { Log.e(TAG, e.getMessage()); } finally { try { output.close(); } catch (IOException e) { Log.e(TAG, e.getMessage()); } } } } } }).start(); } private File getFile(final String suffix) { Time time = new Time(); time.setToNow(); return new File(Environment.getExternalStorageDirectory(), time.format("%Y%m%d%H%M%S") + "." + suffix); } public void onDestroy() { super.onDestroy(); } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } } 

mi actividad:

 public class RecordingActivity extends Activity { private final String startRecordingLabel = "Start recording"; public String TAG = "TAG"; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Button button = (Button) findViewById(R.id.button); button.setText(startRecordingLabel); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { Intent intent = new Intent(RecordingActivity.this, RecordingService.class); Toast.makeText(RecordingActivity.this, "started", Toast.LENGTH_SHORT).show(); RecordingActivity.this.startService(intent); } }); } @Override public void onDestroy() { super.onDestroy(); } } 

Es mi primer post, pero espero que sea fácil de seguir. ¡Gracias!

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.