Android API21: VoiceInteractionService onReady () no se llama
Tengo un problema con la nueva API21 de Android, específicamente el VoiceInteractorService.
Me gustaría usar la nueva detección de Hotword en API21. Si presiono un botón, una detección de hotword para la palabra 'google' debe comenzar.
- Uso de Dagger 2 para inyectar en servicio
- ¿Necesita un ejemplo de código sobre cómo ejecutar un servicio Android para siempre en segundo plano incluso cuando el dispositivo está durmiendo, como Whatsapp?
- ¿Cómo se restablece el servicio de WhatsApp incluso si debo detener la aplicación?
- Usar SharedPreferences en modo multiproceso
- Utilizar Otto para actualizar un listadapter de un GcmListenerService
Cuando tengo una Actividad (MainActivity) y quiero llamar al método createAlwaysOnHotwordDetector (String keyphrase, Locale locale, AlwaysOnHotwordDetector.Callback) del VoiceInteractorService, obtengo un error: java.lang.IllegalStateException: No disponible hasta que onReady () sea llamado. Intenté solucionar esto temporalmente usando un rato con el bucle del tirón del intento para ver cuando onReady () se llama y puedo excecute el método de createAlwaysOnHotwordDetector (). Me enteré de que onReady () nunca se llama, incluso después de dejar que el sistema de bucle de 15 minutos.
¿Alguien tiene una idea de cómo resolver este problema?
Gracias por adelantado.
Esta es mi actividad para llamar a VoiceInteractorService.
import java.util.Locale; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.service.voice.AlwaysOnHotwordDetector; import android.service.voice.AlwaysOnHotwordDetector.Callback; import android.service.voice.VoiceInteractionService; import android.service.voice.AlwaysOnHotwordDetector.EventPayload; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { Button btn; VoiceInteractionService service; AlwaysOnHotwordDetector.Callback callback; Locale locale = new Locale("nl-NL"); Context ctx; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button) findViewById(R.id.button1); ctx = getApplicationContext(); service = new VoiceInteractionService(); btn.setOnClickListener(new OnClickListener() { // Create Hotword detector on button click @Override public void onClick(View v) { service.createAlwaysOnHotwordDetector("google", locale, callback); } }); callback = new Callback() { @Override public void onRecognitionResumed() { // TODO Auto-generated method stub } @Override public void onRecognitionPaused() { // TODO Auto-generated method stub } @Override public void onError() { // TODO Auto-generated method stub Log.d("error", "error"); } @Override public void onDetected(EventPayload eventPayload) { // TODO Auto-generated method stub // Display Toast message when Hotword is detected Toast.makeText(ctx, "Google", Toast.LENGTH_LONG).show(); } @Override public void onAvailabilityChanged(int status) { // TODO Auto-generated method stub } }; } }
- Obtener eventos táctiles (coordenadas, MotionEvents, etc.) en un servicio
- Android - bindService más de una vez
- BroadcastReceiver - onReceive Not Being Called
- Cómo programar un evento de clics en Android
- Singleton se destruye
- Cómo detener / iniciar un servicio que contiene un bucle infinito en la creación
- Reconocimiento de voz como servicio de fondo
- Comunicarse desde la aplicación al servicio
VoiceInteractionService
está diseñado para ser subclaseado para crear su propio servicio de interacción de voz. Sólo uno de estos servicios se puede activar a la vez, al igual que un teclado. Una vez habilitado por el usuario, está activo en todas partes, no sólo en una actividad particular.
No puede utilizar VoiceInteractionService
para proporcionar reconocimiento de voz para una actividad determinada.