Android设备上无谷歌应用的语音识别器

Android设备上无谷歌应用的语音识别器,android,speech-recognition,Android,Speech Recognition,SpeechRecognizer在使用谷歌应用程序(gapp)的安卓系统上运行良好。然而在中国,大多数安卓设备将删除这些谷歌应用。使用语音识别器时会发生什么情况?如果没有实际的设备,我如何测试它 speechRecognizer = SpeechRecognizer.createSpeechRecognizer(getApplicationContext()); speechRecognizer.setRecognitionListener(new CustomListener()); Inte

SpeechRecognizer
在使用谷歌应用程序(gapp)的安卓系统上运行良好。然而在中国,大多数安卓设备将删除这些谷歌应用。使用
语音识别器时会发生什么情况?如果没有实际的设备,我如何测试它

speechRecognizer = SpeechRecognizer.createSpeechRecognizer(getApplicationContext());
speechRecognizer.setRecognitionListener(new CustomListener());
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "zh_HK");
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getClass().getPackage().getName());
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);
intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, false);
intent.putExtra("android.speech.extra.EXTRA_ADDITIONAL_LANGUAGES", new String[]{"zh_HK", "en-US"});
speechRecognizer.startListening(intent);

其中
CustomListener()
实现了
RecognitionListener

我相信您已经了解了以下大部分内容,但为了获得全面的答案:

任何应用程序都可以注册为语音识别提供程序,只要它正确注册语音识别。在三星设备的案例中,Android语音搜索设置将显示两个提供商,Google和Vlingo

Google的
RecognitionService
打包在他们的应用程序中,正如您所知,它依赖于Google Play服务

Vlingo的
识别服务
在其s-Voice应用程序中,该应用程序仅可在三星设备上公开预装-因此不适用于您的问题,但由于我的进一步评论,我提到了这一点

在使用之前,应始终使用静态辅助对象方法:

if (SpeechRecognizer.isRecognitionAvailable(getApplicationContext())) {
    // initialise
   } else {
   // nope
   }
正如《基本法》所引述:

检查上是否有语音识别服务可用 系统。如果此方法返回false,则createSpeechRecognizer(上下文) 将失败

如果识别可用,则返回true,否则返回false

如果您在特定用例中使用此方法,它应该返回false,这样您就不必担心初始化崩溃

值得注意的是,Vlingo在这里将返回true,但实际上永远不会返回语音响应,它只是出于某种原因抛出。真烦人

除上述检查外,您还可以通过执行以下操作查询哪些应用程序(如果有)注册为语音识别提供商:

final List<ResolveInfo> services = context.getPackageManager().queryIntentServices(
                    new Intent(RecognitionService.SERVICE_INTERFACE), 0);
其中,谷歌的软件包名称为
com.Google.android.googlequicksearchbox


最后,我相信你知道还有很多其他的语音识别提供商,他们提供了你可以使用的RESTful服务,而不是让用户边加载GAPP。并非所有产品都是免费的。

如果
Gapps
是通过例如check
com.android.vending安装的,可以通过PackageManager进行检查。如果没有,那么语音识别的另一种方法可能是斯芬克斯:好主意。然而,斯芬克斯的语言文件占用了很多空间。如果不添加检查,上面的代码会崩溃吗?好吧,这是一个很好的问题,如果可以,我会对此投更多的赞成票。但真的……我不知道。如果我从正常情况开始,如果没有包来处理某个操作,那么处理该操作的意图将崩溃。我认为失踪的Gapp也是如此,为什么要用另一种方式来处理呢。避免这种情况可以通过意图来实现。resolveActivity(pckManager)!=null`,我猜。如果你有一些未使用的设备,也许你可以测试它,并在没有gapps的情况下安装cyanogenmod。另一个想法是使用
com.android.vending
在清单中设置
,但我从未尝试为软件提供使用功能。但它是在API中描述的,
用于硬件或软件
。。。。。。
/**
 * Check if the user has a package installed
 *
 * @param ctx         the application context
 * @param packageName the application package name
 * @return true if the package is installed
 */
public static boolean isPackageInstalled(@NonNull final Context ctx, @NonNull final String packageName) {
    try {
        ctx.getApplicationContext().getPackageManager().getApplicationInfo(packageName, 0);
        return true;
    } catch (final PackageManager.NameNotFoundException e) {
        return false;
    }
}