web-dev-qa-db-fra.com

Comment permettre aux utilisateurs de vérifier la dernière version de l'application depuis l'intérieur de l'application?

Je souhaite ajouter un bouton "Rechercher les mises à jour" dans les applications. Ainsi, lorsque quelqu'un cliquera dessus, il affichera une boîte de dialogue de message toast/progress pour vérifier la version de l'application.

Si une nouvelle version est trouvée, les applications la téléchargent automatiquement sur le téléphone et permettent à l'utilisateur d'installer manuellement les applications mises à jour.

Ou toute autre méthode fera l'affaire tant qu'elle peut vérifier la dernière version et informer l'utilisateur de la mettre à jour.

54
xDragonZ

Google a mis à jour le Play Store deux mois auparavant. C'est la solution qui fonctionne pour moi maintenant.

class GetVersionCode extends AsyncTask<Void, String, String> {

    @Override

    protected String doInBackground(Void... voids) {

        String newVersion = null;

        try {
            Document document = Jsoup.connect("https://play.google.com/store/apps/details?id=" + MainActivity.this.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("http://www.google.com")
                    .get();
            if (document != null) {
                Elements element = document.getElementsContainingOwnText("Current Version");
                for (Element ele : element) {
                    if (ele.siblingElements() != null) {
                        Elements sibElemets = ele.siblingElements();
                        for (Element sibElemet : sibElemets) {
                            newVersion = sibElemet.text();
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return newVersion;

    }


    @Override

    protected void onPostExecute(String onlineVersion) {

        super.onPostExecute(onlineVersion);

        if (onlineVersion != null && !onlineVersion.isEmpty()) {

            if (Float.valueOf(currentVersion) < Float.valueOf(onlineVersion)) {
                //show anything
            }

        }

        Log.d("update", "Current version " + currentVersion + "playstore version " + onlineVersion);

    }
}

et n'oubliez pas d'ajouter la bibliothèque JSoup

dependencies {
compile 'org.jsoup:jsoup:1.8.3'}

et sur Oncreate ()

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


    String currentVersion;
    try {
        currentVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }

    new GetVersionCode().execute();

}

c'est ça .. Merci à ce lien

11
Rajesh Naddy

Pour gagner du temps lors de la vérification de la mise à jour de la nouvelle version pour Android app, je l'ai écrite sous forme de bibliothèque et de source ouverte à l'adresse https://github.com/winsontan520/ Android-WVersionManager

44
winsontan520

Vous pouvez utiliser cette Android Library: https://github.com/danielemaddaluno/Android-Update-Checker . Elle vise à fournir un instrument réutilisable permettant de vérifier de manière asynchrone si Il existe une mise à jour plus récente de votre application sur le Store, basée sur l'utilisation de Jsoup ( http://jsoup.org/ ) pour vérifier si une nouvelle mise à jour existe réellement en analysant la page de l'application sur. le Google Play Store:

private boolean web_update(){
    try {       
        String curVersion = applicationContext.getPackageManager().getPackageInfo(package_name, 0).versionName; 
        String newVersion = curVersion;
        newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + package_name + "&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("http://www.google.com")
                .get()
                .select("div[itemprop=softwareVersion]")
                .first()
                .ownText();
        return (value(curVersion) < value(newVersion)) ? true : false;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

Et en tant que fonction "valeur" (fonctionne si les valeurs sont comprises entre 0 et 99):

private long value(String string) {
    string = string.trim();
    if( string.contains( "." )){ 
        final int index = string.lastIndexOf( "." );
        return value( string.substring( 0, index ))* 100 + value( string.substring( index + 1 )); 
    }
    else {
        return Long.valueOf( string ); 
    }
}

Si vous souhaitez uniquement vérifier une incompatibilité entre les versions, vous pouvez modifier:

value(curVersion) < value(newVersion) avec value(curVersion) != value(newVersion)

38
madx

S'il s'agit d'une application sur le marché, puis, au démarrage de l'application, déclenchez une intention d'ouvrir éventuellement l'application Market, ce qui lui permettra de rechercher des mises à jour.

Sinon, la mise en œuvre et la mise à jour du vérificateur sont assez faciles. Voici mon code (approximativement) pour cela:

String response = SendNetworkUpdateAppRequest(); // Your code to do the network request
                                                 // should send the current version
                                                 // to server
if(response.equals("YES")) // Start Intent to download the app user has to manually install it by clicking on the notification
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("URL TO LATEST APK")));

Bien sûr, vous devriez réécrire ceci pour faire la demande sur un fil d’arrière-plan, mais vous avez l’idée.

Si vous aimez quelque chose d'un peu plus complexe mais qui permet à votre application d'appliquer automatiquement la mise à jour, voir ici .

26
Jasoneer

Accédez à votre page de lecture:

https://play.google.com/store/apps/details?id=com.yourpackage

Utiliser un HTTP GET standard. Maintenant, le jQuery suivant trouve des informations importantes pour vous:

Version actuelle

$("[itemprop='softwareVersion']").text()

Quoi de neuf

$(".recent-change").each(function() { all += $(this).text() + "\n"; })

Maintenant que vous pouvez extraire ces informations manuellement, créez simplement une méthode dans votre application qui l'exécute pour vous.

public static String[] getAppVersionInfo(String playUrl) {
    HtmlCleaner cleaner = new HtmlCleaner();
    CleanerProperties props = cleaner.getProperties();
    props.setAllowHtmlInsideAttributes(true);
    props.setAllowMultiWordAttributes(true);
    props.setRecognizeUnicodeChars(true);
    props.setOmitComments(true);
    try {
        URL url = new URL(playUrl);
        URLConnection conn = url.openConnection();
        TagNode node = cleaner.clean(new InputStreamReader(conn.getInputStream()));
        Object[] new_nodes = node.evaluateXPath("//*[@class='recent-change']");
        Object[] version_nodes = node.evaluateXPath("//*[@itemprop='softwareVersion']");

        String version = "", whatsNew = "";
        for (Object new_node : new_nodes) {
            TagNode info_node = (TagNode) new_node;
            whatsNew += info_node.getAllChildren().get(0).toString().trim()
                    + "\n";
        }
        if (version_nodes.length > 0) {
            TagNode ver = (TagNode) version_nodes[0];
            version = ver.getAllChildren().get(0).toString().trim();
        }
        return new String[]{version, whatsNew};
    } catch (IOException | XPatherException e) {
        e.printStackTrace();
        return null;
    }
}

Utilisations HtmlCleaner

5
user586399

ajouter compile 'org.jsoup:jsoup:1.10.2' aux dépendances dans APP LEVEL build.gradle

Et

Ajoutez simplement le code ci-dessous et vous êtes prêt à partir.

private class GetVersionCode extends AsyncTask<Void, String, String> {
    @Override
    protected String doInBackground(Void... voids) {

        try {
            newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + SplashActivity.this.getPackageName() + "&hl=it")
                    .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("http://www.google.com")
                    .get()
                    .select("div[itemprop=softwareVersion]")
                    .first()
                    .ownText();
            return newVersion;
        } catch (Exception e) {
            return newVersion;
        }
    }

    @Override
    protected void onPostExecute(String onlineVersion) {
        super.onPostExecute(onlineVersion);

        if (!currentVersion.equalsIgnoreCase(onlineVersion)) {
            //show dialog
            new AlertDialog.Builder(context)
                    .setTitle("Updated app available!")
                    .setMessage("Want to update app?")
                    .setPositiveButton("Update", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            // continue with delete
                            final String appPackageName = getPackageName(); // getPackageName() from Context or Activity object
                            try {
                                Toast.makeText(getApplicationContext(), "App is in BETA version cannot update", Toast.LENGTH_SHORT).show();
                                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
                            } catch (ActivityNotFoundException anfe) {
                                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
                            }
                        }
                    })
                    .setNegativeButton("Later", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            // do nothing
                            dialog.dismiss();
                            new MyAsyncTask().execute();
                        }
                    })
                    .setIcon(Android.R.drawable.ic_dialog_alert)
                    .show();

        }
    }
}
4
Andi

Il n'y a pas d'API pour cela, vous ne pouvez pas l'installer automatiquement, vous pouvez simplement les rediriger vers sa page Market afin qu'ils puissent se mettre à niveau. Vous pouvez avoir votre dernière version dans un fichier sur un serveur Web et demander à l'application de la vérifier. Voici une implémentation de ceci:

http://code.google.com/p/openintents/source/browse/#svn%2Ftrunk%2FUpdateCheckerApp

2
Nikolay Elenkov

Vous devez d'abord vérifier la version de l'application sur le marché et la comparer à la version de l'application sur l'appareil. S'ils sont différents, il peut s'agir d'une mise à jour disponible. Dans cet article, j’ai écrit le code permettant d’obtenir la version actuelle du marché et la version actuelle sur l’appareil et de les comparer. J'ai également montré comment afficher la boîte de dialogue de mise à jour et rediriger l'utilisateur vers la page de mise à jour. Veuillez visiter ce lien: https://stackoverflow.com/a/33925032/5475941

0
Vahid