summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/test-current.txt1
-rw-r--r--core/java/android/speech/SpeechRecognizer.java49
2 files changed, 28 insertions, 22 deletions
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 268a9d9f046d..a90a0a4ff28a 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -2396,6 +2396,7 @@ package android.service.watchdog {
package android.speech {
public class SpeechRecognizer {
+ method @MainThread @NonNull public static android.speech.SpeechRecognizer createOnDeviceTestingSpeechRecognizer(@NonNull android.content.Context);
method @RequiresPermission(android.Manifest.permission.MANAGE_SPEECH_RECOGNITION) public void setTemporaryOnDeviceRecognizer(@Nullable android.content.ComponentName);
}
diff --git a/core/java/android/speech/SpeechRecognizer.java b/core/java/android/speech/SpeechRecognizer.java
index 94da93e9a2cf..3cdd8b8d8436 100644
--- a/core/java/android/speech/SpeechRecognizer.java
+++ b/core/java/android/speech/SpeechRecognizer.java
@@ -260,23 +260,7 @@ public class SpeechRecognizer {
ComponentName componentName =
ComponentName.unflattenFromString(
context.getString(R.string.config_defaultOnDeviceSpeechRecognitionService));
- if (componentName == null) {
- return false;
- }
-
- List<ResolveInfo> resolveInfos =
- context.getPackageManager().queryIntentServices(
- new Intent(RecognitionService.SERVICE_INTERFACE), 0);
- if (resolveInfos == null) {
- return false;
- }
-
- for (ResolveInfo ri : resolveInfos) {
- if (ri.serviceInfo != null && componentName.equals(ri.serviceInfo.getComponentName())) {
- return true;
- }
- }
- return false;
+ return componentName != null;
}
/**
@@ -354,20 +338,41 @@ public class SpeechRecognizer {
* notifications will be received.
*
* @param context in which to create {@code SpeechRecognizer}
- * @throws UnsupportedOperationException iff {@link #isOnDeviceRecognitionAvailable(Context)}
- * is false
* @return a new on-device {@code SpeechRecognizer}.
+ * @throws UnsupportedOperationException iff {@link #isOnDeviceRecognitionAvailable(Context)}
+ * is false
*/
@NonNull
@MainThread
public static SpeechRecognizer createOnDeviceSpeechRecognizer(@NonNull final Context context) {
+ if (!isOnDeviceRecognitionAvailable(context)) {
+ throw new UnsupportedOperationException("On-device recognition is not available");
+ }
+ return lenientlyCreateOnDeviceSpeechRecognizer(context);
+ }
+
+ /**
+ * Helper method to create on-device SpeechRecognizer in tests even when the device does not
+ * support on-device speech recognition.
+ *
+ * @hide
+ */
+ @TestApi
+ @NonNull
+ @MainThread
+ public static SpeechRecognizer createOnDeviceTestingSpeechRecognizer(
+ @NonNull final Context context) {
+ return lenientlyCreateOnDeviceSpeechRecognizer(context);
+ }
+
+ @NonNull
+ @MainThread
+ private static SpeechRecognizer lenientlyCreateOnDeviceSpeechRecognizer(
+ @NonNull final Context context) {
if (context == null) {
throw new IllegalArgumentException("Context cannot be null");
}
checkIsCalledFromMainThread();
- if (!isOnDeviceRecognitionAvailable(context)) {
- throw new UnsupportedOperationException("On-device recognition is not available");
- }
return new SpeechRecognizer(context, /* onDevice */ true);
}