2012-02-05 10 views
5

Tengo un método que intenta crear un AudioRecord. Diferentes teléfonos admiten diferentes frecuencias de muestreo, configuraciones de canales y formatos de audio. Entonces, el método intenta crear un AudioRecord para cada uno de ellos y devolver el primero que funcione.Mi declaración de "devolución" no funciona incluso cuando no hay otras ramas de código

private AudioRecord getAudioRecord() { 
    for (int rate: sampleRates) { 
     for (int audioFormat: audioFormats) { 
      for (int channelConfig: channelConfigs) { 
       String description = rate + "Hz, bits: " + audioFormat 
         + ", channel: " + channelConfig; 

       Log.d(TAG, "Trying: " + description); 

       int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat); 
       if (bufferSize == AudioRecord.ERROR 
         || bufferSize == AudioRecord.ERROR_BAD_VALUE) { 
        Log.d(TAG, "Failed: This rate/channel config/format is not supported"); 
        continue; 
       } 

       AudioRecord recorder = new AudioRecord(AudioSource.MIC, rate, channelConfig, audioFormat, bufferSize); 
       if (recorder.getState() == AudioRecord.STATE_UNINITIALIZED) { 
        Log.d(TAG, "Failed: Recorder is uninitialized"); 
        continue; 
       } 

       Log.d(TAG, "Success: " + description); 
       return recorder; 
      } 
     } 
    } 

    Log.e(TAG, "Failed all rates. Does the device have a microphone?"); 
    return null; 
} 

El problema es return recorder ¡nunca sucede!

Aquí está mi salida Logcat:

Logcat output

En la línea resaltada (8000/3/12) no hay ningún error, pero también sin éxito.

Si utilizo no continue como dije en los comentarios debajo, ¡todavía no vuelve!

private AudioRecord getAudioRecord() { 
    for (int rate: sampleRates) { 
     for (int audioFormat: audioFormats) { 
      for (int channelConfig: channelConfigs) { 
       String description = rate + "Hz, bits: " + audioFormat 
         + ", channel: " + channelConfig; 

       Log.d(TAG, "Trying (2): " + description); 

       int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat); 
       if (bufferSize != AudioRecord.ERROR && bufferSize != AudioRecord.ERROR_BAD_VALUE) { 
        AudioRecord recorder = new AudioRecord(AudioSource.MIC, rate, channelConfig, audioFormat, bufferSize); 
        if (recorder.getState() == AudioRecord.STATE_INITIALIZED) { 
         Log.d(TAG, "Success: " + description); 
         return recorder; 
        } else { 
         Log.d(TAG, "Failed: Recorder is uninitialized"); 
        } 
       } else { 
        Log.d(TAG, "Failed: This rate/channel config/format is not supported"); 
       } 
      } 
     } 
    } 

    Log.e(TAG, "Failed all rates. Does the device have a microphone?"); 
    return null; 
} 
+1

El mismo patrón (un intento iniciado sin un éxito o error posterior) ocurre otras 3 veces en el registro también. Casi parece que un bloque try/catch está comiendo una excepción (o emitiendo una declaración silenciosa de continuación). ¿La muestra de código que proporcionó * exactamente * qué generó el registro? –

+0

Esto es realmente extraño. ¿Has probado probando las condiciones inversas y anidando tus bloques if, y por lo tanto no usando 'continue'? –

+0

Al igual que @SeanReilly menciona, realmente parece que este no es el código que genera la salida de registro. Dos mensajes 'Trying' seguidos ahora parecen posibles a menos que haya un' break; 'o' continue; 'que falta en la lista de códigos. ¿Has intentado limpiar y reconstruir tu aplicación para asegurarte de que las clases estén actualizadas? ¿Habe intentado usar el depurador y recorrer el código? – Gray

Respuesta

0

envolver su función en un bloque try/catch y que probablemente encontrará que algo está causando una excepción a ser lanzado.

+1

Si se lanza una excepción, irá a la pila de llamadas hasta que se capture. La iteración se detendría de inmediato. –

1

No hay problema con la instrucción de retorno, que nunca llegan simplemente porque su AudioRecord nunca se inicializa (La mayoría de los ejemplos por ahí no verificarlo, a pesar de que probablemente debería)

Como breve cordura cheque Puede desea verificar su archivo de Manifiesto al verify you have the proper permissions para grabar audio en primer lugar, dado que el acceso al micrófono es una función de hardware que puede o no existir.

Cuestiones relacionadas