Autore Topic: Consigli su aggiornamenti delle proprie app  (Letto 928 volte)

Offline d4®io

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
Consigli su aggiornamenti delle proprie app
« il: 26 Febbraio 2018, 10:05:11 CET »
0
Ciao ragazzi, fino ad ora mi sono sempre dedicato all’apprendimento e creazione di piccole applicazioni in locale, ora sono quasi pronto per pubblicare la mia prima app e non riesco a trovare informazioni su ciò che mi interessa, ovvero, una volta pubblicata la mia app su g play, considerando che dovrò aggiornare i dati ogni 2/3 giorni come dovrò procedere?

Ogni volta dovrò aggiornare la versione? Tipo 1.0.1, 1.0.2,1.0.3, ecc…?

Dovrei fare circa 155/157 aggiornamenti all’anno, questo significa che dovrò di volta in volta progredire la versione?

Possibile che non ci sia un metodo meno sconveniente? Si tratta di aggiornare dei dati (sostanzialmente delle stringhe).

Inoltre ho un altro dubbio, che differenza c’è nell’ospitare un’applicazione su un server quindi utilizzare un database per salvare i dati, ed eseguire questo lavoro in locale riportando quei piccoli aggiornamenti per poi caricare l’applicazione aggiornata sullo store di google, quindi senza l’utilizzo di sql?

Ho letto un punto in particolare su ...support.google.com/googleplay/android-developer/…

«Google Play è in grado di gestire gli aggiornamenti di applicazioni precaricate nei seguenti casi:
L'app precaricata deve essere gratuita...»

Ok, ma se io decidessi di pubblicare un’applicazione a pagamento?

Non so se sono stato abbastanza chiaro, ma quello di cui ho bisogno sono informazioni su come meglio gestire gli aggiornamenti della propria applicazione sviluppata, e ringrazio in anticipo chiunque abbia voglia di delucidarmi.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 835
  • Respect: +182
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Consigli su aggiornamenti delle proprie app
« Risposta #1 il: 26 Febbraio 2018, 10:56:01 CET »
+1
Per "app precaricata" si intende un'applicazione di sistema distribuita insieme al sistema operativo, quindi non è il tuo caso.

Per la gestione degli aggiornamenti dato che nel tuo caso si tratta solo di stringhe ti suggerirei di mettere un file di testo online e scaricarlo una volta al giorno dalla tua app.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline d4®io

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
Re:Consigli su aggiornamenti delle proprie app
« Risposta #2 il: 26 Febbraio 2018, 18:50:54 CET »
0
Ciao, ho visto solo ora, non pensavo di ricevere una risposta così rapidamente.

Il fatto è che l’applicazione contiene al suo interno diversi file in formato csv, dai quali elaboro queste stringhe per poi utilizzarle per ciò che mi servono. Non ho utilizzato SQLite per diverse ragioni, la principale è il tempo impiegato per apprendere tutto il meccanismo per me abbastanza scomodo, e poi onestamente tra lo scegliere di inserire dei dati in un database o in un file interno ho preferito la seconda opzione (molto più rapida appunto). Inoltre l’applicazione è predisposta per essere utilizzata solo con i classici pulsanti, l’utente non avrà la possibilità di immettere alcun valore manualmente.

Ti dico questo perché suppongo che per aggiornare determinati file da un URL dovrò necessariamente utilizzare SQLite, o sbaglio? Ed è proprio quello che vorrei evitare, perché significherebbe apportare grosse modifiche all’intera applicazione.

Se invece sto dicendo una stupidata, mi daresti una dritta scrivendo cortesemente quel pezzetto di codice utile per eseguire questa operazione?

Insomma la vera domanda è: Una volta terminata un’applicazione (nel mio caso senza l’ausilio di SQLite) come faccio per gli aggiornamenti? Pensavo di aggiornarla in locale e poi caricare l’applicazione “aggiornata” su g play. È fattibile o no questa cosa?

Ovviamente ti ringrazio per la risposta (anche la precedente). 
« Ultima modifica: 26 Febbraio 2018, 18:59:55 CET da d4®io »

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 835
  • Respect: +182
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Consigli su aggiornamenti delle proprie app
« Risposta #3 il: 27 Febbraio 2018, 11:32:02 CET »
+1
Puoi scaricare direttamente il .csv, salvarlo in una cartella interna dell'app e leggerlo da lì invece che da "assets".

Qui c'è un esempio molto più che completo su come scaricare file in background:

https://developer.android.com/training/basics/network-ops/connecting.html

Oppure puoi usare qualche libreria, tipo:
https://github.com/square/okhttp
https://github.com/kk121/File-Loader
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline d4®io

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
Re:Consigli su aggiornamenti delle proprie app
« Risposta #4 il: 27 Febbraio 2018, 19:10:39 CET »
0
Puoi scaricare direttamente il .csv, salvarlo in una cartella interna dell'app e leggerlo da lì invece che da "assets".

Qui c'è un esempio molto più che completo su come scaricare file in background:

https://developer.android.com/training/basics/network-ops/connecting.html

Oppure puoi usare qualche libreria, tipo:
https://github.com/square/okhttp
https://github.com/kk121/File-Loader

Ciao, leggendo il tuo messaggio precedente, mi sono incuriosito, quindi cercato informazioni (prima di leggere questo msg.) e ho fatto alcuni tentativi con la libreria volley, che sembra funzionare bene. Il problema è che non riesco a salvare i dati, inizialmente pensavo di appendEre le nuove righe ai vecchi file, poi mi sono detto “perché non sovrascriverli direttamente?”, ma in ogni caso sto fallendo perché viene sempre fuori quell’antipatico messaggio di errore:
Codice (Java): [Seleziona]
W/System.err: java.io.FileNotFoundException: file:/android_asset/android.content.res.AssetManager$AssetInputStream@63e1acf (No such file or directory)
Ho creato un’app di prova per capire come muovermi, inserendo alcuni file come nel progetto originale ma al momento non riesco ad andare oltre, eppure il percorso del file è identico assets/directory/file.csv

Sto passando il context al costruttore della classe ma probabilmente sbaglio qualcosa… 

Ad ogni modo approfondirò l’argomento su .developer.android.com/...   sperando di risolvere da solo, altrimenti romperò ancora le scatole. ;-)

Aspetta, tu mi stai suggerendo di scaricare i file direttamente in una directory... Io invece sto cercando di sovrascrivere quelii vecchi,  leggerò quel tutorial. 

Ohmnibus, grazie del tuo tempo.
« Ultima modifica: 27 Febbraio 2018, 19:18:40 CET da d4®io »

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 835
  • Respect: +182
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Consigli su aggiornamenti delle proprie app
« Risposta #5 il: 27 Febbraio 2018, 21:44:54 CET »
+1
La cartella "assets" è di sola lettura... non puoi sovrascrivere quei file
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline d4®io

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
Re:Consigli su aggiornamenti delle proprie app
« Risposta #6 il: 28 Febbraio 2018, 09:24:55 CET »
0
Ciao, quindi cosa devo fare? Creare una cartella res/raw e utilizzare quella? Mi serve un consiglio esplicito, altrimenti mi ci addormento su questa cosa...  :-X
Ad ogni modo tra un po comincio a studiarmi un metodo alternativo, ieri sera prima di chiudere ho fatto alcuni tentativi senza perdere troppo tempo, creando appunto una raw e spostando al suo interno uno di questi file, ma il messaggio era identico. Ho anche provato ad inserire ogni genere di permesso:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Bè, adesso faccio altri test, in ogni caso se hai due minuti, puoi lasciarmi giusto un paio di consigli,
(se poi avrò risolto meglio) tipo dove è preferibile inserire questi file, se è possibile salvare un file grezzo (così com’è) dal web in un determinato percorso?

E poi avrei una curiosità, di solito chi pubblica un’applicazione che necessita di spazio di archiviazione, utilizza un Web hosting (tipo Aruba, o qualsiasi altro tra i migliaia disponibili) oppure un servizio di archiviazione (appunto) tipo Dropbox?

« Ultima modifica: 28 Febbraio 2018, 09:26:57 CET da d4®io »

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 835
  • Respect: +182
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Consigli su aggiornamenti delle proprie app
« Risposta #7 il: 28 Febbraio 2018, 09:51:54 CET »
+1
No, per salvare file nello spazio privato dell'app devi usare delle cartelle specifiche fornite dal so. Esempio:

Codice (Java): [Seleziona]
String filename = "myfile";
String fileContents = "Hello world!";
FileOutputStream outputStream;

try {
    outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
    outputStream.write(fileContents.getBytes());
    outputStream.close();
} catch (Exception e) {
    e.printStackTrace();
}

Dettagli:
https://developer.android.com/training/data-storage/files.html#java

Suggerimento:
Ti consiglio di cercare quello che ti serve su developer.android.com, il sito ufficiale di android. Ci sono moltissime guide ed esempi

Per le altre domande:
- Non hai bisogno di sapere quale sia la cartella dove sono scritti i file, ti basti sapere che per accedervi puoi usare i metodi getFilesDir(), openFileOutput e openFileInput
- Il tuo file puoi metterlo dove ti pare, a patto che sia accessibile. Personalmente ho usato con successo DropBox, ma va bene anche google drive o un qualsiasi sito web. (naturalmente il file deve essere accessibile da chiunque e quindi condiviso)
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline d4®io

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
Re:Consigli su aggiornamenti delle proprie app
« Risposta #8 il: 28 Febbraio 2018, 12:15:42 CET »
0
Innanzitutto ti ringrazio per la pazienza, ma vedi quando ho scritto il mio primo messaggio avevo un’applicazione completa al 90% circa, dovevo solo apportare alcune modifiche (ovviamente avevo trascurato la parte “web”) e invece solo adesso scopro che questo sistema di caricare file dalla rete, sì, probabilmente mi farà risparmiare tempo una volta impostato il tutto, ma mi costringerà a rivedere un sacco di cose.

Avevo tante classi separate predisposte per ogni opzione scelta dall’utente, e ora dovrò cercare di implementare questo metodo che a mio pare fa un po pietà perché non posso visualizzare i file (quindi controllarli direttamente dall’ide) poiché vengono inseriti da quel che ho capito in questa benedetta cartella “data” alla quale si accede solo tramite il tool Device Monitor File Explorer che non sembra reagire rapidamente alle mie richieste, probabilmente perché utilizzo linux. Qui vedo data, data_1, data_2, data_3, ma cliccando su una qualsiasi di queste cartelle non accade nulla (sono passati circa 5 minuti) insomma sembra fare ogni cosa tranne quello che gli chiedo io (smartphone fisico non virtuale).

Per copiare i file dalla rete sto utilizzando List<String> quelFile dal momento che questi file andranno crescendo di dimensioni, alcuni contengono qualche migliaio di righe, e ho seguito il tuo consiglio outputStream.write(fileContents.getBytes()); che probabilmente farà risparmiare spazio, però quando poi ho controllato il contenuto mostra caratteri assurdi, per cui ho preferito non utilizarlo (il getBytes()).

Comunque, morale della storia, i tuoi consigli mi sono stati davvero utili e ti ringrazio, anche per lo spazio di archiviazione, in questo momento sto utilizzando uno spazio del mio hosting dove posseggo un paio di siti (che trattano tutt’altro, per questo preferirei cercare un’alternativa magari in stile Dropbox, poi si vedrà), l’unica cosa, è che adesso, come dicevo poc’anzi, dovrò cercare di modificare una parte importante dell’applicazione, dal momento che quest’ultima non può funzionare senza questi file.

Per adesso passo e chiudo.  :D

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 835
  • Respect: +182
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Consigli su aggiornamenti delle proprie app
« Risposta #9 il: 28 Febbraio 2018, 12:38:34 CET »
+1
In verità è tutto molto più semplice di quello che sembra.

Per aprire il file, mentre primi usavi la cartella "assets", adesso dovrai usare la cartella restituita da "getFilesDir()":

Codice (Java): [Seleziona]
File file = new File(context.getFilesDir(), "file.csv");
Per salvare il file, apri due stream, uno in lettura da web ed uno in scrittura su filesystem (openFileOutput). Poi leggi un blocco di dati alla volta (es 2048 byte) dalla rete e lo scrivi su FS.

Codice (Java): [Seleziona]
byte[] buffer = new byte[2048];
int byteRead = 0;
inputStream = ... //Stream di dati dalla connessione, varia in base alla libreria che stai usando
outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
//Leggo lo stream dalla rete e metto il contenuto in "buffer".
//Il numero di byte letti è assegnato a "byteRead".
//Normalmente "byteRead" sarà pari a 2048, ma per l'ultimo blocco sarà minore
//Quando non ci sono più dati "byteRead" è 0 e si esce dal while
while ((byteRead = inputStream.read(buffer)) > 0) {
  outputStream.write(buffer, 0, byteRead);
}
outputStream.close();
inputStream.close();

In questo modo qualsiasi sia la dimensione del CSV ne leggo 2 kb alla volta, senza riempire la memoria.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline d4®io

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
Re:Consigli su aggiornamenti delle proprie app
« Risposta #10 il: 02 Marzo 2018, 14:39:37 CET »
0
Sono tornato…
Ho seguito i tuoi consigli, e dal momento che riscontravo alcuni problemi con la libreria volley, ho cambiato nuovamente (non utilizzando alcuna libreria esterna) seguendo un esempio trovato in rete. Adesso il problema principale è che non riesco ad aggiornare più di un file alla volta.

Ovviamente a me interessa aggiornarli tutti insieme in modo automatico (i file sono una decina).
A tal proposito ho bisogno di uno/due, dei tuoi preziosi consigli.

Ricordi di avermi suggerito all’inizio, fai il download una volta al giorno...
 
1) Come faccio? Ho pensato di inserire il tutto nell’activity principale in maniera tale che quando si apre l'applicazione vengono eseguiti gli aggiornamenti, ma sto riscontrando problemi. Quando passo questo codice → new ScaricaFileTask().execute("url") al mio Task: ScaricaFileTask extends AsyncTask<String, Integer, String>… quest’ultimo esegue ciò che gli viene chiesto, ma se gli passo più URL non fa un bel niente.

2) Come faccio ad aggiornare i file “se e solo se” sono di dimensioni diverse?
Il mio problema è che non riesco a “confrontare” i file presenti con quelli che scarico dalla rete.

Hai voglia cortesemente di spiegarmi come procedere?
Forse è meglio se Inserisco il codice che sto utilizzando per questi dati (ovviamente è una classe test).

Codice (Java): [Seleziona]
...
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.testo);
        new ScaricaFileTask().execute("https://goo.gl/altro");
    }

private InputStream aproConnessioneHttp(String urlStringa) throws IOException {

        InputStream in = null;
        int risposta = -1;

        URL url = new URL(urlStringa);
        URLConnection connection = url.openConnection();

        if (!(connection instanceof HttpURLConnection))
            throw new IOException("No connessione HTTP!");

        try {
            HttpURLConnection httpURLConnection = (HttpURLConnection) connection;
            httpURLConnection.setAllowUserInteraction(false);
            httpURLConnection.setInstanceFollowRedirects(true);
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.connect();
            risposta = httpURLConnection.getResponseCode();
            if (risposta == HttpURLConnection.HTTP_OK) {
                in = httpURLConnection.getInputStream();
            }
        } catch (Exception e) {
            Log.d("Connessione ", e.getLocalizedMessage());
            throw  new IOException("Errore connessione!");
        }

        return in;

    }

    private String scaricaFile(String url) {

        int BUFFER_SIZE = 2048;
        InputStream in = null;
        OutputStream out = null;

        try {
            in = aproConnessioneHttp(url);
        } catch (IOException e) {
            Log.d("Servizio veb ", e.getLocalizedMessage());
            return "";
        }


        try {
            out = openFileOutput(nomeFile, MODE_PRIVATE);
        } catch (FileNotFoundException e) {
            Log.d("Apertura file ", e.getLocalizedMessage());
        }

        int charRead = 0;
        String str = "";
        byte[] inputBuffer = new byte[BUFFER_SIZE];
        try {
            while ((charRead = in.read(inputBuffer)) > 0) {
                out.write(inputBuffer,0,charRead);
            }
            out.close();
            in.close();
        } catch (IOException e) {
            Log.d("Servizio veb ", e.getLocalizedMessage());
            return "";
        }

        return str;
    }

    private class ScaricaFileTask extends AsyncTask<String, Integer, String> {

        @Override
        protected void onPreExecute() {
            progressBar = findViewById(R.id.progressBar);          
            progressBar.setVisibility(View.VISIBLE);

            super.onPreExecute();
        }

        @Override
        protected void onProgressUpdate(Integer... values) {          
            progressBar.incrementProgressBy(5);            
            super.onProgressUpdate(values);
        }

        @Override
        protected String doInBackground(String... urls) {
            return scaricaFile(nomeFile, urls[0]);
        }

        @Override
        protected void onPostExecute(String result) {
            progressBar.setVisibility(View.INVISIBLE);            
            Toast.makeText(getBaseContext(), "Dati aggiornati...", Toast.LENGTH_LONG).show();
        }
    }

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 835
  • Respect: +182
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Consigli su aggiornamenti delle proprie app
« Risposta #11 il: 03 Marzo 2018, 13:09:53 CET »
+1
Avevi sempre parlato di un unico csv, se sono più di uno le cose si complicano.

1) il problema è molto semplice: tu nell'AsyncTask leggi sempre e solo il primo url:

Codice (Java): [Seleziona]
return scaricaFile(nomeFile, urls[0]);
cambia in

Codice (Java): [Seleziona]
for (String url : urls) {
  scaricaFile(nomeFile, url);
}
return "";

Nota che anche così non funziona, perché ogni download sovrascrive il precedente. Devi trovare un modo per fornire un "nomeFile" per ogni url.

2) Confronto inutile. I file potrebbero essere diversi anche con la stessa dimensione. Ti suggerisco di
  a) Scaricare sempre e comunque, anche se i file non sono cambiati
  b) Aggiungere un ulteriore file che contiene l'elenco dei file con la data di aggiornamento. Questo file invece di salvarlo lo leggi e basta, poi aggiorni solo i file che hanno bisogno di essere aggiornati.

Un esempio del file "b)" può essere:
20180301 - http://miourl/miofile1.csv
20180220 - http://miourl/miofile2.csv
20180228 - http://miourl/miofile3.csv


Dove la data indica quando è stato il file corrispondente
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline d4®io

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
Re:Consigli su aggiornamenti delle proprie app
« Risposta #12 il: 04 Marzo 2018, 11:44:51 CET »
0
Ciao, avevo risolto la faccenda degli URLs, (...a proposito, il tuo consiglio sulla data nei file è molto utile, grazie!) ma andiamo avanti, a quanto pare sorgono sempre altri piccoli problemi, questo perché non ho molta pratica con questi AsyncTask (tra l’altro è indispensabile familiarizzarci ed è quello che sto facendo).

In pratica ho pensato di inserire una semplice progressBar circolare dal momento che la progressDialog è deprecata, quindi ho inserito un TextView al centro di quest’ultima per mostrare la percentuale di aggiornamento, ma non funziona un bel niente.

Il problema alla radice, è che per qualche ragione a me sconosciuta, il metodo onProgressUpdate(Integer... progress) non viene considerato, per cui non avviene alcun aggiornamento sullo stato della barra, il testo, ecc. Di seguito ti inserisco un pezzo del codice aggiornato, poi con calma mi risponderai (se ne avrai voglia). Purtroppo non so a chi rivolgermi altrimenti non sarei qui a scocciare con le mie domande, però chissà magari potranno servire a qualcun’altro.

Codice (Java): [Seleziona]
    private TextView textView;
    private ProgressBar progressBar = null;
    private boolean connessione = true;

    private Map<String, String> link;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressBar = findViewById(R.id.progressBar);
        textView = findViewById(R.id.testo);

        link = new HashMap<>();

        link.put("https://...", "file.csv");
        link.put("https://...", "file.csv");
        link.put("https://...", "file.csv");
        link.put("https://...", "file.csv");
        link.put("https://...", "file.csv");
        link.put("https://...", "file.csv");
        link.put("https://...", "file.csv");
        link.put("https://...", "file.csv");
        link.put("https://...", "file.csv");
        link.put("https://...", "file.csv");
        link.put("https://...", "file.csv");

        new ScaricaFileTask().execute();

    }
 private InputStream aproConnessioneHttp(String urlStringa) throws IOException {

        InputStream in = null;
        int risposta = -1;

        URL url = new URL(urlStringa);
        URLConnection connection = url.openConnection();

        if (!(connection instanceof HttpURLConnection)) {
            throw new IOException("No connessione HTTP!");
        }

        try {
            HttpURLConnection httpURLConnection = (HttpURLConnection) connection;
            httpURLConnection.setAllowUserInteraction(false);
            httpURLConnection.setInstanceFollowRedirects(true);


            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.connect();
            risposta = httpURLConnection.getResponseCode();
            if (risposta == HttpURLConnection.HTTP_OK) {
                in = httpURLConnection.getInputStream();
            }
            connessione = true;
        } catch (Exception e) {
            Log.d("Connessione ", e.getLocalizedMessage());
            connessione = false;
            ((HttpURLConnection) connection).disconnect();
            throw new IOException("Errore connessione!");

        }
        return in;

    }

    private String aggiornaFile(String url, String csv) {

        int BUFFER_SIZE = 2048;
        InputStream in = null;
        OutputStream out = null;

        if (!connessione)
            return null;
        else {
            try {
                in = aproConnessioneHttp(url);
            } catch (IOException e) {
                Log.d("aproConnessione ", e.getLocalizedMessage());
                return null;
            }

            try {
                out = openFileOutput(csv, MODE_PRIVATE);
            } catch (FileNotFoundException e) {
                Log.d("openFileOutput ", e.getLocalizedMessage());
                return null;
            }

            int charRead = 0;
            byte[] inputBuffer = new byte[BUFFER_SIZE];
            try {
                while ((charRead = in.read(inputBuffer)) > 0) {
                    out.write(inputBuffer, 0, charRead);
                }
                out.close();
                in.close();
            } catch (IOException e) {
                Log.d("Errore scrittura ", e.getLocalizedMessage());
                return null;

            }
        }
        return "";
    }

private class ScaricaFileTask extends AsyncTask<String, Integer, String> {

        @Override
        protected void onPreExecute() {

            progressBar.setProgress(0);
            progressBar.setVisibility(View.VISIBLE);

            ObjectAnimator animation = ObjectAnimator.ofInt(progressBar, "progress", 0, 500);
            animation.setDuration(5000);
            animation.setInterpolator (new DecelerateInterpolator());
            animation.start();

            super.onPreExecute();

        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
            Log.d("progresso ", Integer.toString(progress[0]));
            progressBar.setProgress(progress[0]);
            textView.setText(Integer.toString(progressBar.getProgress()));

            super.onProgressUpdate(progress[0]);
        }

        @Override
        protected String doInBackground(String... strings) {

            for (Map.Entry<String, String> entry : link.entrySet()) {
                aggiornaFile(entry.getKey(), entry.getValue());
            }

            return "";
        }

        @Override
        protected void onPostExecute(String result) {

            progressBar.clearAnimation();
            progressBar.setVisibility(View.INVISIBLE);

            if(connessione && result != null) {
                System.out.print(result);              
                Intent home = new Intent(MainActivity.this, HomeActivity.class);
                home.putExtra("msg", "App aggiornata con successo..");
                startActivity(home);
                finishAffinity();
            } else {
                if(!isCancelled())
                    cancel(true);
                Intent home = new Intent(MainActivity.this, HomeActivity.class);
                home.putExtra("msg", "Niente di nuovo..");
                startActivity(home);
                finishAffinity();
            }
            super.onPostExecute(result);
        }
    }

Ho provato anche ad inserire una barra semplice (sempre circolare) senza animazione, ma le cose non cambiano.

Ti ringrazio in anticipo.  :-)
« Ultima modifica: 04 Marzo 2018, 11:55:43 CET da d4®io »

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 835
  • Respect: +182
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Consigli su aggiornamenti delle proprie app
« Risposta #13 il: 04 Marzo 2018, 13:22:35 CET »
+1
onProgressUpdate non funziona in automatico, devi chiamarlo tu dalla doInBackground, es:

Codice (Java): [Seleziona]
        @Override
        protected String doInBackground(String... strings) {
            int progress = 0;
            for (Map.Entry<String, String> entry : link.entrySet()) {
                aggiornaFile(entry.getKey(), entry.getValue());
                int percentuale = (progress++ * 100)/link.size();
                onProgressUpdate(percentuale);
            }

            return "";
        }
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline d4®io

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: 0
    • Mostra profilo
Re:Consigli su aggiornamenti delle proprie app
« Risposta #14 il: 04 Marzo 2018, 18:28:45 CET »
0
Alla fine deciso di inserire una barra orizzontale definendo lo stile in drawable, e va bene uguale.  ;-)

Codice (XML): [Seleziona]
 <ProgressBar
       android:id="@+id/progressBar"
       style="@android:style/Widget.ProgressBar.Horizontal"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerHorizontal="true"
       android:layout_centerVertical="true"
       android:progressDrawable="@drawable/progress_bar"
       android:minHeight="25dp"
       android:minWidth="250dp"
       android:progress="5"/>

Codice (Java): [Seleziona]
@Override
        protected String doInBackground(String... strings) {
            int progress = 0;

            for (Map.Entry<String, String> entry : link.entrySet()) {
                aggiornaFile(entry.getKey(), entry.getValue());
                int percentuale = (progress++ * 100)/link.size();
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    progressBar.setProgress(percentuale, true);
                } else
                    progressBar.setProgress(percentuale);
                onProgressUpdate(percentuale);
            }

            return "";
        }

« Ultima modifica: 05 Marzo 2018, 12:07:12 CET da d4®io »