2011-01-05 22 views
8

Tengo una parte de reconocimiento de voz en mi aplicación para capturar la entrada de voz de los usuarios.¿Cómo detectar si un micrófono está presente en Android?

Esto es lo que hago

Intent voiceIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
startActivityForResult(voiceIntent, REQUEST_CODE); 

Esto funciona bien en la mayoría de los dispositivos, pero ahora ya que las tabletas son cada vez más populares y algunos de ellos no tienen un micrófono, que arroja un error

W/dalvikvm (408): threadID = 1: hilo salir con excepción no detectada (grupo = 0x40015560) E/Android Runtime ( 408): excepción grave: principal E/Android Runtime (408): android.c ontent.ActivityNotFoundException: no hemos encontrado actividad de manejar Intención { act = android.speech.action.RECOGNIZE_SPEECH (tiene extras)} E/Android Runtime ( 408): a android.app.Instrumentation.checkStartActivityResult (Instrumentation.java: 1408) .....

por lo que quiero para detectar si el micrófono está presente antes de permitir el acceso al usuario la función de entrada de voz. ¿Cómo puedo detectar si hay un micrófono presente en el dispositivo?

Gracias.

+0

¿Ha encontrado la solución? – blackfyre

+0

¿Por qué no simplemente atrapar la excepción? Lo hago en una de mis aplicaciones cuando intento abrir un escáner de código de barras. Eso funciona bien –

+0

La captura de una excepción soluciona el problema de impedir que la aplicación se bloquee si detectamos la excepción correcta. Pero, ¿por qué atrapar la excepción cuando puedes resolverla de la manera correcta? También significa que tengo que atrapar solo aquellas excepciones que son causa porque el micrófono está ausente o las intenciones del habla están ausentes. ¿Qué pasa si se bloquea por alguna otra razón y las excepciones son atrapadas también? Al hacer los controles correctos, podré tomar medidas alternativas cuando sea necesario. Habiendo dicho eso, si lo que estás haciendo funciona perfecto para ti, es posible que no necesites cambiarlo :). – achie

Respuesta

2

Agregué otra respuesta, pero ese es solo un enlace que se rompió después de un tiempo, pero aquí está la respuesta correcta que incluye el código.

Este es el código que necesitaría usar para iniciar el intento del reconocedor de voz. Esto verifica si hay intenciones disponibles para manejar el intento de reconocimiento de voz.

PackageManager pm = getPackageManager(); 
List<?> activities = pm.queryIntentActivities(
         new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); 
if (activities.size() > 0) { 
    Intent voiceIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    voiceIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 5); 
    startActivityForResult(voiceIntent, REQUEST_CODE); 

    Toast toast = Toast.makeText(this, "Loading Voice recognizer...", Toast.LENGTH_SHORT); 
    toast.show(); 
} else { 
    Toast.makeText(this, 
        "This action is not available on this device.", 
        Toast.LENGTH_SHORT).show(); 
} 

Además de eso, puede hacer otra comprobación para ver si el micrófono está presente en el dispositivo.

if (getPackageManager().hasSystemFeature("android.hardware.microphone")) { 
    //Microphone is present on the device 
} 
8
PackageManager pm = getPackageManager(); 
boolean micPresent = pm.hasSystemFeature(PackageManager.FEATURE_MICROPHONE); 

Android API Referencia: hasSystemFeature

Cuestiones relacionadas