【问题标题】:How to get device's default SpeechService provider - Android API 13如何获取设备的默认 SpeechService 提供程序 - Android API 13
【发布时间】:2022-09-27 23:33:54
【问题描述】:
根据this page,Android 13 删除了 SpeechService 实现,包括 RecognitionService。它还提到:
\"应用程序应使用设备的默认语音服务提供程序,而不是硬编码特定的应用程序。\"
这是我在小于 13 的 API 上使用的代码:
String GOOGLE_RECOGNITION_SERVICE_NAME =
\"com.google.android.googlequicksearchbox/com.google.android.voicesearch.serviceapi.GoogleRecognitionService\";
SpeechRecognizer speechRecognizer = SpeechRecognizer.createSpeechRecognizer(context,
ComponentName.unflattenFromString(GOOGLE_RECOGNITION_SERVICE_NAME));
关于如何获取设备的 SpeechService 默认提供程序的任何想法?
标签:
android
speech-recognition
【解决方案1】:
我通过实现以下代码解决了这个问题:
public static String getAvailableVoiceRecognitionService(Activity activity)
{
final List<ResolveInfo> services = activity.getPackageManager().queryIntentServices(
new Intent(RecognitionService.SERVICE_INTERFACE), 0);
String recognitionServiceName = null;
for (final ResolveInfo info : services)
{
String packageName = info.serviceInfo.packageName;
String serviceName = info.serviceInfo.name;
String testRecognitionServiceName = packageName + "/" + serviceName;
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
Intent serviceIntent = new Intent(RecognitionService.SERVICE_INTERFACE);
ComponentName recognizerServiceComponent =
ComponentName.unflattenFromString(testRecognitionServiceName);
if (recognizerServiceComponent != null)
{
serviceIntent.setComponent(recognizerServiceComponent);
try
{
boolean isServiceAvailableToBind = activity.bindService(serviceIntent, connection, Context.BIND_AUTO_CREATE);
if (isServiceAvailableToBind) {
activity.unbindService(connection);
recognitionServiceName=testRecognitionServiceName;
break;
}
}
catch (SecurityException e)
{
e.printStackTrace();
}
}
}
return recognitionServiceName;
}
然后启动 SpeechRecognizer 你做:
public void initSpeechRecognition(Activity activity)
{
String recognitionServiceName = getAvailableVoiceRecognitionService(activity);
if (recognitionServiceName==null)
return;
speechRecognizer = SpeechRecognizer.createSpeechRecognizer(activity,
ComponentName.unflattenFromString(recognitionServiceName));
}