Nel tutorial di oggi vedremo come è possibile inviare con facilità SMS nelle nostre app create con App Inventor.
Utilizzeremo principalmente due componenti:
- Texting
- 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
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 contattoPhoneNumber
: Numero di telefono del contattoEmailAddress
: Email principale del contattoPicture
: 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)
Innanzitutto grazie per l'ennesimo tutorial!
RispondiEliminaSe 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!
non capisco perchè vuoi usare l'activitystarter, il componente "texting" è una sorta di interfaccia semplificata all'activitystarter e ci puoi fare le stesse cose,
Eliminaovviamente 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"...:)
E' un discorso lungo... allora rigiro la domanda: è possibile prelevare un numero della rubrica ad esempio cercandolo col componente SpeechRecognizer?
EliminaIo 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.
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
Eliminamentre 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...
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.
EliminaSe trovo qualcosa lascio un appunto a te!
Ciao Sebastiano,
RispondiEliminavolevo 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
purtroppo non è possibile, la notifica arriva sempre e comunque e non possiamo interagire con essa in base al numero del mittente, mi dispiace.
EliminaScusate 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.
EliminaPer 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!
per come è strutturato Android non è possibile farlo, deve essere sempre l'utente che decide di aprire la notifica.
EliminaMentre 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.
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)"
EliminaHo interpretato male io?
Esatto, la notifica arriverà sempre (non dipende dal numero di telefono del mittente quindi)
Eliminapoi 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...)
Ciao Sebastiano,
RispondiEliminagrazie 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
Ci sono i tutorial dei template con splashscreen e eula che possono fare al caso tuo:
Eliminahttp://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
Ottimo tutorial!
RispondiEliminaHo 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!!!
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
EliminaCiao Sebastiano,
RispondiEliminaVolevo chiederti: posso modificare le applicazioni fatte con app inventor usando eclipse?
Hai qualche tutorial a tal proposito? Grazie, gentilissimo.
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ò... :)
EliminaCiao complimenti per il sito,volevo chiederti un problema che ho notato su piu telefoni.
RispondiEliminaQuando 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
mi dispiace, non ho un piano con SMS inclusi quindi ogni test che faccio mi costa :)
Eliminala 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
Grazie x questo chiaro e semplice tutorial. io vorrei aggiungere una modifica, tuttavia non funziona,quindi perfavore volevo chiederti dove sbaglio.
RispondiEliminaciò 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.
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
RispondiEliminaCerto, è 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.
Eliminavorrei anche sapere se non è possibile spostare un app fatta con app inventor su eclipse
RispondiEliminano, non è possibile e non credo lo sarà mai, mi dispiace...
Eliminaciao, io ho provato a fare i blocks, ma non riesco a trovare il control if else che dici te, mi potresti consigliare?
RispondiEliminaLo trovi in "built-in" - "control"
Eliminaè 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
Salve Sebastiano,
RispondiEliminainnanzi 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
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.
EliminaPer 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!
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
RispondiEliminaChe io sappia purtroppo non è possibile leggere gli SMS ma solo inviarli
EliminaUn'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?
Eliminasalve..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??
RispondiEliminatutto risolto..avevo selezionato una cosa su app inventor, riguardante il testo del messaggio ;)...grazie lo stesso
Eliminaciao 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??
RispondiEliminaCiao , 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
Eliminaciao, innanzi tutto complimenti per il lavoro svolto ed il tempo che ci dedichi.
RispondiEliminaUna domanda: è possibile capire se l'SMS è stato effettivamente inviato o meno (ad esempio per mancanza di copertura)?
Grazie in ogni caso,
Sebastiano
No, non fa parte delle possibilità offerte dal componente texting, mi dispiace.
EliminaCiao 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.
RispondiEliminaGrazie e spero di ricevere risposta. :-)
Devi semplicemente chiamare tante volte il componente texting con il metodo sendmessage per ogni SMS da mandare.
EliminaPuoi 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!
Ciao a tutti
RispondiEliminaHo 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?