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