2011-01-05 17 views
8

Ho una parte di riconoscimento vocale nella mia applicazione per catturare l'input vocale degli utenti.Come rilevare se un microfono è presente in Android?

Questo è quello che faccio

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

Questo funziona bene sulla maggior parte dei dispositivi, ma ora, poiché le compresse sono sempre più diffuse e alcuni di loro non hanno un microfono, si genera un errore

W/dalvikvm (408): threadid = 1: filetto uscendo con eccezione non rilevata (gruppo = 0x40015560) E/AndroidRuntime ( 408): eccezione irreversibile: main E/AndroidRuntime (408): android.c ontent.ActivityNotFoundException: trovate attività per gestire Intent { atto = android.speech.action.RECOGNIZE_SPEECH (ha comparse)} E/AndroidRuntime ( 408): a android.app.Instrumentation.checkStartActivityResult (Instrumentation.java: 1408) .....

Quindi voglio rilevare se il microfono è presente prima di consentire all'utente di accedere alla funzione di input vocale. Come posso rilevare se sul dispositivo è presente un microfono.

Grazie.

+0

Hai trovato la soluzione? – blackfyre

+0

Perché non limitarsi a rilevare l'eccezione? Lo sto facendo in una delle mie applicazioni, quando provo ad aprire uno scanner di codici a barre. Funziona bene –

+0

L'acquisizione di un'eccezione risolve il problema di impedire l'arresto anomalo dell'app se rileviamo l'eccezione giusta. Ma perché prendere l'eccezione quando puoi risolverlo nel modo giusto? Significa anche che devo prendere solo le eccezioni causate dal fatto che il microfono è assente o gli assenti del discorso sono assenti. Cosa succede se si è schiantato per qualche altro motivo e le eccezioni stanno catturando anche quelli? Effettuando i controlli giusti, sarò in grado di intraprendere azioni alternative quando necessario. Detto questo, se quello che stai facendo funziona perfettamente per te, potresti non aver bisogno di cambiarlo :). – achie

risposta

2

Ho aggiunto un'altra risposta, ma questo è solo un collegamento che è stato interrotto dopo un po 'di tempo, ma qui è la risposta corretta che include il codice.

Questo è il codice che è necessario utilizzare per avviare l'intento del riconoscimento vocale. Questo controlla se ci sono intenzioni disponibili per gestire l'intento di riconoscimento vocale.

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(); 
} 

Nella parte superiore di questo è anche possibile fare un altro controllo per vedere se il microfono stesso è presente sul 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 Reference: hasSystemFeature

Problemi correlati