Cerca con Google

Translate

14 giugno 2013

Tutorial / Template 49 - Come controllare se è disponibile la connettività internet nella propria App


Abbiamo visto come molto spesso le nostre app necessitino obbligatoriamente di una connessione attiva per poter funzionare ed essere utili (pensate alle app del meteo, della borsa, etc...)

Anche App Inventor non fa eccezione e risulta quindi particolarmente utile poter sapere all'interno della nostra app se la connessione ad internet è attualmente disponibile o meno.

Purtroppo non c'è una strada facile od un blocco ad-hoc ma usando un pò di ingegno e con un pò di pazienza possiamo ottenere un validissimo (e alquanto preciso) controllo sulla connettività usando i blocchi esistenti.


L'idea è quella di sfruttare un sito "campione" (ovvero un sito famoso e sempre raggiungibile), provare ad interrogarlo in App Inventor (usando il componente "web") ed interpretare la sua "risposta".
Se avremo in risposta dei dati, vuol dire che la connessione è a posto, se invece non otteniamo nulla, oppure otteniamo l'infame messaggio "pagina non trovata" od un errore di connettivià, sapremo che la connessione ad internet non è attualmente disponibile.

Di sicuro chi ha lavorato un pò con App Inventor ha visto l'errore "1101" che indica problemi (in genere temporanei) di connessione, bene, anche questo errore verrà intercettato e potremmo quindi agire di conseguenza.

L'esempio mostra solo una webview che viene o non viene visualizzata a seconda dello stato della connessione.
Nel caso ci siano problemi di connessione, usando un ActivityStarter porteremo l'utente direttamente alla pagina delle impostazioni di connessione wifi.

Applicato alle vostre app, questo controllo può essere inserito per esempio prima che vuoi tentiate di recuperare dei dati da una fusion tables, un google docs, un server web, etc...
Solo dopo che avete verificato che la connessione sia ok procederete al recupero dei dati online, evitando così spiacevoli situazioni in cui visualizziamo delle webview con pagine vuote od errori nel recupero dei dati (list index out of range...vi dice qualcosa???)

Buona visione!!!


Vi consiglio di applicare questo codice anche se avete inserito banner pubblicitari (come da mia guida) nella vostra app, in mancanza di connessione valida eviterete così di mostrare il banner (ovvero una pagina vuota od una pagina con errore 404)

Trovate il sorgente di questo template cliccando qua

25 commenti:

  1. Ottimo anche se mette in luce gravi lacune di app inventor perche un'operazione del genere dovrebbe già essere implementata in un unico blocco e credo che per gli sviluppatori del MIT sia un lavoro di poche ore.
    Non mi sto lamentando perche gli sviluppatori stanno facendo un ottimo lavoro, voglio solo suggerire di integrare blocchi cosi essenziali.

    RispondiElimina
    Risposte
    1. mi trovi perfettamente d'accordo, il componente web e il componente webviewer dovrebbero avere un metodo con cui si chiede se la connessione è disponibile, molto semplice.
      Il fatto è che ora tutte le energie sono focalizzate su "new blocks", e fintanto che questo progetto non andrà live credo che le altre feature siano congelate.
      Quindi incrociamo le dita e speriamo che il "new blocks" veda la luce al più presto :)

      Elimina
  2. Volevo porre all'attenzione di tutti che sul blog di M. Hossein Amerkashi's è stata pubblicata un'applicazione per usare AI in locale, l'ho provata. A me non funziona. Vi posto l'indirizzo. http://amerkashi.wordpress.com/2013/06/10/offline-app-inventor/

    RispondiElimina
    Risposte
    1. Grazie, sembra un progetto molto simile ad ai4a, appeana ho un pò di tempo lo provo e vi faccio sapere, mi sembra strano che non ti funzioni, in genere Hossein lavora molto bene ed i suoi progetti sono ottimi (vedi App2Market)
      vi tengo aggiornati...

      Elimina
  3. Grazie mille sebastiano mi hai risolto un grandissimo problema

    RispondiElimina
  4. Per quanto riguarda l'implementazione di questo controllo per banner pubblicitari, io ho pensato e implmentato , ma ancora non provato (riporterò sotto il risultato fra poche ore) un trucchetto forse + semplice.

    I componenti di cui necessito sono :
    1 webviewer, 1 clock, 1 button.

    All'avvio dell'app diremo che webviewer.gotourl sarà "www.nostrositoperbanner.it" (attenzione la pagina in questione non deve avere alcun titolo per funzionare il tutto) .
    Nell'evento timer del clock con timeinterval = 1000 dirò:
    IF webviewer.currentpagetitle > 0 e webviewer.currenturl = "www.nostrositoperbanner.it"
    SETTA webviewer.visible = false e button.visible = false
    ELSE (quindi il controllo nel timere sarà if else )
    SETTA webviewer.visible = true
    IF webviewer.currentpagetitle è > 0
    SETTA button.visible = true

    Il button lo utilizzo semplicente per permettere a chi eventualmente ha cliccato sul banner e quindi si è visto aprire la pagina web,
    di ritornare nella situazione iniziale in cui la webviewer è solo un banner.
    tutto questo dicendo quindi nell'evento click del button che webviewer.gotourl = "www.nostrositoperbanner.it" e button.visible = false


    In pratica nel clock vado a verificare se il titolo della pagina web è maggiore di 0 significa che ha caricato la pagina con un titolo (e quindi non la nostra senza titolo) , questo può succere per due motivi, il primo (gestito nel primo if) è quando non c'è conessione in quanto ritorna una pagina con titolo il messaggio di errore oppure l'altro caso è quello in cui l'utente ha cliccato sulla pagina del banner e questo ha un titolo (caso gestito nel ELSE).


    Le "anomalie" potrebbe essere che se la pagina del banner non ha titolo allora non mi attiva il button, ma forse si può migliorare o anche fregarsene.....

    Purtroppo devo ancora testare la cosa.......



    RispondiElimina
  5. scusa ho segiuto il tuo tutorial alla perfezione ma nella finestra di watch della response code non risulta nnt, se invece provo con il tuo sorgente il valore della response code è 200 se la connessione è ok, come mai cn la tua funziona e cn la mia no? aiuto XD lo esegiuta alla perfezione ma non capisco come mai non funziona :(

    RispondiElimina
    Risposte
    1. ho trovato il problema, in pratica se il test lo faccio cn il sito di google, la response code è 200 se invece il test lo faccio cn il mio sito la response code non esce, come mai? io voglio far indirizzare gli utenti sul mio sito x i banner come devo risolvere questo problema? grazie :D

      Elimina
  6. SI PUO CRARE UN APP COME RICEVITORE WIRELESS??

    RispondiElimina
    Risposte
    1. Ciao, non capisco la tua domanda scusa, cosa intendi per ricevitore wireless? potresti spiegarti meglio, ciao!

      Elimina
    2. per essere chiaro vorrei fare un applicazione dove io posso andare a scrive IP address/Hostname

      Elimina
    3. e cosi facendo mettere in collegamento il mio smartphone con un dispositivo

      Elimina
    4. intendi qualcosa tipo interfacciamento con Arduino? mi pare che se cerchi nel forum qualcuno dei miei lettori ha fatto qualche progetto simile, altrimenti non saprei ma una connessione diretta ip address/hostname non so se sia fattibile,
      perchè non provi a vedere il componente web con cui puoi per esempio fare delle richieste HTTP GET/POST, con quel componente puoi gestire le connessioni http in modo molto versatile, per altre info prova a chiedere sul forum, grazie

      Elimina
    5. ok, controllerò, ma si puo fare un App che riconosca gli indirizzi Ip?? (tipo 168.192.1.0)

      Elimina
    6. dipende da chi ti manda l'indirizzo ip come te lo manda, per esempio se lo può scrivere su una pagina web puoi leggerne il contenuto col componente web.
      Oppure puoi usare una pagina javascript all'interno di AI che recuperi l'indirizzo ip e lo passi ad App Inventor (però per la parte in javascript non ti so aiutare ma so che sarebbe possibile poi passare i risultati ad AI)

      Elimina
  7. error number 1101 e per quando internet non e disponibile,
    attualmente io sto utilizzando error number 601 per quando google maps non e installato, ma error 601 e generale per tutte le app, mica mi sai dire se si puo controllare se un'app specifica si trova sul telefono prima di provarla ad aprire ed avere l'errore? perche fin che si tratta di una, si puo utilizzare 601, ma se sono 2? mi serve controllare google maps, e un app e-mail g-mail va bene.

    RispondiElimina
    Risposte
    1. ScreenShot di quello che uso attualmente, ma non mi piace tanto

      http://goo.gl/yzMFJe

      Elimina
    2. per controllare se un app è installata nel telefono è molto più semplice,
      Methods

      text ResolveActivity ()
      Returns the name of the activity that corresponds to this ActivityStarter, or an empty string if no corresponding activity can be found. You can use this before starting an external application to ensure that the application is installed on the phone.

      in pratica usi il metodo ResolveActivity, se ti ritorna qualcosa vuol dire che l'app è installata se ritorna una stringa vuota vuol dire che l'app non è disponibile nel telefono :)
      cmq complimenti per i tuoi blocchi, funzionali anche se un pò complessi :)

      Elimina
    3. Risolto (diciamo)

      http://goo.gl/J1Ppcj

      In questo caso controlla un app specifica, e va benissimo per controllare es. google maps:
      Action: android.intent.action.VIEW
      ActivityClass: com.google.android.maps.MapsActivity
      ActivityPackage: com.google.android.apps.maps
      DataUri: https://maps.google.it/maps?q= eccetera

      Ma a me serve anche controllare se si dispone di un app e-mail qualsiasi e non una in particolare, infatti quando mando un e-mail da un app io utilizzo soltanto
      Action: android.intent.action.VIEW
      DataUri: mailto:abc@abc.it
      Cosi da aprire il Launcher (nel caso ci sono piu app e-mail ) e chiedermi quale app e-mail utilizzare, perche io non posso sapere l'utente quale app utilizza. Se ne trova solo una si apre qualla in automatico, Il problema e se non ne trova.

      Mi e appena venuto in mente di utilizzare il ResolveActivity per Google Maps e error number 601 per la mail. Almeno per tamponare temporaneamente
      Grazie per il ResolveActivity ( non sapevo a che servisse )
      E grazie per il complimento, ma il maestro sei tu.

      Elimina
  8. Buona sera a tutti, scusate l'ignoranza essendo ai primi approcci.
    Il mio menu editor non è diviso in Buil-in / Myblock / Advanced e non c'è neppure definition.
    Potete aiutarmi ? Grazie anticipatamente....

    RispondiElimina
    Risposte
    1. Questi sono tutorial fatti ancora con App Inventor 1,
      per App Inventor 2 cambia qualcosa ma non molto puoi guardare questa playlist su YouTube per iniziare a capire qualcosa in più su AI2:
      http://www.youtube.com/playlist?list=PL6CnWtV3t02IE94AehI0WwakgaxNLmFJT

      Elimina
  9. non riesco a capire perchè quando premo sul bottone del notifier per andare nelle impostazioni del wifi questo non funziona. ho impostato tutto come nel video ma quando premo il bottone mi si chiude il notifier e mi rimane nell'app.

    RispondiElimina
  10. Dove posso trovare tutti i datida mettere nell'activity starter per la maggior parte delle applicazioni di sistema? Mi sapete suggerire un sito con l'elenco dei principali?

    RispondiElimina