如何在安卓系统中检测麦克风是否存在?

8

我在我的应用程序中添加了语音识别部分,以捕获用户的语音输入。

这是我的操作:

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

这在大多数设备上都可以正常工作,但现在由于平板电脑越来越流行,其中一些平板电脑没有麦克风,因此会抛出错误。

W/dalvikvm( 408): threadid=1: thread exiting with uncaught exception (group=0x40015560) E/AndroidRuntime( 408): FATAL EXCEPTION: main E/AndroidRuntime( 408): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.speech.action.RECOGNIZE_SPEECH (has extras) } E/AndroidRuntime( 408): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1408) .....

因此,我想在让用户使用语音输入功能之前检测麦克风是否存在。如何检测设备上是否存在麦克风。

谢谢。


为什么不直接捕获异常?我在我的一个应用程序中这样做,当我尝试打开条形码扫描器时。这很好地解决了问题。 - Tobi N
捕获异常解决了防止应用程序崩溃的问题,如果我们捕获正确的异常。但是为什么要捕获异常,当您可以以正确的方式解决它呢?这也意味着我只需捕获由于麦克风缺失或语音意图缺失而引起的那些异常。如果出现其他原因导致崩溃并且异常也会捕获到它们怎么办?通过进行正确的检查,我将能够在必要时采取替代措施。话虽如此,如果您正在做的工作对您来说非常完美,则可能不需要更改 :)。 - achie
2个回答

8
PackageManager pm = getPackageManager();
boolean micPresent = pm.hasSystemFeature(PackageManager.FEATURE_MICROPHONE);

Android API Reference: hasSystemFeature


1

我添加了另一个答案,但那只是一个链接,在一段时间后就会失效,但这里是正确的答案,其中包括代码。

这是您需要使用的代码,以启动语音识别器意图。它会检查是否有任何意图可用来处理语音识别意图。

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
}

  1. 'pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);'
根据设备上安装的应用程序而定,因此它不能告诉我们是否有麦克风,只能暗示。
  1. 'getPackageManager().hasSystemFeature("android.hardware.microphone")'
当麦克风从设备上物理断开连接时返回“true”。遗憾的是,我还没有找到可行的解决方案。
- Matan Koby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接