Autore Topic: Controllare se una nuova versione dell'app é disponibile su Play Store.  (Letto 363 volte)

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Salve ragazzi,
mi é stato chiesto di trovare un modo per controllare l'attuale versione dell'app installata sul dispositivo e controllare se esiste una nuove versione su play store.
Ci sono riuscito e voglio condividerlo con voi.

Codice (Java): [Seleziona]
package com.breathesport.breathesportapp.utils;

import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.util.Log;

import com.breathesport.breathesportapp.R;
import com.breathesport.breathesportapp.dialogs.UpdateVersionDialog;

import org.jsoup.Jsoup; //libreria esterna

import java.io.IOException;
import java.util.Arrays;

/**
 * Created by domenicoaumenta on 17/02/2015.
 */

public class RetrieveAppVersion extends AsyncTask<String, Void, String> {
    Context context;
    private Exception exception;

    public RetrieveAppVersion(Context context)
    {
        this.context = context;
    }

    protected String doInBackground(String... urls) {
        String newVersion = null;
        try {
            newVersion = Jsoup.connect(
                    "https://play.google.com/store/apps/details?id="
                            + context.getPackageName() + "&hl=en")
                    .timeout(30000)
                    .userAgent(
                            "Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
                    .referrer("[url=http://www.google.com]Google[/url]").get()
                    .select("div[itemprop=softwareVersion]").first()
                    .ownText();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return newVersion;
    }

    protected void onPostExecute(String market) {
        // TODO: check this.exception
        // TODO: do something with the feed
        Log.i("new Version", market);
        String current = Globals.getVersionCode(context.getApplicationContext());
        if(!current.equalsIgnoreCase(market))
        {
            String[] version = market.split("\\.");
            String[] cur_version = current.split("\\.");

            Log.i("new Version", "market : " + Arrays.toString(version));
            Log.i("new Version", "current : " + Arrays.toString(cur_version));


            for(int i = 0;i < version.length;i++)
            {
                if(version[i] == cur_version[i])
                {
                    Log.i("new Version", "same : " + version[i]);

                }else
                {
                    int m = Integer.parseInt(version[i]);
                    int c = Integer.parseInt(cur_version[i]);

                    if(m > c)
                    {
                        new UpdateVersionDialog(context,"",context.getString(R.string.update_to_new_version).concat(" ".concat(market).concat(" now.")),true)
                        {
                            @Override
                            public void onButtonPositiveClick() {
                                Uri uri = Uri.parse("market://details?id=" + context.getPackageName());
                                Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
                                try {
                                    context.startActivity(goToMarket);
                                } catch (ActivityNotFoundException e) {
                                    context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + context.getPackageName())));
                                }
                            }
                        };

                        Log.i("new Version", "you should update m "+m +" is bigger then "+c );
                        return;
                    }

                }
            }

        }else
        {
            Log.i("new Version", "version updated");
        }

    }
}

Codice (Java): [Seleziona]
public static String getVersionCode(Context context) {
        PackageManager pm = context.getPackageManager();
        try {
            PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
            Log.i("new Version", "CURRENTversion : " + pi.versionName);

            return pi.versionName;
        } catch (PackageManager.NameNotFoundException ex)
        {
            Log.i("new Version", "error : " + ex.getMessage());
        }
        return "";
    }

Codice (Java): [Seleziona]
public abstract class UpdateVersionDialog implements Runnable {
        private AlertDialog.Builder alert;

    public UpdateVersionDialog(Context c, String title, String message,boolean showImmediately) {
        alert = new AlertDialog.Builder(c);

        alert.setTitle(title);
        alert.setMessage(message);
        alert.setCancelable(false);
        alert.setPositiveButton("Update",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
//                        dialog.dismiss();
                        onButtonPositiveClick();
                    }
                });

    if(showImmediately) {
        run();
    }
    }

        public UpdateVersionDialog(Context c, int titleResId, String message, boolean showImmediately) {
                this(c, c.getString(titleResId), message, showImmediately);
        }

        public abstract void onButtonPositiveClick();

        public void run() {
                alert.show();
        }
}

in onResume basta invocare
Codice (Java): [Seleziona]
 new RetrieveAppVersion(this).execute();
Tutto funziona. Il problema é il seguente. Sullo store ho la versione 1.1.0 dell'app, da android studio ho cambiato la versione ad 1.0.2. Quando avvio l'app mi appare il popup vado su Play Store ma invece di vedere il bottone con "Update" mi appare il bottone "Open", e se apro l'app torno indietro e mi riappare il messaggio che c'é una versione nuova dell'app.

Non riesco a spiegarmi come mai.Forse lo store non mostra "update" perché l'app che ho sul telefono é installata da Android Studio?ho provato anche a creare una versione firmata dell'app 1.0.2 ed installata sul telefono,ma il risultato é sempre lo stesso.
Forse quando un apk va su Play Store qualche tipo di metadata viene aggiunto che riconosce se l'app viene installate dallo store o da altre fonti.Spero possiate aiutarmi.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 671
  • Respect: +143
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Controllare se una nuova versione dell'app é disponibile su Play Store.
« Risposta #1 il: 17 Febbraio 2015, 11:49:51 CET »
0
Tu stai controllando il nome della versione (android:versionName), non il codice (android:versionCode).

Il nome della versione è una mera stringa descrittiva. Android per verificare se la versione di un'app è più o meno recente di un'altra usa il versionCode, che è un intero.

Riferimento: &lt;manifest&gt; | Android Developers
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 dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Controllare se una nuova versione dell'app é disponibile su Play Store.
« Risposta #2 il: 17 Febbraio 2015, 12:06:09 CET »
0
Grazie per la risposta.
Mi ha aiutato a risolvere il problema.Continuo comunque a controllare VersionName,perché scaricando l'HTML da Play Store ho notato che non contiene nessun riferimento al versionCode, il problema legato al fatto che "Update" non veniva visualizzato é perché in android studio non avevo fatto il downgrade del versionCode. Quindi generando una nuova versione dell'app firmata con versionCode inferiore ha funzionato.

Grazie ancora per il suggerimento.
« Ultima modifica: 17 Febbraio 2015, 12:21:26 CET da dom4 »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Controllare se una nuova versione dell'app é disponibile su Play Store.
« Risposta #3 il: 17 Febbraio 2015, 13:02:02 CET »
0
Per curiosità. Metodo utile. Ma è necessario parsare la pagina? Non ce qualcosa di più semplice?

Offline dom4

  • Utente normale
  • ***
  • Post: 158
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Vodafone Ideos, Nexus 5
Re:Controllare se una nuova versione dell'app é disponibile su Play Store.
« Risposta #4 il: 17 Febbraio 2015, 13:08:14 CET »
0
Per curiosità. Metodo utile. Ma è necessario parsare la pagina? Non ce qualcosa di più semplice?

Sembra sia l'unico modo. Un'altro sarebbe avere un txt file da qualche parte su un server con la versione del codice, controllare quello e poi reindirizzare verso lo store.