2014-11-17 19 views
8

Ho un problema con il nuovo Android API21, in particolare VoiceInteractorService.Android API21: VoiceInteractionService onReady() non chiamato

Vorrei utilizzare il nuovo rilevamento di Hotword in API21. Se premo un pulsante, dovrebbe iniziare un rilevamento di hotword per la parola "google".

Quando ho un'attività (MainActivity) e voglio chiamare il createAlwaysOnHotwordDetector (String frase chiave, locale locale, AlwaysOnHotwordDetector.Callback callback) metodo dal VoiceInteractorService, ottengo un errore: java.lang.IllegalStateException: Non disponibile fino onReady() è chiamato. Ho provato a risolverlo temporaneamente usando un po 'di tempo con try catch loop per vedere quando onReady() viene chiamato e posso usare il metodo createAlwaysOnHotwordDetector(). Ho scoperto che onReady() non viene mai chiamato, anche dopo aver lasciato il loop del sistema per 15 minuti.

Qualcuno ha un'idea di come risolvere questo problema?

Grazie in anticipo.

Questa è la mia attività per chiamare 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 
      } 
     }; 
    } 
} 
+0

Vorrei anche saperlo. – user1810737

+0

Trovato questa app di prova da Google, ma non ancora chiaro come chiamare onReady. https://android.googlesource.com/platform/frameworks/base/+/fb30d6936a4793a3369fbf8bf51fa526b8a77272/tests/VoiceInteraction/src/com/android/test/voiceinteraction?autodive=0/ – LHeslenfeld

risposta

0

VoiceInteractionService è stato progettato per essere sottoclasse per creare il proprio servizio di interazione vocale. Solo un servizio di questo tipo può essere abilitato alla volta, proprio come una tastiera. Una volta abilitato dall'utente, è attivo ovunque, non solo in una determinata attività.

Non è possibile utilizzare VoiceInteractionService per fornire il riconoscimento vocale per una particolare attività.