在安卓11中,SpeechRecognizer.isRecognitionAvailable()始终为false。

7
正如标题所示,在Android 11中,SpeechRecognizer.isRecognitionAvailable()返回false,我不确定为什么,因为设备(Pixel 3 XL)应该能够识别语音。 文档 没有指出API v30是否更改了这一点。奇怪的是,即使isRecognitionAvailable为false,我仍然成功获得STT提示。下面是说明此点的示例代码。为什么isRecognitionAvailable检查总是错误的?代码并不完整,但我已经添加了相关重要部分:
AndroidManifest.xml
...
<uses-permission android:name="android.permission.RECORD_AUDIO" />
...

MainActivity.kt
...
override fun onCreate(savedInstanceState: Bundle?) {
...
    if(ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
        if(shouldShowRequestPermissionRationale(Manifest.permission.RECORD_AUDIO)) { //rationale prompt
        }
        val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()
        ){ isGranted: Boolean ->
            if(isGranted) { checkSTT() }
            else { //error perms not granted
            }
        requestPermissionLauncher.launch(Manifest.permission.RECORD_AUDIO)
    } else { checkSTT() }
}

private fun checkSTT() {
    if(SpeechRecognizer.isRecognitionAvailable(this)) { runSTT() }
    else { runSTT() //Run anyway because isRecognitionAvailable is always false and STT works anyway?
    }
}

private fun runSTT() {
    //Yes, I know this is deprecated
    val sttIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
    sttIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
    sttIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.US)
    startActivityForResult(sttIntent, 1)
}
...
1个回答

18

我找到了解决方案。由于某种原因,在API v30中,您必须将以下内容添加到清单文件中,以便SpeechRecognizer.isRecognitionAvailable(Context)返回true。我的测试发现,即使它抱怨“不允许在此处查询元素”,但只有在放置在<application>标签之外时才起作用。添加suppress AndroidElementNotAllowed以删除警告。

<!--suppress AndroidElementNotAllowed -->
<queries>
    <intent>
        <action android:name="android.speech.RecognitionService" />
    </intent>
</queries>
<application...

另一种解决“AndroidElementNotAllowed”的方法是将您的项目gradle版本升级到最新版本。 - programmer dreamer

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