- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在大多数 Android 设备中,RecognitionService将由 Google 的原生“Now/Assistant”应用程序提供。
在 Android Oreo 之前,我可以使用以下简单代码查询 Google Recognizer 支持的语言:
final Intent vrIntent = new Intent(RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS);
// vrIntent.setPackage("com.google.android.googlequicksearchbox");
getContext().sendOrderedBroadcast(vrIntent, null, new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
// final Bundle bundle = intent.getExtras();
final Bundle bundle = getResultExtras(true);
if (bundle != null) {
if (bundle.containsKey(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES)) {
Log.i("TAG", "onReceive: EXTRA_SUPPORTED_LANGUAGES present");
final ArrayList<String> vrStringLocales = bundle.getStringArrayList(
RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES);
Log.i("TAG", "onReceive: EXTRA_SUPPORTED_LANGUAGES size: " + vrStringLocales.size());
} else {
Log.w("TAG", "onReceive: missing EXTRA_SUPPORTED_LANGUAGES");
}
} else {
Log.w("TAG", "onReceive: Bundle null");
}
}, null, 1234, null, null);
但是,自 8.0+ 起,额外的 RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES
不再包含在响应中。
在我尝试将此作为错误归档之前,我想首先看看其他人是否可以复制 - 但还要检查是否有有序广播 behavioural change in API 26我不知何故忽略了,这可能是造成这种情况的原因。
提前致谢。
最佳答案
所以,我无法复制,但进一步的评论,如果你不设置包名称
vrIntent.setPackage("com.google.android.googlequicksearchbox");
然后它失败了,否则对我来说一切正常。
这是我用来测试它的基本 Activity 。
package it.versionestabile.stackover001;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.speech.RecognizerIntent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.ArrayList;
import static java.security.AccessController.getContext;
/**
* https://stackoverflow.com/questions/48500077/recognizerintent-action-get-language-details-in-oreo
*/
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Intent vrIntent = new Intent(RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS);
vrIntent.setPackage("com.google.android.googlequicksearchbox");
PackageManager packageManager = getPackageManager();
for (PackageInfo packageInfo: packageManager.getInstalledPackages(0)) {
if (packageInfo.packageName.contains("com.google.android.googlequicksearchbox"))
Log.d("AAA", packageInfo.packageName + ", " + packageInfo.versionName);
}
this.sendOrderedBroadcast(vrIntent, null, new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
// final Bundle bundle = intent.getExtras();
final Bundle bundle = getResultExtras(true);
if (bundle != null) {
if (bundle.containsKey(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES)) {
Log.i("TAG", "onReceive: EXTRA_SUPPORTED_LANGUAGES present");
final ArrayList<String> vrStringLocales = bundle.getStringArrayList(
RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES);
Log.i("TAG", "onReceive: EXTRA_SUPPORTED_LANGUAGES size: " + vrStringLocales.size());
} else {
Log.w("TAG", "onReceive: missing EXTRA_SUPPORTED_LANGUAGES");
}
} else {
Log.w("TAG", "onReceive: Bundle null");
}
}
}, null, 1234, null, null);
}
}
我已经在 Android Studio 2.3 和 3.0.1 以及使用 API 26 和 27 的模拟器上对其进行了测试。
以上代码一切正常。
但是如果你注释掉这一行:
vrIntent.setPackage("com.google.android.googlequicksearchbox");
在奥利奥上它不起作用。
我仍然建议以如下方式使用包管理器检查 Google Now 是否存在:
PackageManager packageManager = getPackageManager();
for (PackageInfo packageInfo: packageManager.getInstalledPackages(0)) {
if (packageInfo.packageName.contains("com.google.android.googlequicksearchbox"))
Log.d("AAA", packageInfo.packageName + ", " + packageInfo.versionName);
// TODO - set a boolean value to discriminate the precence of google now
}
为了确定您是否拥有正确版本的 Google Now。
希望对您有所帮助!
关于java - Oreo 中的 RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48500077/
我正在尝试让 RecognizerIntent 遵循我设置为收听的自定义语言,但它不起作用。看起来它只是不使用我发送的参数,只考虑系统设置(如果我更改系统的语音搜索设置,它确实有效)。 这就是我创建
我正在开发一项 Android 服务。我需要从服务调用 RecognizerIntent 以便在服务中使用已识别的文本。我在 Service 类中没有 startActivityForResult()
是否可以让 RecognizerIntent 或任何其他在 android 中使用语音识别的方式来检测您正在说的语言,并以该语言发送结果。比如,如果我说一个罗马尼亚语词,检测到它是罗马尼亚语,然后把那
我正在尝试构建可以帮助我像 Google 语音搜索一样调用联系人的应用程序,但是通过 RecognizerIntent 使用 Google 语音使用捷克语。 怎么了,它好像没有浏览我的联系人列表。 假
如果 RecognizerIntent 由于用户未说话而结束,如何处理图像 (ImageView) 的可见性 if (RecognizerIntent.EXTRA_RESULTS == null){
我正在尝试运行我在官方 android 开发者页面中找到的以下识别器 Intent 示例: http://developer.android.com/resources/samples/ApiDemo
我用这段代码启动 RecognizerIntent: Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); int
我写了这段代码: Intent voiceSearchIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); voiceSearc
语音识别: 我使用此代码来检测: Intent myintent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); myi
我正在研究 android.speech 包是如何工作的,我注意到语音识别器忽略了 Intent RecognizerIntent.ACTION_WEB_SEARCH 中使用的大部分额外内容。 如果我
我的应用程序使用 RecognizerIntent 来记录用户的声音并进行一些语音识别。 现在,我想将结果与一些开源语音识别引擎进行比较。他们中的大多数将音频文件作为输入。我的想法是,从 Androi
我正在 android 模拟器上尝试语音识别功能,但是当我尝试在我的模拟器上使用 2.1 启动识别器 Intent 时,没有 Activity 存在。为什么它不是开箱即用的?正常吗?是否可以安装支持?
在我的主要 Activity 中,我启动了一个新的 Intent: Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEEC
在大多数 Android 设备中,RecognitionService将由 Google 的原生“Now/Assistant”应用程序提供。 在 Android Oreo 之前,我可以使用以下简单代码
我正在使用 RecognizerIntent 开发 Android 语音识别应用。客户端关心的是设备和谷歌语音识别服务器之间传输的数据以及是否可以拦截。 我发现关于什么格式以及如何来回发送数据的文档很
我使用以下代码在 Android 中启动语音识别: PackageManager pm = getPackageManager(); List activities = pm.queryIntentA
我在 Android 2.2 上使用 RecognizerIntent API 时遇到问题。当我使用此代码调用 API 时: Intent intent = new Intent(Recognizer
我正在使用 android 应用程序 RecognizerIntent.ACTION_RECOGNIZE_SPEECH,,, 我的问题是我不知道如何 创建将捕获用户输入的语音的缓冲区。一世 阅读了很多
我正在尝试在 Samsung Galaxy S 手机上使用语音识别(因为我知道 emu 没有这个 Intent )。 Galaxy S 有一个 2.1 Android ROM。出于某种原因,我了解到设
我安装了开源Kõnele ( source code ) 的目的是研究如何编写和注册自定义语音识别服务。作为第一步,在深入研究源代码之前,我尝试验证它确实按我预期的那样工作。所以,我转到手机的系统设置
我是一名优秀的程序员,十分优秀!