Code Award




43 thoughts on “Code Award

  1. Salve, non capisco quale libro sia meglio prendere per iniziare da zero. Vedo che in android 4 si parla di Android studio e si lascia eclipse. Quindi per chi inizia ora è meglio utilizzare android studio? Ma il 4 libro da per scontate cose che invece per un neofita sono importanti? insomma da dove bisogna iniziare?

    • Sia il libro Android 3 che quello Android 4 sono per chi inizia a programmare per Android. Il primo utilizza eclipse come IDE mentre il secondo utilizza Android Studio il quale è ancora in fase di sviluppo e viene spesso modificato da Google. A parte questo, e qualche API specifica della versione 4 di Android, entrambi vanno bene per chi comincia.

      Saluti
      Massimo

  2. Grazie mille. Comunque lei quale IDE consiglia per chi inizia? meglio Eclipse o Android studio? Secondo lei qual’è è il più intuitivo?
    Grazie
    Francesco

  3. Ciao non so se sia la sezione giusta per chiedere spiegazioni riguardo a un problema che non riesco a risolvere nonostante abbia fatto diverse ricerche sul web . Una volta lanciata l’esecuzione dell’applicazione tramite emulatore , in console mi appare il messagio :

    Error: Could not access the Package Manager. Is the system running?

    Questa cosa non mi succedeva con il pc vecchio .. come si può risolvere ?
    Una volta partito l’emulatore semplicemente non si vede l’icona dell’applicazione che si sta progettando 🙁 . Ho provato come dicono alcuni ad aspettare il caricamento completo dell’emulatore ma nada ..

  4. Ciao Massimo,
    mi permetto di darti del tu, ad ogni modo ho acquistato sta mattina il tuo ultimo libro
    Android 4: Guida allo sviluppatore, e volevo sapere, prima di dedicarmi nella lettura, se sono richieste delle conoscenze particolari di Java (basilari/intermedie) per poter intraprendere il viaggio nella programmazione Android.
    Mi complimento per il testo, ed aspetto gentilmente una risposta

    • Ciao Lorenzo,
      ti ringrazio. Se hai conoscenze di programmazione con un qualunque linguaggio ad oggetti il primo capitolo ti permettera’ di ripassare tutto quello che serve per la parte Java.

      Saluti
      Massimo Carli

  5. Ciao Massimo, torno a scriverti,
    ho iniziato a leggere con molta soddisfazione il tuo libro,
    e per agevolare il mio percorso nello sviluppo Android ho inevitabilmente
    scaricato gli esempi di cui è corredato il libro.
    La maggior parte di essi però non viene visualizzata correttamente all’interno dell IDE,
    quindi volevo chiederti, c’è bisogno di settare qualche path o cos’altro?

    • Buongiorno Lorenzo,
      Come detto a Simone in un altro commento, per importare i progetti del libro e’ necessario utilizzare l’opzione File > Import Project. La versione utilizzata per gli esempi era molto precedente alla versione corrente di Android Studio per cui bisogna cambiare la corrispondente configurazione nei file build.gradle. Ad esempio, per il Capitolo 2, e’ sufficiente utilizzare la seguente configurazione

      buildscript {
      repositories {
      maven { url ‘http://repo1.maven.org/maven2’
      }
      }
      dependencies {
      classpath ‘com.android.tools.build:gradle:0.8.+’
      }
      }
      apply plugin: ‘android’

      dependencies {
      compile files(‘libs/android-support-v4.jar’)
      }

      android {
      compileSdkVersion 19
      buildToolsVersion ‘19.0.1

      defaultConfig {
      minSdkVersion 7
      targetSdkVersion 16
      }
      }
      Spero che questo risolva il problema.
      Saluti
      Massimo Carli

  6. Salve,
    desidero comunicare la mia difficoltà nello studio di Android tramite A.Studio ed il tuo libro. In realtà ho trovato subito interessante il testo sin dal primo capitolo, purtroppo però già per 2 volte, arrivato al capitolo 3, i suggerimenti del testo non coincidevano con quanto realizzato con A.Studio. Mi sono fermato nuovamente e non so se provare con altro testo e senza A.Studio (che purtroppo si aggiorna troppo frequentemente).
    Cosa puoi suggerirmi?

  7. Salve,
    ho letto su internet che prossimamente verrà pubblicata la quinta versione del Suo libro ANDROID. GUIDA PER LO SVILUPPATORE. Per favore vorrei sapere se la pubblicazione avverrà in tempi brevi oppure, avendo necessità di consultare al più presto il testo, sarebbe opportune acquistare al quarta edizione. Grazie

    • Buongiorno,
      la ringrazio per l’interesse. Se tutto va bene la nuova versione del testo dovrebbe uscire ad Ottobre/Novembre per cui le consiglio di iniziare con Android 4 che descrive i concetti che saranno comunque comuni anche nella versione 5 e, probabilmente, 6 dell’ambiente Android.
      Saluti
      Massimo Carli

  8. Salve!
    Sto leggendo il suo libro e lo trovo molto interessante.
    all’ inizio mi sono spaventato.. poi con calma e pazienza ho continuato nell’ impresa.
    ho riscontrato due problemi il primo:

    Cannot launch AVD in emulator.
    Output:
    ERROR: 32-bit Linux Android emulator binaries are DEPRECATED, to use them
           you will have to do at least one of the following:
           – Use the ‘-force-32bit’ option when invoking ’emulator’.
           – Set ANDROID_EMULATOR_FORCE_32BIT to ‘true’ in your environment.
           Either one will allow you to use the 32-bit binaries, but please be
           aware that these will disappear in a future Android SDK release.
           Consider moving to a 64-bit Linux system before that happens.

    Come posso rimediare ?

    Secondo problema:
    Ho scaricato  i file del progetto UGHO .
    quando apro il capitolo 2 ad esempio  compare una finestra di pop up che dice

    The path
    ‘/Applications/Android Studio.app/sdk’
    does not refer to an Android SDK.

    Android Studio will use its default SDK instead:
    ‘/home/jm/Android/Sdk’
    and will modify the project’s local.properties file.

    dopodichè se vado su edit cofiguration  , tab General , module , non è presente nessun modulo ed i pulsanti sulla barra Android device monitor e SDK Manager sono grigi

    • Buongiorno,
      il primo problema e’ legato alla architettura della sua macchina se sembra essere a 32 bit. Come dice l’errore stesso dovrebbe andare direttamente nella cartella in ANDROID_SDK/tools ed eseguire la versione del comando emulator corrispondente. Per evitare problemi di questo tipo le consiglio magari di utilizzare altri emulatori come Genymotion. Per quello che riguarda il progetto UGHO le consiglio di iniziare un nuovo progetto con l’ultima versione di Android Studio e di ricomporre le varie classi mano a mano che legge il testo. La versione di Android Studio attuale e’ infatti molto diversa da quella utilizzata nella scrittura del libro.
      Saluti
      Massimo Carli

  9. Salve,
    ho acquistato il suo libro Android 4 per iniziare a programmare, speriamo di trarne fuori qualcosa di buono. Non ho mai programmato in Java ma vedendo qualche esempio alcune cose sono simili a C per microcontrollori (XC di Microchip).
    Saluti

    • Buongiorno,
      la ringrazio per la fiducia nell’acquisto. La conoscenza di Java e’ un requisito fondamentale che comunque puo’ essere colmato con altre risorse nel caso in cui vi sia esperienza in altri linguaggi.
      Saluti
      Massimo Carli

  10. Oggetto: Google Maps non funzionano sull’emulatore

    Egr. Sig. Carli,
    ho comprato ieri il suo libro “Android 6 – Guida per lo sviluppatore” della Apogeo.

    In passato ho comprato anche il suo libro “Android 4 – Guida per lo sviluppatore”, se posso darle un consiglio
    da inesperto, secondo me invece che sviluppare in tutto il libro una app, sarebbe meglio sviluppare per ogni
    capitolo una piccola app, in modo che sia piu’ facile per il lettore riprodurre l’app per ogni capitolo.

    Ho un problema con le Google Maps che sicuramente per lei sara’ banale:

    Ho creato un progetto selezionando “Google Maps Activity” in fase di creazione del progetto, e ho scritto la API
    Key nel file “google_maps_api.xml”.

    Il programma creato automaticamente da Android Studio (versione 1.5.1) FUNZIONA se collego al computer un
    cellulare reale, mentre NON mi funziona da emulatore, mi appare la scritta:

    “My Application 94 won’t run without Google Play services, which are missing from your phone”.
    Con sotto un bottone con scritto: “Get Google Play services”.

    Se clicco su “Get Google Play services” il programma collassa.

    Sull’emulatore (NON sul cellulare reale) ho provato a cliccare su “Google Maps”, e mi e’ apparsa la richiesta di
    dati dell’account Google, ho inserito i dati (indirizzo e-mail e password) e mi e’ apparsa la mappa degli USA.

    Quando pero’ provo a eseguire il programma generato automaticamente da Android Studio, il programma CONTINUA a
    non funzionare, adesso mi appare la scritta:

    “My Application 94 won’t run unless you update Google Play services”
    con sotto un bottone “Update”

    se clicco su “Update” il programma collassa.
    Come devo fare a far funzionare le Google Maps sull’emulatore?
    Ripeto che il programma sul cellulare reale funziona.

    In attesa della sua risposta porgo Cordiali saluti.

    • Buongiorno,
      intanto la ringrazio per l’acquisto. Il problema dei Google Play Services è dovuta al fatto che la versione presente in esso non è l’ultima disponibile corrispondente a quella che è la versione utilizzata come dipendenza nel suo progetto. Le possibili soluzioni sono due. La prima consiste nell’aggiornare la versione dei Play Services che ha in locale attraverso l’apposito tool di Android Studio (che poi è quello dell’SDK). La seconda, nel caso lei non utilizzi qualche funzione particolare della ultimissima versione, è quella di usare nella sua applicazione una versione compatibile con quella nell’emulatore. In sostanza per utilizzarlo con l’emulatore dovrà modificare la versione dei Play Services nelle dipendenze in modo da allinearsi con quelle nell’emulatore. Ho fatto un accorgimento simile nella versione del libro precedente.

      Saluti
      Massimo Carli

        • Mi scuso, non l’ho spiegato nel testo Android 4 ma in quello dedicato appunto ai Google Play Services. In ogni caso non deve acquistarlo 🙂 e’ sufficiente che invece che utilizzare nell’applicazione l’ultima versione dei Google Play Services utilizzi quella che e’ gestita dall’emulatore. Ovviamente questo solo per i test e nel caso in cui non utilizzi proprio delle feature specifiche della ultimissima versione. In ogni caso le consiglio di utilizzare un dispositivo reale.
          Saluti
          Massimo Carli

          • La questione delle Google Maps e l’emulatore l’ho accantonata, la riprendero’ quando avro’ finito di leggere il
            suo libro “Android 6”.

            Ho scritto un semplice gioco di parole che funziona regolarmente su versioni di Android pre 5.0 mentre mi hanno
            detto che NON funziona su versioni di Android post 5.0.

            C’e’ il sistema di sviluppare app che funzionino in TUTTE le versioni di Android?

            Dopo aver aggiornato Android Studio alla versione 1.5.1 ho notato che la “MainActivty” mi estende la classe
            “AppCompatActivity”, e’ per fare in modo che le app funzionino SIA su Android pre 5.0 SIA su Android post 5.0 ?
            Cordiali saluti.

          • La libreria di compatibilità a cui la classe AppCompatActivity appartiene, servono appunto per far funzionare le applicazioni nelle diverse versioni della piattaforma. Probabilmente si tratta di una qualche configurazione legata all’utilizzo dei temi per i quali sono necessarie delle risorse con opportuni qualificatori ma non dovrebbero comunque esserci problemi.

  11. Egr. Sig. Carli,
    ho un problema con i programmi di esempio del suo libro “Android 6”.
    Ho provato a usare con Android Studio (versione 1.5.1) i programmi d’esempio del Capitolo 3, e mi e’ apparsa la
    scritta di AGGIORNARE Gradle; dopo l’aggiornamento quando provo a eseguire una Activity (per esempio
    “MainActivity.java”) mi appare il seguente messaggio d’errore:

    No resource found that matches the given name (at ‘drawable’ with value
    ‘@drawable/abc_textfield_search_activated_mtrl_alpha’).

    COSA DEVO FARE?

    Dalla finestra “Terminal” di Android Studio ho eseguito “gradlew -v”, riporto il risultato, magari puo’ esserle
    utile.

    Microsoft Windows [Versione 6.3.9600]
    (c) 2013 Microsoft Corporation. Tutti i diritti riservati.

    D:\Backup\tempx\Android Libro – Android 6 – Massimo Carli\3340_fileEsempio\file_
    esempio\Capitolo_03\Capitolo_03\ApoBus>gradlew -v

    ————————————————————
    Gradle 2.8
    ————————————————————

    Build time: 2015-10-20 03:46:36 UTC
    Build number: none
    Revision: b463d7980c40d44c4657dc80025275b84a29e31f

    Groovy: 2.4.4
    Ant: Apache Ant(TM) version 1.9.3 compiled on December 23 2013
    JVM: 1.8.0_31 (Oracle Corporation 25.31-b07)
    OS: Windows 8.1 6.3 amd64

    D:\Backup\tempx\Android Libro – Android 6 – Massimo Carli\3340_fileEsempio\file_esempio\Capitolo_03\Capitolo_03\ApoBus>

    • Buongiorno,
      ho appena scaricato i file di esempio dal sito ed importato il progetto del Capitolo 3 come nel documento leggimi.html nello stesso zip e tutto funziona. Le uniche differenze sono che ho utilizzato Android Studio 2.0 Beta 6 ma non dovrebbe essere questo il problema. Sebbene Google cambi le cose in continuazione le consiglio di utilizzare la mia stessa versione di AS e di importare il progetto con l’apposita opzione Import (sicuro di non aver semplicemente fatto open?). Quando AS non riconosce le risorse probabilmente il progetto non è stato importato correttamente.

      Saluti
      Massimo Carli

  12. Egr. Sig. Carli,
    sto visionando l’app di esempio del capitolo 6 “LayoutTest” (del suo libro “Android 6”).
    Dando uno sguardo al AndroidManifest.xml ho notato che la prima app a essere chiamata e’ “FrameActivity”.
    Mi sembra che tale Activity chiama SOLO la classe “ViewUtility”, tutte le altre Activity NON vengono chiamate
    (mi corregga se sbaglio).
    Le altre Activity che ci stanno a fare? Come si fa a lanciarle?

    Ho provato a lanciare l’Activity “DeclarativeActivity” (allego l’immagine [1]) ma ottengo il messaggio d’errore
    che allego (immagine [2]).
    Cordiali saluti.

    [1] https://www.dropbox.com/s/j7tlgg0rzy9vh7o/Tante%20Activity%201.png?dl=0

    [2] https://www.dropbox.com/s/8syrd5mlh057bfm/Tante%20Activity%202.png?dl=0

    • Buongiorno,
      nel codice di esempio ci sono tutte le Activity descritte nei corrispondenti capitoli che descrivono diversi aspetti della programmazione Android. Leggendo il testo si dovrebbero abilitare solo le attività effettivamente descritte. Le consiglio quindi di leggere i vari capitoli e di indicare nel file AndroidManifest.xml solamente le attività che sono descritte nel caso specifico.
      Saluti
      Massimo Carli

  13. Salve, ho comprato sia Android 4, sia Android 6, volevo chiederle 2 cose,
    1) è possibile avere il progetto presente nel libro Andoid4 anche per versioni più recenti di Android Studio (tipo la 1.5) senza dover creare un progetto nuovo e far copia incolla delle varie classi?
    2) per quanto riguarda la parte DataBase, nei suoi libri viene vista solo la parte “lato client”, è possibile vedere anche la parte “lato server” (ovvero come syncronizzare il DB dal cache al server?)
    Grazie

    • Buongiorno,
      la ringrazio per gli acquisti 🙂 Quando ho deciso di scrivere il testo per Android 6 ero indeciso se realizzare la stessa applicazione ma poi ho deciso di fare qualcosa di nuovo. Realizzare l’applicazione del testo Android 4 con quello descritto in Android 6 può essere un ottimo esercizio.
      Per quello che riguarda la gestione della interazione con il DB in realtà ho scritto un libro intero al riguardo ovvero il mio secondo che può trovare al seguente link 🙂
      Saluti
      Massimo Carli

  14. Egr. Sig. Carli,
    ho un problema che forse lei sapra’ risolvere:

    ho un AsyncTask che conta il tempo trascorso, con “publishProgress(1);” scrive un punteggio che aumenta di 1 ogni
    “nSecondi”, e con “publishProgress(2);” scrive il tempo trascorso (ore, minuti e secondi).

    Il tempo trascorso viene scritto in tempo reale, mentre la scrittura del punteggio e’ LENTA, se imposto la
    variabile “nSecondi” a 3, il punteggio NON aumenta di 1 ogni 3 secondi ma ogni 5/6 secondi.

    COME POSSO FARE PER FAR SCRIVERE IL PUNTEGGIO PIU’ VELOCEMENTE?

    Ho provato a cambiare il metodo “doInBackground” (quello messo tra “/*” e “*/”), in quel modo il punteggio si
    aggiorna in tempo reale, ma il tempo trascorso NON si aggiorna piu’ in tempo reale ma ogni “nSecondi”.

    Mi dica se sono stato chiaro.

    class aumentaPunteggioTempo extends AsyncTask // 1==punteggio, 2==tempo
    {

    public Void doInBackground(Void … v)
    {
    time_orax = System.currentTimeMillis();
    while (!finito)
    {
    time_ora = System.currentTimeMillis();
    do {
    secondi_passati = (System.currentTimeMillis() – time_ora) / 1000;
    calcolaTempo();
    } while (secondi_passati <= nSecondi);
    publishProgress(1);
    }
    return(null);
    }

    /*
    public Void doInBackground(Void … v)
    {
    time_orax = System.currentTimeMillis();
    while (!finito)
    {
    calcolaTempo();
    try {
    Thread.sleep(nSecondi * 1000);
    }
    catch (Exception exc)
    {
    Log.d("***Exception:",exc.toString());
    }
    publishProgress(1);
    }
    return(null);
    }
    */

    public void calcolaTempo()
    {
    secondi_passatix = (System.currentTimeMillis() – time_orax) / 1000;

    minuti = secondi_passatix / 60;
    secondi = secondi_passatix – (minuti * 60);

    ore=minuti/60;
    minuti=minuti-(ore*60);

    publishProgress(2);
    }

    @Override
    protected void onProgressUpdate(Integer… values)
    {
    if (values[0]==1)
    {
    punteggio++;
    scriviPunteggio();
    }

    if (values[0]==2)
    {
    scrittaTempo=(TextView) findViewById(R.id.testoTempo);
    scrittaTempo.setText("Tempo: "+addZero(ore)+":"+addZero(minuti)+":"+addZero(secondi));
    }

    }

    public String addZero(long n)
    {
    if (n<10) return("0"+n);
    return(""+n);
    }

    • Buongiorno,
      nel caso in question un AsyncTask non e’ la solution migliore. Esso serve infatti il piu’ delle volte per l’esecuzione di un task in background di cui si vuole conoscere lo stato di avanzamento e soprattutto il completamento. La funzionalita’ di timer non e’ quella cpiu’ adatta a questo componente anche perche’ il tempo in cui un task viene eseguito non e’ deterministico ma e’ legato al particolare Executor utilizzato ed agli altri task in coda. In questo caso le consiglio di guardare l’AlertManager.
      Saluti
      Massimo Carli

      • Egr. Sig. Carli,
        ho provato su Internet un esempio di uso di “AlarmManager”, il metodo “setAlarm” funziona, solo che funziona una
        volta sola, puo’ dirmi per favore come fare per farlo funzionare finche’ non si esce dall’Activity?

        Quando si esce dall’Activity (quindi nel metodo “onDestroy”) devo scrivere “unregisterReceiver(receiver)” ?
        Grazie!

        public void setAlarm() // da scrivere “unregisterReceiver” in onDestroy?
        {
        // in questo esempio nSecondi==1
        BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override public void onReceive( Context context, Intent x)
        {
        //context.unregisterReceiver( this ); // this == BroadcastReceiver, not Activity
        punteggio++;
        scriviPunteggio();
        }
        };

        registerReceiver( receiver, new IntentFilter(“tempo_nSecondi”) );

        PendingIntent pintent = PendingIntent.getBroadcast( getApplicationContext(), 0, new Intent(“tempo_nSecondi”), 0 );
        AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);

        // set alarm to fire 5 sec (1000*5) from now (SystemClock.elapsedRealtime())
        manager.set( AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000*nSecondi, pintent );
        }

          • Come vanno impostati i campi di “setRepeating” ?
            La linea di codice qui sotto NON funziona (cioe’ funziona UNA volta sola).

            manager.setRepeating(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime()+1000*nSecondi,1 , pintent);

            Le ricordo che vorrei che il tutto funzionasse finche’ non si esce dall’Activity.
            Cordiali saluti.

  15. Egr. Sig. Carli,
    ho provato a scrivere DUE “CountDownTimer”, uno per visualizzare il tempo trascorso (ore:minuti:secondi) e uno
    per visualizzare il punteggio (che aumenta di uno ogni “nSecondi”).
    Il programma funziona solo che i due tempi NON sono “sincronizzati”, nel senso che se imposto nSecondi=1 il
    punteggio E’ PIU’ VELOCE del tempo trascorso; quando il punteggio e’ uguale a 10 il tempo trascorso e’ sempre a
    “00:00:09”.
    COME POSSO FARE A RISOLVERE QUESTO PROBLEMA?
    Cordiali saluti.

  16. Egr. Sig. Carli,
    il problema dei tempi l’ho risolto (ho cambiato il modo con cui veniva calcolato il tempo), ora ho un altro problema: come faccio a sapere a quanti pixel corrisponde 1 dp alle varie risoluzioni (480×800, 720×1280, 1440×2560) ?
    Cordiali saluti.

  17. Egr. Sig. Carli,
    nel codice che di seguito riporto c’e’ questa linea:

    imageView.setLayoutParams(new GridView.LayoutParams(40, 40));

    i parametri di GridView.LayoutParams() che significano?
    Non sono ne in DP ne in Pixel, COSA SONO?

    public class ImageAdapter extends BaseAdapter {
    private Context mContext;
    private ArrayList listaImg;

    // Constructor
    public ImageAdapter(Context c,ArrayList lista) {
    mContext = c;
    listaImg=lista;
    }

    public int getCount() {
    //return mThumbIds.length;
    return(listaImg.size());
    }

    public Object getItem(int position) {
    return null;
    }

    public long getItemId(int position) {
    return 0;
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;

    if (convertView == null) {
    imageView = new ImageView(mContext);
    //imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
    imageView.setLayoutParams(new GridView.LayoutParams(40, 40));
    //imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    imageView.setPadding(8, 8, 8, 8);
    }
    else
    {
    imageView = (ImageView) convertView;
    }
    imageView.setImageResource(listaImg.get(position));
    return imageView;
    }
    }

Leave a Reply

Your email address will not be published. Required fields are marked *