Cerca con Google

Translate

12 aprile 2013

Tutorial 45 - Ricezione e lettura di SMS con App Inventor (componente Texting e TextToSpeech)


Continuiamo ad analizzare il componente "Texting" di Android MIT App Inventor per la gestione degli SMS.

La volta scorsa abbiamo visto come inviare in maniera molto semplice dei messaggi di testo tramite una nostra app.

Questa volta vedremo invece come gestire eventuali messaggi SMS in arrivo verso il nostro cellulare e farli interagire con un applicazione creata da noi.

La cosa interessante è che il componente "texting" da qualche tempo può funzionare anche in "background" ovvero anche quando la nostra applicazione non è attiva.
Ad oggi è l'unico componente di App Inventor dotato di questa caratteristica, come spiegato anche nel video, utilizzatelo con cautela visto che ha un forte impatto nei confronti degli utilizzatori della vostra app che si troveranno ad avere una notifica "extra" all'arrivo di ogni SMS...

Questa la traduzione della proprietà ReceivingEnabled del componente texting:
Se impostato a 1 (OFF) nessun messaggio verrà ricevuto.
Se impostato a 2 (FOREGROUND) o 3 (ALWAYS), il componente riceverà i messaggi quando l'app è in esecuzione.
Se impostato a 3 (ALWAYS) e l'app non è in esecuzione, verrà visualizzata una notifica. Scegliendo la notifica l'app verrà rimessa in primo piano e l'evento "MessageReceived" verrà generato.
I messaggi ricevuti con l'app non attiva verranno messi in coda e così più di un evento "MessageReceived" potrà essere generato quando l'app torna attiva.
Come sviluppatore della vostra app sarebbe buona norma dare all'utente il controllo di questa proprietà in modo che sia lui stesso a poter scegliere se ignorare gli SMS in arrivo quando la vostra app è installata.

Il programma in se non fa altro che attivarsi alla ricezione di un SMS, da la possibilità all'utente di leggere ad alta voce tramite sintesi vocale il mittente ed il testo del messaggio.
Ed infine, utilizzando un "listpicker" da la possibilità di rispondere con delle frasi predefinite al messaggio che ci è appena arrivato.

I componenti principali utilizzati sono:

  1. Texting
  2. TextToSpeech

Il tutorial è interessante perchè mostra anche come sia possibile simulare l'invio degli SMS al nostro emulatore tramite dei semplici comandi da finestra dos (quindi senza dover spendere una fortuna mandando SMS veri).

Attenzione: se non avete un piano telefonico con SMS inclusi potrete incorrere in addebiti da parte del vostro operatore per ogni pressione del tasto Rispondi con SMS

Buona visione!!!


Potrete scaricare il sorgente del progetto QUA
E se avete difficoltà a scaricare il pacchetto extra per il TextToSpeech nell'emulatore, lo trovate QUA
La discussione nel forum è aperta a questo LINK

22 commenti:

  1. Senti ma è possibile avviare automaticamente l'app e leggere il messaggio ricevuto senza cliccare nessuna notifica

    RispondiElimina
    Risposte
    1. no, non è possibile, dev'essere l'utente ad attivare il programma selezionando la notifica.

      Elimina
  2. Ciao Sebastian. Ho creato un'applicazione fondendo le tue lezioni di invio e ricezione sms. Con la differenza che l'sms di risposta al mess. ricevuto non è preimpostato ma ho utilizzato un altro textbox e modificando gli elementi del blocks editor. Volevo chiederti cosa fare per poter scrivere il numero di telefono manualmente senza andare a prenderlo nella rubrica, e se quando si riceve 1 sms,c'è un modo per confrontare il numero con la rubrica e riconoscerne il nome in caso sia salvato.
    Grazie in anticipo.

    RispondiElimina
    Risposte
    1. Ciao, per il numero puoi usare una textbox in cui si possano inserire solo numeri dove l'utente inserisce il numero, poi quel numero sarà la destinazione del tuo SMS.
      Per confrontare invece il numero ricevuto con i numeri in rubrica, non credo sia attualmente possibile, abbiamo solo il contactpicker ma non possiamo leggere tutti i numeri in essi presenti in maniera automatica.
      Ovviamente puoi creare una lista di tali numeri all'interno dell'app stessa e poi fare il confronto all'arrivo di un SMS, non il massimo come soluzione ma magari nel tuo caso sarà sufficiente, dipende da cosa vuoi realizzare, a presto ciao!

      Elimina
  3. Ciao,
    è possibile inviare una notifica ad un cliente che lascia un suo prodotto che può essere una macchina, un pc o qualsiasi altra cosa in un negozio che sia pronto?
    Tipo che preme sulla richesta e arriva una notifica che avvisa di questa cosa, oppure visualizzarla in diretta.
    Grazie.

    RispondiElimina
    Risposte
    1. Ciao Rocco, dipende da come programmi la tua applicazione, con App Inventor puoi inviare un sms ad un numero a tua scelta e con un testo scelto da te,
      sta a te creare l'altra parte dell'applicazione ovvero quella che controlla se il prodotto è pronto o una cosa del genere, in bocca al lupo! ciao!

      Elimina
    2. Grazie della risposta,
      Hai un tutorial su come creare una app del genere?

      Elimina
    3. no, ma è veramente semplice, guarda questo tutorial per capire come inviare gli sms, da una parte il cliente può premere un tasto che ti invia una mail ad un tuo indirizzo, dall'altra parte tu crei un app che alla ricezione e conferma di tale mail rimanda indietro un sms al cliente, è un pò difficile da spiegare senza sapere bene tutti i requisiti ma l'idea potrebbe più o meno essere questa

      Elimina
  4. salve anche questa un ottima guida ,specialmente per me che sono alle prime armi, volevo sapere una cosa, sto facendo un multi screen e quando inposto il texiting in always mi si apre alla screen 1 come posso fare per farla aprire allo screen dove ho messo l'applicazione sms

    RispondiElimina
    Risposte
    1. purtroppo la riaprirà sempre in screen1, se vuoi che vada ad un altro screen devi usare una variabile che poi leggi quando arriva l'SMS.
      Ad esempio puoi salvare in che screen sei con il TinyDB, ad ogni cambiamento di screen scrivi nel TinyDB lo screen attuale.
      Poi quando riparte l'app con il componente texting per l'arrivo di un SMS leggi questa variabile e riapri l'app allo screen precedente.
      Non ho provato personalmente ma dovrebbe essere fattibile.

      Elimina
    2. Magari dico una stupidaggine, ma su caricamento dello screen1, non é possi aggiungere la funzione che punti e richiami l'apertura di un'altro screen?

      Elimina
  5. Grazie, devo ancora imparare molto, il TinyDB (cerchero qualche guida) per me è nuovo,, volevo anche sapere se esiste un mod per far funzionare applicazioni in .swf .
    Grazie

    RispondiElimina
  6. Un altra piccola cosa, volevo che quando l'utente riceve l'sms in automatico venga avvertito da uno squillo, ho messo su Texiting un Sound, che ho prima importato dagli strumenti ed ho dato la pach giusta, solo che il suono viene riprodotto solo al'apeertura della app, come si può fare che il suono venga riprodotto come succede con gli sms normalmente.

    RispondiElimina
  7. Salve, come potra notare sono alle prime armi.
    C'è una cosa presumo molto semplice ma che mi fa impazzire, ho creato un app per gestire un termostato da remoto e all'invio del comando questo risponde con un sms. Il problema che non riesco a risolvere è:
    Quando arriva un sms se il numero e del termostato mi deve compilare il campo testo altrimenti lo ignora. Ho provato con un if che controlla se il numero è uguale a xxxxx ma non funziona.
    Quale comando dovrei usare per riconoscere il numero ed agire di conseguenza?

    RispondiElimina
  8. Ottimo tutorial. Istruzioni precise infatti la mia app già è in funzione senza errori. Dopo vari tentativi non sono riuscito a fare una lista degli ultimi 10 SMS ricevuti. Mi puoi illuminare? Grazie in anticipo

    RispondiElimina
  9. Ciao,
    grazie del tutorial. Ho sviluppato una app in AI2 che si collega al server web del trasporto pubblico locale (Roma), consulta la previsione di arrivo dei bus su varie fermate limitrofe al mio ufficio e mi spedisce un sms con il responso (il mio cell infatti non è connesso a internet, e la app la lanciano i miei colleghi). Posso fare in modo che ciò avvenga senza l'intervento dell'utente, ad app non in esecuzione, ma solo alla ricezione di un sms particolare da parte mia? Se imposto ReceivingEnabled=3 ottengo solo la notifica ma l'evento MessageReceived non scatta automaticamente...
    Volendo far inviare l'sms non alla ricezione di un mio sms ma ad una mia chiamata (a cui non si deve necessariamente rispondere), potrei usare PhoneCall.PhoneCallStarted con status 1? Anche ad app non in esecuzione o ciò funziona solo con il componente Texting?
    Grazie ancora e un saluto,
    Filippo

    RispondiElimina
  10. Complimenti! E si può fare lo stesso con le notifiche ricevute invece che i messaggi? Grazie!

    RispondiElimina
  11. Ciao Seba,
    è un pò che non scrivo....
    ho una domanda simile a quella dell'utente effebruno poco sopra.
    La mia nuova app deve essere in grado di eseguire i comandi scatenati dalla ricezione di un sms (con un contenuto predeterminato) anche se è in background o addirittura con il cel in standby.
    Al momento riesco ad intercettare l'arrivo di un sms ma se non apro la notifica o se nono riprendo l'app, la sequenza di eventi non si avvia.
    Schematicamente:
    App installata - cel in stand by o semplicemente con qualunque altra cosa sullo schermo che non sia la app - ricezione di un sms che contiene la parola chiave corretta - invio di una risposta automatizzata e avvio di una serie di eventi.
    Al momento funziona tutto tranne la parte che riguarda lo stand by o l'utilizzo di qualche altra app...
    Spero di essere stato chiaro e di ricevere una tua risposta.

    Grazie mille

    Nello

    RispondiElimina
  12. Ciao Seba,
    innanzitutto i miei complimenti per la qualità dei tuoi tutorial.
    Li sto usando per un corso che sto facendo ai miei alunni.
    Avevo un quesito da porti...
    Sviluppando una app a schermate multiple che utilizza il componente texting ho avuto la necessità di inserire due copie del componente, uno in una schermata ed l'altro in una altra schermata.
    Ovviamente quando passo da una schermata all'altra disattivo la ricezione di sms su una copia del componente e la attivo sull'altra copia (non ci sono bug di programmazione).
    Quello che succede pero' è che gli sms vengono intercettati sempre dal componente della schermata che ho già chiuso (close screen) e che ho già disabilitato come ricezione sms (attivando invece quello sulla schermata attuale).
    E' come se App Inventor non riuscisse a gestire piu' di una copia relativamente alla ricezione sms.
    Ti risulta sia un bug o esiste un modo per cancellare dalla memoria una schermata e tutte le sue componenti in modo piu' radicale?
    Spero di essere stato chiaro e che qualcuno si sia interessato del problema e mi possa aiutare.
    Onorato

    RispondiElimina
  13. Ciao,
    è un piacere leggere e sapere che il mio materiale viene usato per dei corsi didattici, grazie!

    Per quanto riguarda il tuo quesito, non ti saprei dire con esattezza in quanto non so come funzioni internamente il componente, può essere però che "registri" un solo oggetto texting e che quindi questo resti in "ascolto" quando lo chiami la prima volta, quindi nel tuo caso sempre dalla prima schermata e per questo si crei l'errore che hai evidenziato.

    Ti propongo due possibili strade:
    1- rinunciare al multiscreen e fare tutto su un solo screen settando a visibile true/false i vari arrangment per mostrare solo la parte di UI che ti interessa in quel momento (come si faceva prima del multiscreen)
    2- Salvare sul tinyDb un valore, ad esempio il numero dello screen in cui sei, e quando ricevi l'evento texting in entrata leggi subito quel valore ed eventualmente fai lo switch sullo screen corretto.
    (esempio , quando entri in screen2 setti su tinyDb "currentScreen=2" e in screen1 componente texting, alla ricezione dell'SMS controlli il valore che c'è sul tinyDB e se è = 2 apri subito screen2.

    Insomma , purtroppo c'è un pò da pasticciare, ma probabile che una soluzione la si trovi.
    Fammi sapere, spero di esserti stato utile! ciao!

    RispondiElimina
  14. Grazie della pronta risposta!
    Credo che dovrò rinunciare al multiscreen, la seconda ipotesi non è praticabile perchè a runtime funziona l'ultima copia attivata (anche se disabilito la ricezione sms) non la prima. Per cui quando torno alla prima schermata il sistema continua a ricevere sms sulla seconda (che ho già chiuso. Non c'è modo quindi di intercattare l'evento di ricezione quando sono ritornato alla prima schermata.
    Grazie di nuovo.

    RispondiElimina
  15. Buon di, ho creato un app simile a questa però un po piu complicata! per caso sa come si fa a disattivare la conferma ricezione messaggio?? perché ho scoperto che pago 0.15€ in più ogni messaggio inviato!!

    Attendo una sua risposta

    RispondiElimina