在大多数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
,响应中不再包含多余的内容。
在尝试将此错误记录为错误之前,我想首先查看其他程序是否可以复制-而且还要检查是否以某种方式忽略了API
26中
的有序广播行为更改,这可能是导致这种情况的原因。
提前致谢。
因此,如果您未设置程序包名称,我将无法复制,但只能进一步注释
vrIntent.setPackage("com.google.android.googlequicksearchbox");
那就失败了,否则一切对我来说都很好。
这是我用来测试的基本活动。
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");
在奥利奥(Oreo)上不起作用。
而且我仍然建议通过以下方式通过Package Manager检查Google即时的存在性:
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即时版本。
希望能帮助到你!
对于新的Android应用程序更新,我必须将设置为26。 当我这样做时,我会在以下函数()中遇到自动售货许可库的问题: 我知道这些功能已经过时了,但是Android自动售货授权库没有更新版本,我也找不到如何让它适用于奥利奥,或者通常适用于高于Android19的版本,这是我现在使用的。 谁能帮上忙? ps.不工作。应用程序会直接崩溃。
[https://developer.android.com/about/versions/oreo/background.html]-真的没有办法为我的用例(但最好是为所有用例)提供永久的后台服务吗?
我在和前台服务作斗争。在我的设备(Redmi 5 Plus,Android 8.1.0)上,当应用程序从最近的应用程序中删除时,服务通知将不再可见。在其他设备(Android5.0.1、Android7.0)和模拟器(Android8.1-API27)上,当应用程序从最近的应用程序中删除时,通知仍然可见。 在main activity中,我使用启动服务。 这是我的舱单文件: 我错过了什么?它是与后
当我们转到android设置->系统->语言&输入->高级->自动填充服务->无时,然后关注不再崩溃。 我们如何在不禁用设备上新的8.0自动填充服务的情况下防止崩溃发生?
我已经试过了 > 在应用程序中创建自定义通知通道。 在Oreo设备上使用启动服务。