android - SpeechRecognizer.isRecognitionAvailable() 在 Android 11 中始终为 false

标签 android android-11 android-speech-api

顾名思义,SpeechRecognizer.isRecognitionAvailable()在 Android 11 中返回 false,我不确定为什么会这样,因为设备 (Pixel 3 XL) 配备了识别语音的功能。 documentation并不表示它在 API v30 中发生了变化。奇怪的是,即使isRecognitionAvailable,我仍然成功得到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)
}
...

最佳答案

我想出了解决方案。出于某种原因,从 API v30 开始,您必须将以下内容添加到 SpeechRecognizer.isRecognitionAvailable(Context) 的 list 文件中返回真。我的测试发现它仅在放置在 <application> 之外时才有效。标记,即使它提示“此处不允许元素查询”。添加 suppress AndroidElementNotAllowed删除警告。

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

关于android - SpeechRecognizer.isRecognitionAvailable() 在 Android 11 中始终为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64672910/

相关文章:

android - 面向 Android 11 时 SpeechRecognizer 不可用

java - android 中的 HttpURLConnection 不发送正确的 User-Agent header

android - 如何在 kotlin 中获取当前构建变体

android - 如何从具有 OS 11 的 Android 设备获取 mac 地址?

android - 什么是安卓 1 1's equivalent of '/dev/null'

android - 谷歌语音 Api v1 不工作?

android - 按钮在自定义 LinearLayout 中不可点击

android - Amazon Api Gateway 支持什么日期格式?

android - 针对 Android api 版本 30 的应用程序的 Flutter 相机包权限