2011-01-05 37 views
8

我的應用程序中有一個語音識別部分來捕捉用戶的語音輸入。如何檢測話筒是否存在於android中?

這是我做的

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

也能正常工作的大部分設備,但現在由於平板電腦越來越流行,其中一些沒有麥克風,它拋出一個錯誤

W/dalvikvm(408):線程ID = 1:螺紋 與未捕獲的異常 (組= 0x40015560)E/AndroidRuntime( 408)退出:致命異常:主 E/AndroidRuntime(408): android.c ontent.ActivityNotFoundException: 無活動處理意圖{ ACT = android.speech.action.RECOGNIZE_SPEECH (具有額外)} E/AndroidRuntime( 408):在 android.app.Instrumentation.checkStartActivityResult(Instrumentation.java: 1408) .....

所以我想在我讓用戶訪問語音輸入功能之前檢測麥克風是否存在。如何檢測設備上是否有麥克風。

謝謝。

+0

你找到解決辦法嗎? – blackfyre 2012-08-30 07:37:49

+0

爲什麼不簡單地捕捉異常?當我嘗試打開條形碼掃描儀時,我在我的一個應用程序中執行此操作。這工作正常。 – 2013-01-21 17:43:30

+0

捕捉異常解決了防止應用程序崩潰的問題,如果我們捕捉到正確的異常。但是,如果你能以正確的方式解決這個問題,爲什麼要抓住例外呢這也意味着我只能捕捉那些由於麥克風不存在或者語音意圖不存在而導致的異常。如果因爲其他原因而崩潰又會如何呢?例外情況也會如此呢?通過做出正確的檢查,我可以在必要時採取替代措施。話雖如此,如果你所做的工作對你來說很完美,你可能不需要改變它:)。 – achie 2013-01-21 18:20:47

回答

2

我添加了另一個答案,但這只是一段時間後被打破的鏈接,但這裏是包含代碼的正確答案。

這是您需要用來啓動語音識別器意圖的代碼。這將檢查是否有任何意圖可用於處理語音識別意圖。

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

最重要的是,您還可以另外檢查一下,看看麥克風本身是否存在於設備上。

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參考:hasSystemFeature