Cerca con Google

Translate

28 marzo 2013

Tutorial 43 - Invio di SMS da App Inventor con il componente Texting


Nel tutorial di oggi vedremo come è possibile inviare con facilità SMS nelle nostre app create con App Inventor.

Utilizzeremo principalmente due componenti:
  1. Texting
  2. PhoneNumberPicker
L'applicazione sarà volutamente molto semplice, un campo dove inserire il testo del nostro SMS e due pulsanti, uno per scegliere il destinatario del nostro messaggio e l'altro per l'invio dell'SMS.

Altre due label ed un notifier ci serviranno per confermare l'avvenuto invio dell'SMS e visualizzare il testo inviato ed il numero del destinatario.

Attenzione: se non avete un piano telefonico con SMS inclusi potrete incorrere in addebiti da parte del vostro operatore per ogni invio di SMS, per questo nel video vi mostro come fare il debug dell'applicazione ed inserire il componente per l'invio dell'SMS solo alla fine

Buona visione!!!
Potete scaricare il sorgente del progetto cliccando QUA
Se volete commentare lo potete fare nel forum a questo indirizzo:
Forum - Tutorial 43



Per finire vediamo nel dettaglio le istruzioni dei due componenti utilizzati:

Texting


Componente che invia un SMS quando il metodo "SendMessage" è eseguito.
L'SMS viene inviato con il testo specificato nella proprietà "Message" ed al numero di telefono specificato nella proprietà "PhoneNumber"
Se la proprietà "ReceivingEnabled" (non trattata in questo tutorial) è settata ad 1, i messaggi in arrivo verranno ignorati.
Se settata a 2, i messaggi in arrivo verranno gestiti solo quando l'app gira in primo piano
Se settata a 3, i messaggi in arrivo saranno SEMPRE gestiti, anche con l'app non attiva, verrà visualizzata una notifica per ogni SMS in arrivo e selezionando la notifica l'app verrà portata in primo piano.
Quando un messaggio arriva, l'evento "MessageReceived" viene generato e fornisce sia il numero di telefono che il testo ricevuto.
Un altro modo per specificare il numero del destinatario è quello di usare "PhoneNumberPicker" (quello che abbiamo fatto noi in questo video) che richiama la rubrica del telefono per la selezione del destinatario.

Properties

GoogleVoiceEnabled
Non disponibile in Italia, quindi per ora da non utilizzare...
Message
Il testo del messaggio da inviare quando il metodo "SendMessage" è utilizzato.
PhoneNumber
Il numero di telefono del destinatario a cui inviare il messaggio quando il metodo "SendMessage" è utilizzato.
Il numero è una stringa di testo (esempio 333444555666). I punti, le virgole e le parentesi possono essere incluse nel numero (esempio (348)-111-2222 ) e saranno ignorate; gli spazi non vanno inseriti.
ReceivingEnabled
Come si deve comportare il componente all'arrivo di un SMS, vedere la descrizione precedente, i valori possibili sono : 1 (OFF) 2 (FOREGROUND) 3 (ALWAYS) 

Events

MessageReceived(text number, text messageText)
Evento generato all'arrivo di un messaggio SMS, i parametri ricevuti sono : numero di telefono e testo del messaggio

Methods

SendMessage()
Invia il messaggio SMS

PhoneNumberPicker


Si usa questo componente per permettere all'utente di selezionare un numero dai contatti del telefono Android.
Quando l'utente clicca su questo pulsante viene mostrata la lista di tutti i numeri di telefono presenti, dopo che l'utente ne sceglie uno, le seguenti proprietà vengono impostate con le informazioni relative al contatto scelto:
  • ContactName : Nome del contatto
  • PhoneNumber : Numero di telefono del contatto
  • EmailAddress : Email principale del contatto
  • Picture : Nome del file che contiene l'immagine del contatto (se presente), questa può essere utilizzata in un componente "Image" o "ImageSprite" (usando la proprietà "Picture") 
Le altre solite proprietà controllano l'apparenza del pulsante e se è attivo o meno (TextAlignment and BackgroundColor)

Properties

Enabled
Se impostato a true l'utente può utilizzare il componente
Image
Immagine da usare per il pulsante 
BackgroundColor
Colore di fondo del pulsante
ContactName
Nome del contatto scelto
EmailAddress
Email primaria del contatto scelto.
PhoneNumber
Numero di telefono del contatto scelto.
Picture
Immagine (se esistente) del contatto scelto.
Più le altre solite proprietà dei pulsanti quali:
FontBold, FontItalic , FontSize, FontTypeface, Text,TextAlignment,TextColor,Visible,Width,Height

Events

AfterPicking()
Evento generato dopo che l'utente ha scelto un contatto.
BeforePicking()
Evento generato dopo che l'utente ha cliccato il pulsante ma prima che la lista dei contatti sia visualizzata.
GotFocus()
Il componente ha attualmente il "focus" (vale solo per dispositivi con trackpad o mouse)
LostFocus()
Il componente non ha più il "focus" (vale solo per dispositivi con trackpad o mouse)

40 commenti:

  1. Innanzitutto grazie per l'ennesimo tutorial!
    Se volessi inviare sms tramite un activity starter invece che usare il componente spiegato sopra dove trovo le stringhe?
    Vorrei fare una cosa tipo il tutorial del navigatore in cui nel dataUri si inserisce una stringa ben precisa.

    Grazie!

    RispondiElimina
    Risposte
    1. non capisco perchè vuoi usare l'activitystarter, il componente "texting" è una sorta di interfaccia semplificata all'activitystarter e ci puoi fare le stesse cose,
      ovviamente se vuoi mandare una stringa ben precisa la puoi programmare in una label o una textbox e poi darla come parametro al componente texting nella proprietà "message"
      ti sconsiglio l'uso dell'activitystarter visto che puoi fare le stesse cose con "texting"...:)

      Elimina
    2. E' un discorso lungo... allora rigiro la domanda: è possibile prelevare un numero della rubrica ad esempio cercandolo col componente SpeechRecognizer?
      Io vorrei far dettare sia il destinatario che il testo del corpo.
      Col componente "texting" posso fare, effettivamente, tutto ma vorrei automatizzare anche il "pick" del numero.

      Elimina
    3. non puoi prelevare il numero dalla rubrica con speechrecognizer perchè come avrai visto quando usi phonenumberpicker usa la rubrica di default del tuo telefono, ed in base al telefono (android stock, sense, touchwiz,etc...) questa parte potrebbe essere diversa e non è detto che supporti uno speechrecognizer
      mentre per la dettatura del corpo del messaggio lo puoi fare benissimo, prima usi speechrecognizer e poi inserisci il testo trascritto come corpo del messaggio

      anche se usassi l'activity avresti lo stesso problema, linkare speechrecognizer e phonenumberpicker
      purtroppo non mi vengono in mente soluzioni su come richiamare vocalmente il destinatario...

      Elimina
    4. Secondo me proprio tramite un'activity si può... devo cercare fra gli esempi di codice java se riesco a trovare qualcosa da adattare ad app inventor.
      Se trovo qualcosa lascio un appunto a te!

      Elimina
  2. Ciao Sebastiano,

    volevo chiederti una cosa riguardo alla funzione texting. Impostanto la funzione texting su always, io vorrei che arrivasse la notifica del messaggio, e quindi che si aprisse la mia applicazione, solo quando il messaggio arriva da un utente specifico. E' questo l'ho fatto. Il problema e' che effettivamente io posso dire all'applicazione di aprirsi quando il messaggio arriva da un numero preciso, ma la notifica arriva sempre (la cornetta blu), all'arrivo di qualsiasi messaggio di qualsiasi utente, poi magari cliccando non succede nulla perche' io gli ho impostato all'applicazione di chiudersi se il messaggio non e' di quel determinato numero. Pero' il fatto che la cornetta arrivi sempre e' fastidioso, c'e' un modo per togliere questa cornetta?
    Grazie mille, gentilissimo

    RispondiElimina
    Risposte
    1. purtroppo non è possibile, la notifica arriva sempre e comunque e non possiamo interagire con essa in base al numero del mittente, mi dispiace.

      Elimina
    2. Scusate se mi intrometto, ho creato una applicazione, al momento all'arrivo di un SMS mi escono nella barra notifiche le icone del messaggio e della famosa cornetta blu.
      Per aprire l'app, devo cliccare la cornetta blu, come si fa a far aprire l'app automaticamente all'arrivo del messaggio senza bisogno di cliccare la cornetta blu?
      C'è modo di segnare il messaggio (in arrivo da un numeor specifico) come già letto?
      Ciao e Grazie x l'aiuto!

      Elimina
    3. per come è strutturato Android non è possibile farlo, deve essere sempre l'utente che decide di aprire la notifica.
      Mentre per segnare il messaggio come già letto non ti saprei dire ma penso non sia possibile farlo solo per alcuni numeri e per altri no, mi dispiace.

      Elimina
    4. Messaggio di LUCA GARRAPA: "io vorrei che arrivasse la notifica del messaggio, e quindi che si aprisse la mia applicazione, solo quando il messaggio arriva da un utente specifico. E' questo l'ho fatto. Il problema e' che effettivamente io posso dire all'applicazione di aprirsi quando il messaggio arriva da un numero preciso, ma la notifica arriva sempre (la cornetta blu)"

      Ho interpretato male io?

      Elimina
    5. Esatto, la notifica arriverà sempre (non dipende dal numero di telefono del mittente quindi)
      poi quando l'utente clicca sulla notifica parte la tua app, a quel punto puoi decidere te cosa fare (ad esempio se arriva da un numero che non corrisponde ad uno che vuoi te puoi far chiudere l'applicazione, far visualizzare un notifier, etc...)

      Elimina
  3. Ciao Sebastiano,

    grazie per la risposta. Volevo chiederti un'altra cosa: vorrei far aprire la mia applicazione con una immagine che dopo un secondo scompare in automatico e mi apre la pagina di login. Hai qualche tutorial di riferimento, o puoi darmi qualche delucidazione? So che devo usare la funzione clock, ma non mi sta riuscendo.

    Grazie mille in anticipo. Luca

    RispondiElimina
    Risposte
    1. Ci sono i tutorial dei template con splashscreen e eula che possono fare al caso tuo:
      http://seblogapps.blogspot.it/2012/10/tutorial-36-template-con-splashscreen-e.html
      oppure più vecchio:
      http://seblogapps.blogspot.com/2011/11/tutorial-26-template-splash-screen-e.html

      Elimina
  4. Ottimo tutorial!

    Ho solo un problema a me non mostra la lista dei contatti.
    Pur avendo dei contatti nella rubrica mi dice nessun contatto presente.
    Sai mica come posso risolvere?
    Grazie!!!

    RispondiElimina
    Risposte
    1. che telefono hai? anche altri con samsung e touchwiz mi han detto di questo problema, forse perchè i vostri contatti non sono memorizzati nei contatti della gmail? onestamente non saprei ma c'è scritto anche nell'help di app inventor che non tutti i telefoni potrebbero visualizzare l'elenco contatti, mi dispiace

      Elimina
  5. Ciao Sebastiano,
    Volevo chiederti: posso modificare le applicazioni fatte con app inventor usando eclipse?

    Hai qualche tutorial a tal proposito? Grazie, gentilissimo.

    RispondiElimina
    Risposte
    1. ad oggi non è possibile, stanno facendo alcuni esperimenti a riguardo e c'è qualcosa che bolle in pentola...sarebbe bellissimo si potesse fare ma dobbiamo pazientare ancora un pò... :)

      Elimina
  6. Ciao complimenti per il sito,volevo chiederti un problema che ho notato su piu telefoni.
    Quando invio un sms con la connessione dati attiva(no wifi),quest'ultimo non lo invia,non so se un errore mio oppure è un problema di app inventor,puo verificarlo?Grazie

    RispondiElimina
    Risposte
    1. mi dispiace, non ho un piano con SMS inclusi quindi ogni test che faccio mi costa :)
      la cosa mi sembra strana, la gestione degli SMS con quella del wifi dovrebbero essere due cose distinte, se vuoi prova a chiedere nel forum magari qualcun'altro ha avuto esperienze simili,ciao

      Elimina
  7. Grazie x questo chiaro e semplice tutorial. io vorrei aggiungere una modifica, tuttavia non funziona,quindi perfavore volevo chiederti dove sbaglio.

    ciò che vorrei realizzare, è mandare uno stesso sms ad una lista di numeri.

    uso forech che mi permette di mandare lo stesso testo ai numeri della mia lista, tuttavia viene inviato il testo solo all' ultimo numero della lista.

    puoi illuminarmi? mi sto scevverlando ma non ci arrivo... :(
    grazie.


    RispondiElimina
  8. Vorrei farti una domanda: ho fatto un app che quando si riceve un sms controlla il contenuto di esso e in automatico risponde al messaggio,ma funziona solo se l'app e' aperta...!,non c'e'un modo per farla funzionare sempre, o almeno quando e' i background? grazie in anticipo

    RispondiElimina
    Risposte
    1. Certo, è molto semplice basta che nel componente texting abiliti in design editor l'opzione "receivingenabled" e lo metti a ALWAYS, in questo modo arriverà una notifica all'app all'arrivo di ogni SMS, poi però per lanciare l'app l'utente dovrà selezionare la notifica stessa.

      Elimina
  9. vorrei anche sapere se non è possibile spostare un app fatta con app inventor su eclipse

    RispondiElimina
    Risposte
    1. no, non è possibile e non credo lo sarà mai, mi dispiace...

      Elimina
  10. ciao, io ho provato a fare i blocks, ma non riesco a trovare il control if else che dici te, mi potresti consigliare?

    RispondiElimina
    Risposte
    1. Lo trovi in "built-in" - "control"
      è il primo, poi per aggiungere l'else devi usare il mutatore (ovvero quel quadratino azzurro)
      ti allego un immagine per rendere più chiare le cose, fammi sapere se così ora hai capito,ciao

      http://i.imgur.com/gSA8N6C.png

      Elimina
  11. Salve Sebastiano,
    innanzi tutto complimenti per il Blog che definirei fantastico. Volevo approfittare della sua disponibilità per esporle un mio problema:
    devo creare per un'azienda un' app che esegua dei calcoli tecnici sulla base di formule che mi vengono fornite. Ovviamente ci sarà una grafica personalizzata ed un multiscreen per scorrere sulle diverse pagine di calcolo. Arriviamo al mio dubbio: il cliente mi chiede la possibilità, una volta che l'app verrà inserita nel Google Play, di rendere l'app stessa accessibile solo dopo inserimento di un "codice di sblocco" (anche sempre lo stesso) da parte dell'utente il quale per ottenere tale codice dovrebbe inserire la propria mail e inviare il "messaggio" al server di posta dell'azienda che gli fornirà automaticamente il "codice di sblocco" da inserire. L scopo dell'azeinda p quella di crearsi un database di mail degli utenti che accedono all'app. Ho letto che attualmente inviare mail da AI non è possibile allora mi chiedevo se la procedura sopra descritta potesse essere svolta mediante l'invio da parte dell'utente, ad un numero aziendale dedicato, di un messaggio contenete il suo indirizzo mail. A questo messaggio arriverebbe una risp automatica con il codice di sblocco che, una volta inserito renderà visibile/accessibile l'app.
    Pensa sia una strada percorribile questa?
    In alternativa potrebbe fornirmi qualche altro spunto?
    La ringrazio anticipatamente
    Matteo

    RispondiElimina
    Risposte
    1. Ciao, perchè dici che con App Inventor non puoi mandare le mail? si può fare, ho anche fatto dei tutorial con Gmail e con Gmail + allegati.
      Per quanto riguarda il suo quesito il problema principale è la sicurezza della verifica dell'utente e del suo codice univoco.
      La cosa forse migliore sarebbe quella di salvare la lista delle password autorizzate in un TinyWebDB od in una Fusion Tables e poi creare la logica di login che verifichi se il nome utente + la password fornita corrispondano ad un utente valido in uno di questi DB.
      Così il cliente può aggiungere o rimuovere gli utenti senza dover ogni volta aggiornare l'app.
      Il problema è che il traffico con la password sarebbe facilmente intercettabile (ipotizzo) e quindi qualche "smanettone" potrebbe "rubare" le pwd di accesso.
      Ti consiglio quindi di guardare i componenti TinyWebDB e Fusion Tables (di cui non ho ancora fatto tutorial) per vedere se ti viene in mente qualche idea su come andare avanti, in bocca al lupo!

      Elimina
  12. Ciao, volevo farti i complimenti per i tutorial video. Di solito preferisco tutorial in forma scritta...ma i tuoi mi hanno fatto cambiare idea. Poi volevo chiederti se è possibile leggere gli sms archiviati nel telefono, col componente texting mi sembra non sia possibile. Grazie

    RispondiElimina
    Risposte
    1. Che io sappia purtroppo non è possibile leggere gli SMS ma solo inviarli

      Elimina
    2. Un'altra domandina... col samsung il phonenumberpicker non ne vuole sapere di funzionare:-) Ho provato ad accedere alla rubrica con activitystarter , settando action="android.intent.action.PICK" e DataUri="content://com.android.contacts/contacts". La rubrica si apre e mi consente di scegliere fra i contatti ma non riesco a capire dove (e se) mi ritorna il valore scelto. Qualche idea?

      Elimina
  13. salve..volevo fare solo una domanda, dopo che ho creato tutto e ho apportato solo la modifica di mandare il messaggio ad un determinato numero,appena vado per scrivere il testo del messaggio, mi da solo la tastiera con i numeri....come mai??

    RispondiElimina
    Risposte
    1. tutto risolto..avevo selezionato una cosa su app inventor, riguardante il testo del messaggio ;)...grazie lo stesso

      Elimina
  14. ciao seba..rieccomi qua...ascolta appena ho creato questo tutoria sulla mia app...l'ho modificata in mo tale che premendo invia messaggio la mandasse ad un numero specifico...e funzionava perfettamente!!! essendo che la volevo pubblicare sul market...ho fatto una revisione per vedere se funzionasse tutto alla perfeziono...solo che adesso appena scrivo il messaggio e premo invia mi da questo errore: io error : unable to create GvHelper ..... puoi aiutarmi??

    RispondiElimina
    Risposte
    1. Ciao , volevo sapere dove posso trovare il tuo tutorial per inviare sms ad un numero specifico, volevo inserire nel campo testo un nessgigio messaggio predefinito. Mi puoi aiutare grazie

      Elimina
  15. ciao, innanzi tutto complimenti per il lavoro svolto ed il tempo che ci dedichi.
    Una domanda: è possibile capire se l'SMS è stato effettivamente inviato o meno (ad esempio per mancanza di copertura)?
    Grazie in ogni caso,
    Sebastiano

    RispondiElimina
    Risposte
    1. No, non fa parte delle possibilità offerte dal componente texting, mi dispiace.

      Elimina
  16. Ciao ho visto che un utente te l'ha già chiesto ma non ha ricevuto risposta, come è possibile inviare uno stesso messaggio a più destinatari? Magari senza prenderli dalla rubrica per esser sicuro che funzionerebbe con tutti i tipi di cellulari.
    Grazie e spero di ricevere risposta. :-)

    RispondiElimina
    Risposte
    1. Devi semplicemente chiamare tante volte il componente texting con il metodo sendmessage per ogni SMS da mandare.
      Puoi anche inserire il tutto in un ciclo "for" ad esempio, dove crei una lista di numeri a cui vuoi mandare lo stesso SMS.
      Poi con un "for each element in list" invi lo stesso SMS a tutti.
      Spero di averti chiarito il dubbio, ciao!

      Elimina
  17. Ciao a tutti
    Ho creato una app che dovrebbe inviare un SMS ad un numero ricercato dalla rubrica, ma quando tento di inviarlo compare l'errore relativo a: "READ_PHONE_STATE" come se non ci fosse il permesso abilitato.
    Qualcuno saprebbe dirmi il motivo?

    RispondiElimina