2011-01-05 28 views
8

Mam część rozpoznawania głosu w mojej aplikacji do przechwytywania głosu użytkownika.Jak wykryć obecność mikrofonu w systemie Android?

To co robię

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

Działa to dobrze na większości urządzeń, ale teraz, ponieważ tabletki są coraz bardziej popularne, a niektóre z nich nie mają mikrofonu, to zgłasza błąd

w/dalvikvm (408) ThreadID = 1: nić wyjściu z nieprzechwyconego wyjątkiem (grupa = 0x40015560) E/Android Runtime ( 408) krytyczny wyjątek: główny E/Android Runtime (408): android.c ontent.ActivityNotFoundException: brak aktywności stwierdzono, że uchwyt Intent { act = android.speech.action.RECOGNIZE_SPEECH dodatki umieszczone (HAS)} E/Android Runtime ( 408) w android.app.Instrumentation.checkStartActivityResult (Instrumentation.java: 1408) .....

Chcę więc sprawdzić, czy mikrofon jest obecny, zanim zezwolę użytkownikowi na dostęp do funkcji wprowadzania głosowego. Jak wykryć obecność mikrofonu w urządzeniu?

Dziękuję.

+0

Znalazłeś rozwiązanie? – blackfyre

+0

Dlaczego po prostu nie złapać wyjątku? Robię to w jednej z moich aplikacji, kiedy próbuję otworzyć skaner kodów kreskowych. To działa dobrze. –

+0

Złapanie wyjątku rozwiązuje problem zapobiegania awariom aplikacji, jeśli wykryjemy właściwy wyjątek. Ale dlaczego złapać wyjątek, kiedy możesz go rozwiązać we właściwy sposób? Oznacza to również, że muszę złapać tylko te wyjątki, które są przyczyną, ponieważ mikrofon jest nieobecny lub nie ma mowy o intencji. Co jeśli rozbiłoby się z jakiegoś innego powodu, a wyjątki też ich złapią? Dokonując odpowiednich kontroli, będę w stanie podjąć alternatywne działania w razie potrzeby. Powiedziawszy, że jeśli to, co robisz, działa idealnie, nie musisz go zmieniać :). – achie

Odpowiedz

2

Dodałem kolejną odpowiedź, ale jest to po prostu link, który został przerwany po pewnym czasie, ale tutaj jest poprawna odpowiedź, która zawiera kod.

Jest to kod, którego należy użyć, aby rozpocząć zamiar rozpoznawania głosu. Sprawdza, czy istnieją jakieś zamiary dostępne do obsługi zamiaru rozpoznawania mowy.

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

Oprócz tego możesz zrobić jeszcze jedną kontrolę, aby sprawdzić, czy sam mikrofon znajduje się w urządzeniu.

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

Powiązane problemy