SpeechRecognizer
效果很好在Android与谷歌企业应用套件(GAPPS)说。 然而,在中国,大多数的Android设备将删除这些谷歌企业应用套件。 当会发生什么SpeechRecognizer
使用? 我怎么能测试没有实际设备?
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
。
我敢肯定,你是知道的最以下的,但对于一个全面的答案的缘故:
任何应用程序可以作为语音识别的提供者,只要其寄存器中的寄存器, RecognitionService正确。 在三星设备的情况下,Android的语音搜索设置会显示两个供应商,谷歌和Vlingo的。
谷歌的RecognitionService
是其内包装的谷歌“现在”的应用程序,这是大家都知道,是依赖于谷歌播放服务。
Vlingo的的RecognitionService
是它们的S-Voice的应用程序,这是唯一可以公开预装在三星设备中-所以不是真的适用于你的问题,但我提到由于我的评论进一步下降。
在你使用SpeechRecognizer ,你应该总是使用静态辅助方法:
if (SpeechRecognizer.isRecognitionAvailable(getApplicationContext())) {
// initialise
} else {
// nope
}
正如引述方法的文档 :
检查语音识别服务是否可用在系统上。 如果此方法返回false,createSpeechRecognizer(上下文)将失败。
如果承认是可用的,否则为假,则返回true
如果您在特定使用情况下使用这种方法,它应该返回假的,所以你不必担心初始化崩溃。
作为一个说明,Vlingo的将返回true这里,但从来没有真正恢复的语音响应,它只是抛出ERROR_NETWORK出于某种原因。 它很烦人。
除了上面的检查,你也可以查询,如果有的话,申请登记为执行以下操作,语音识别提供商:
final List<ResolveInfo> services = context.getPackageManager().queryIntentServices(
new Intent(RecognitionService.SERVICE_INTERFACE), 0);
任何空单,就意味着没有供应商可供选择。
最后,在评论中提到的,你总是可以高音检查,并确保谷歌应用程序安装:
假设你靶向果冻豆+我用下面的便捷方法:
/**
* 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;
}
}
当谷歌的软件包名称是com.google.android.googlequicksearchbox
非常最后,而不是让用户侧负荷GAPPS的头痛,我敢肯定你知道还有很多其他的语音识别提供商在那里,你可以使用谁提供RESTful服务。 并非所有的都是免费的通过。