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:
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;
}
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? –
Esto es realmente extraño. ¿Has probado probando las condiciones inversas y anidando tus bloques if, y por lo tanto no usando 'continue'? –
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