Cómo consultar el SpeechRecognizer predeterminado

¿Cómo averiguar el ComponentName del reconocedor de voz del sistema por defecto, es decir, el que se devuelve cuando se llama createSpeechRecognizer (Context context) ? (En realidad, sólo necesito averiguar qué idiomas de entrada soporta, así que si sólo hay una respuesta a eso, también lo agradecería.)

El marco resuelve esto

String serviceComponent = Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE); 

(Consulte el código fuente de SpeechRecognizer .)

Sin embargo, esta solución no parece estar disponible para una aplicación de terceros.

Sin embargo, esta solución no parece estar disponible para una aplicación de terceros.

Supongo que llegó a tal conclusión porque Settings.Secure.VOICE_RECOGNITION_SERVICE no es una API pública. Sin embargo, Settings.Secure.getString() requiere nombre de la fila para buscar en tabla segura para el segundo argumento. Así, simplemente puede proporcionar el nombre real de la fila que está buscando: "voice_recognition_service" .

Es decir, puede usar el mismo código de SpeechRecognizer con un ligero cambio:

 String serviceComponent = Settings.Secure.getString(mContext.getContentResolver(), "voice_recognition_service"); 

Espero que esto ayude.

ACTUALIZACIÓN (he leído mal la pregunta original)

SpeechRecognizer no es la cosa que está haciendo el procesamiento del habla, la Intención que pasa a SpeechRecognizer, sin embargo, es (vía startListening(Intent intent) ). Esa intención utiliza RecognizerIntent.ACTION_RECOGNIZE_SPEECH y, AFAIK, se pueden detectar de la manera pasada de moda.

Para detectar los valores predeterminados, intente resolver el Intent que desea que encuentre el valor predeterminado pero con el conjunto PackageManager.MATCH_DEFAULT_ONLY .

Código no probado:

 String detectDefaultSpeechRecognizer(Context context) { final Intent speechIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); // 1: Try to find the default speech intent final ResolveInfo defaultResolution = context.getPackageManager().resolveService(speechIntent, PackageManager.MATCH_DEFAULT_ONLY); if (defaultResolution != null) { final ActivityInfo activity = defaultResolution.activityInfo; if (!activity.name.equals("com.android.internal.app.ResolverActivity")) { //ResolverActivity was launched so there is no default speech recognizer return ""; } } // 2: Try to find anything that we can launch speech recognition with. Pick up the first one that can. final List<ResolveInfo> resolveInfoList = context.getPackageManager().queryIntentServices(speechIntent, PackageManager.MATCH_DEFAULT_ONLY); if (!resolveInfoList.isEmpty()) { speechIntent.setClassName(resolveInfoList.get(0).activityInfo.packageName, resolveInfoList.get(0).activityInfo.name); return resolveInfoList.get(0).activityInfo.packageName; } return ""; } 

ANTIGUA RESPUESTA

Echa un vistazo a GAST, tiene una manera de comprobar si un idioma es compatible con un reconocedor de voz.
https://github.com/gast-lib/gast-lib/blob/master/library/src/root/gast/speech/SpeechRecognizingActivity.java#L70

También puede intentar comprobar manualmente la etiqueta de metadatos <recognition-service> . http://developer.android.com/reference/android/speech/RecognitionService.html#SERVICE_META_DATA

Si sólo desea averiguar qué idiomas de entrada admite el reconocedor de voz del sistema predeterminado ( createSpeechRecognizer (Context context) ), existe una manera más sencilla de hacerlo.

Todo lo que necesitas hacer es usar una intención RecognizerIntent.getVoiceDetailsIntent que compruebe los lenguajes predeterminados del reconocedor de voz del sistema:

 Intent intent = RecognizerIntent.getVoiceDetailsIntent(getApplicationContext()); if (intent != null) { ctx.sendOrderedBroadcast(intent, null, new BroadcastReceiver() { @Override public void onReceive(Context context, final Intent intent) { Log.d(TAG, "Receiving Supported Speech Recognition Languages broadcast " + intent); final Bundle extra = getResultExtras(false); if ((getResultCode() == Activity.RESULT_OK) && (extra != null) && (mHandler != null) && ((extra .containsKey(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES)) || (extra .containsKey(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE)))) { List<String> supportedLanguages = extra .getStringArrayList(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES); String prefLang = extra .getString(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE); } } }, null, Activity.RESULT_OK, null, null); } 
  • Crea un menú de estilo "ok glass", dentro de la aplicación glass
  • Android Offline Speech Recognition muestra un solo resultado?
  • Algoritmo para el reconocimiento de canciones
  • Widget de búsqueda de Android - diferencia entre onQueryTextSubmit y el envío de Intent to SearchableActivity?
  • Android: Acceso simultáneo al micrófono (RecognizerIntent + propia aplicación)
  • Reconocimiento de voz de Android Permiso insuficiente (Código de error 9)
  • Los valores de confianza de Android SpeechRecognizer son confusos
  • Uso de Android RecognizerIntent con un auricular bluetooth
  • Reconocimiento de voz sin cuadros de diálogo de Google
  • Cómo extender los comandos de voz de Google Now en Android con acciones personalizadas
  • Cómo obtener Google Speech Recognition Engine en un dispositivo Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.