JavascriptProva

mercoledì 3 agosto 2016

Aggiunta della suoneria e del meccanismo di cessazione attesa della risposta.

Ora, prima della voce sintetica va aggiunta la suoneria.
All'inizializzazione della schermata Telefono va innescata la suoneria, che poi va interrotta dal tasto Rispondi, il quale dà avvio alla voce.
Dunque lo metto in onCreate.
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_telefono);
  
  Uri ringtoneUri=RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE);
  ringtone=RingtoneManager.getRingtone(this, ringtoneUri);
  ringtone.play();
  bttRispondi=(Button)findViewById(R.id.button1);
  bttRispondi.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    ringtone.stop();
    mService.tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener(){
     @Override
     public void onUtteranceCompleted(String utteranceId) {
      mService.startTime();
      finish(); 
     }
    });
La suoneria inizia a suonare e viene interrotta dal tasto Rispondi.
Proviamolo...

Sì, funziona.

Però sarebbe il caso di immettere un piccolo ritardo...
Proviamo:
    Handler handler=new Handler();
    handler.postDelayed(new Runnable(){

     @Override
     public void run() {
      HashMap hashMap=new HashMap();
      hashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "id");
      
      mService.tts.speak("Ciao, scemo",TextToSpeech.QUEUE_FLUSH,hashMap);
      
     }
     
    },1000);
Proviamo...

Sì, funziona!

Prevedendo una non risposta da parte dell'utente, ossia né "accetta" né "rifiuta" ci dovrebbe essere l'abbandono della chiamata da parte del chiamante, come in tutte le normali telefonate.
Ho avuto delle difficoltà, però...

Vediamo di implementare questa funzione.
Ho "compattato" un po' il codice per la risposta: il listener per il termine del parlato viene inserito nel Runnable da lanciare con la latenza necessaria per portare il ricevitore all'orecchio:
  bttRispondi.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    ringtone.stop();
    handler=new Handler();
    handler.postDelayed(new Runnable(){

     @Override
     public void run() {
      mService.tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener(){
       @Override
       public void onUtteranceCompleted(String utteranceId) {
        mService.startTime();
        finish(); 
       }
      });
      HashMap hashMap=new HashMap();
      hashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "id");
      
      mService.tts.speak(frase,TextToSpeech.QUEUE_FLUSH,hashMap);
      handler.removeCallbacksAndMessages(null);
     }
    },1000);
   }
  });
Ho aggiunto anche il codice per la "ripulitura" dell'handler, anche se non credo ce ne sia proprio bisogno dal momento che con la distruzione dell'activity l'handler va distrutto... magari lo levo.

Metto ora un Runnable che viene lanciato dopo alcuni secondi dall'inizio della suoneria, con l'istruzione di interromperla e tornare al Service, distruggendo Telefono.
Vediamo se funziona...

  Uri ringtoneUri=RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE);
  ringtone=RingtoneManager.getRingtone(this, ringtoneUri);
  ringtone.play();
  HndNonRisposta=new Handler();
  HndNonRisposta.postDelayed(new Runnable(){

   @Override
   public void run() {
    ringtone.stop();
    mService.startTime();
    finish();
    
   }
   
  },10000);
Ora, se rispondo non ci sono problemi, mentre se rifiuto accade qualcosa di strano: si sovrappone un altro ciclo di schermate a ripetizione.
Questo perché il rifiuto fa tornare immediatamente il flusso del programma a startTime del Service, ma se resta attivo il ritardo per la chiusura spontanea questo torna a sua volta sempre a startTime del Service e tutto si impappa...

E' importante quindi aggiungere, qualora questo stop ritardato della suoneria venga anticipato dallo stop dovuto al rifiuto della chiamata, ma anche alla risposta (che non mi ha dato problemi forse per i tempi più lunghi...), un codice che "ripulisca" l'handler.
//BOTTONE RISPOSTA
  bttRispondi=(Button)findViewById(R.id.button1);
  bttRispondi.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    HndNonRisposta.removeCallbacksAndMessages(null);
    ringtone.stop();
    handler=new Handler();
    handler.postDelayed(new Runnable(){

     @Override
     public void run() {
      mService.tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener(){
       @Override
       public void onUtteranceCompleted(String utteranceId) {
        mService.startTime();
        finish(); 
       }
      });
      HashMap hashMap=new HashMap();
      hashMap.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "id");
      
      mService.tts.speak(frase,TextToSpeech.QUEUE_FLUSH,hashMap);
      handler.removeCallbacksAndMessages(null);
     }
    },1000);
   }
  });

//BOTTONE RIFIUTA
  bttRifiuta=(Button)findViewById(R.id.button2);
  bttRifiuta.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    HndNonRisposta.removeCallbacksAndMessages(null);
    ringtone.stop();
    mService.startTime();
    finish();
    
   }
  });

Nessun commento:

Posta un commento