Controlla a livello di programmazione il Play Store per gli aggiornamenti delle app


92

Ho messo la mia app su Google Play Store. È stato installato da molti clienti della mia azienda. Comprendo il meccanismo di come l'app deve essere aggiornata.

Gli utenti devono selezionare la casella di controllo dell'aggiornamento automatico nell'app Playstore per ogni app che desiderano aggiornare automaticamente. Tuttavia alcuni utenti lo hanno deselezionato o non lo hanno verificato in primo luogo.

L'app che ho scritto è per il settore dell'assistenza ed è utilizzata dagli assistenti per fornire assistenza domiciliare. Alcuni dei nostri clienti hanno 1200 badanti. Dovrebbero chiamare tutti gli assistenti in ufficio per aggiornare i telefoni individualmente. Questo è ovviamente inaccettabile.

C'è un modo per verificare a livello di programmazione se è disponibile una versione aggiornata della mia app nel Play Store?

Posso avere un codice che viene eseguito ogni volta che l'utente avvia l'app che controlla il Play Store? Se è disponibile una versione aggiornata, l'utente potrebbe essere indirizzato al Playstore. Ciò significa che non è essenziale controllare l'aggiornamento automatico.

Grazie in anticipo

opaco


Il Play Store non invia già una notifica all'utente se è disponibile un aggiornamento per un'app?
Nischaal Cooray

1
La tua applicazione si connette al cloud / Internet tramite un'API che hai scritto - Poiché potresti semplicemente avere una variabile di 'versione' che potresti aggiornare manualmente - all'apertura dell'applicazione, controlla la versione locale con la versione cloud - se differire, suggerire un aggiornamento
gavlaaaaaaaa

Usavo jsoup per farlo, ma ora uso un'espressione regolare per estrarre il campo Versione corrente .
Geezer McNubbins

Risposte:


42

Aggiornamento 17 ottobre 2019

https://developer.android.com/guide/app-bundle/in-app-updates

Aggiornamento 24 aprile 2019:

Android ha annunciato una funzionalità che probabilmente risolverà questo problema. Utilizzo dell'API Aggiornamenti in-app: https://android-developers.googleblog.com/2018/11/unfolding-right-now-at-androiddevsummit.html

Originale:

Per quanto ne so, non esiste un'API Google ufficiale che lo supporti.

Dovresti considerare di ottenere un numero di versione da un'API.

Invece di connettersi ad API o pagine web esterne (come Google Play Store). Esiste il rischio che qualcosa possa cambiare nell'API o nella pagina web, quindi dovresti considerare di controllare se il codice della versione dell'app corrente è inferiore al numero di versione che ottieni dalla tua API.

Ricorda solo che se aggiorni la tua app, devi cambiare la versione nella tua API con il numero di versione dell'app.

Ti consiglio di creare un file nel tuo sito web o API, con il numero di versione. (Alla fine, fai un cronjob e rendi automatico l'aggiornamento della versione e invia una notifica quando qualcosa va storto)

Devi ottenere questo valore dalla tua pagina Google Play Store (è cambiato nel frattempo, non funziona più):

<div class="content" itemprop="softwareVersion"> x.x.x  </div>

Controlla nella tua app se la versione utilizzata sul cellulare è inferiore al numero di versione mostrato sulla tua API.

Mostra l'indicazione che deve aggiornare con una notifica, idealmente.

Cose che puoi fare

Numero di versione utilizzando la tua API

Professionisti:

  • Non è necessario caricare l'intero codice del Google Play Store (salva su dati / larghezza di banda)

Contro:

  • L'utente può essere offline, il che rende inutile il controllo poiché non è possibile accedere all'API

Numero di versione sulla pagina web Google Play Store

Professionisti:

  • Non hai bisogno di un'API

Contro:

  • L'utente può essere offline, il che rende inutile il controllo poiché non è possibile accedere all'API
    • L'utilizzo di questo metodo potrebbe costare agli utenti una maggiore larghezza di banda / dati mobili
    • La pagina web del Play Store potrebbe cambiare, il che rende la tua versione "ripper" non più funzionante.

Il numero di versione sulla pagina web di Google Play Store ora ha Current Versionelencato Varies with deviceun'idea di come questo può essere risolto o se è disponibile un'altra alternativa ??
shadygoneinsane


Infatti. È venuto a questa domanda poiché non possiamo più accedere alla fonte html della nostra pagina di Google Play durante una richiesta web. riceviamo un'eccezione FileNotFoundException.
Grisgram

Proverei qualcosa come cercare un div che contiene il testo. Versione corrente / versie Huidige Trova il primo numero e la prima cifra dei punti nei div successivi. <div class = "hAyfc"> <div class = "BgcNfc"> Huidige versie </div> <div> <span class = "htlgb"> 1.0 </span> </div>
Richard Lindhout

Il nome della classe sarà probabilmente cambiato in ogni aggiornamento sul loro sito web.
Richard Lindhout

35

Includi JSoup nel file build.gradle delle tue app:

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

e ottieni la versione corrente come:

currentVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;

Ed esegui il seguente thread:

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

    String newVersion = null;
    try {
        newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + MainActivity.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(".hAyfc .htlgb")
                .get(7)
                .ownText();
        return newVersion;
    } catch (Exception e) {
        return newVersion;
    }
    }

    @Override
    protected void onPostExecute(String onlineVersion) {
        super.onPostExecute(onlineVersion);
        Log.d("update", "Current version " + currentVersion + "playstore version " + onlineVersion);
        if (onlineVersion != null && !onlineVersion.isEmpty()) {
            if (Float.valueOf(currentVersion) < Float.valueOf(onlineVersion)) {
                //show dialog
            }
        }
    }

Per maggiori dettagli visita: http://revisitingandroid.blogspot.in/2016/12/programmatically-check-play-store-for.html


in @Override protected void onPostExecute (String onlineVersion) {} se la condizione per la verifica della versione non deve essere nel valore Float. Perché può generare un errore come questo. Java.lang.NumberFormatException non valido: float non valido: "1.0.6". Quindi usa questo. if (! currentVersion.equalsIgnoreCase (onlineVersion)) {....}
Dharmishtha

1
Qualche idea su come farlo senza Jsoup?
Hitesh Sahu

Gentile @HiteshSahu, dovrai premere l'URL del playstore " play.google.com/store/apps/details?id=com.whatsapp&hl=en ". Questo URL della pagina aperta. Fare clic con il tasto destro sulla pagina e fare clic sull'opzione "Visualizza sorgente pagina". Nell'html della pagina puoi vedere un attributo: "<div class =" content "itemprop =" softwareVersion "> 1.2 </div>". Devi analizzare l'html e ottenere questo flag manualmente.
Tarun

2
getPackageManager().getPackageInfo(getPackageName(), 0).versionNamePotresti semplicemente usare BuildConfig.VERSION_NAME:)
Enoobong

1
È chiaramente un nome di classe generato che potrebbe essere modificato in qualsiasi momento. Non dovresti farlo.
Richard Lindhout,

24

Firebase Remote Config potrebbe essere una soluzione possibile e affidabile per ora, poiché Google non ha esposto alcuna API ad esso.

Controlla i documenti di Firebase Remote Config

Passaggi 1.Crea un progetto Firebase e aggiungi google_play_service.json al tuo progetto

2.Crea chiavi come "android_latest_version_code" e "android_latest_version_name" nella console Firebase-> Remote Config

3. Codice Android

    public void initializeFirebase() {
        if (FirebaseApp.getApps(mContext).isEmpty()) {
            FirebaseApp.initializeApp(mContext, FirebaseOptions.fromResource(mContext));
        }
        final FirebaseRemoteConfig config = FirebaseRemoteConfig.getInstance();
        FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
                                                              .setDeveloperModeEnabled(BuildConfig.DEBUG)
                                                              .build();
        config.setConfigSettings(configSettings);
}

Ottieni il nome e il codice della versione corrente

int playStoreVersionCode = FirebaseRemoteConfig.getInstance().getString(
                "android_latest_version_code");
PackageInfo pInfo = this.getPackageManager().getPackageInfo(getPackageName(), 0);
int currentAppVersionCode = pInfo.versionCode; 
if(playStoreVersionCode>currentAppVersionCode){
//Show update popup or whatever best for you
}

4. E mantieni Firebase "android_latest_version_code" e "android_latest_version_name" aggiornati con il nome e il codice della versione di produzione corrente.

La configurazione remota di Firebase funziona sia su Android che su iPhone.


1
Vedi firebasetutorials.com/… per la creazione di parametri in Firebase.
CoolMind

Credo che, questa soluzione può portare a errore di compilazione: Caused by: com.android.tools.r8.utils.AbortException: Error: null, Cannot fit requested classes in a single dex file (# methods: 68703 > 65536). In questo caso dovresti aggiungere MultiDex alla tua applicazione.
CoolMind

17

Puoi ottenere la versione corrente del Playstore usando JSoupalcune modifiche come di seguito:

@Override
protected String doInBackground(Void... voids) {

    String newVersion = null;
    try {
        newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + MainActivity.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(".hAyfc .htlgb")
                .get(7)
                .ownText();
        return newVersion;
    } catch (Exception e) {
        return newVersion;
    }
}

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

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

la risposta di @Tarun non funziona più.


Questo è un amico di lavoro, ma posso fare affidamento su questo per sempre o cambierà nel prossimo futuro ??
Avinash Roy

1
Non è consigliabile fare affidamento su questo perché non è una soluzione ufficiale.
Nikunj

@Nikunj creo una classe GetVersionCode che estende AsyncTask e quando scrivo il tuo codice all'interno di quella classe getPackageName () mostra un errore. Ho provato questo, GetVersionCode.this ma non funziona niente.
Aashish

1
L'uso di .select (". HAyfc .htlgb"). Get (7) non è affidabile contro i cambiamenti. Ho visto un'altra soluzione utilizzando invece l'indice 5. Per selezionare quello giusto, utilizzo una query estesa .select (". HAyfc .BgcNfc: containsOwn (Current Version) + .htlgb.htlgb"). First () .text ()
HarryS

8

La risposta di @Tarun funzionava perfettamente, ma ora non lo è, a causa delle recenti modifiche di Google sul sito web di Google Play.

Basta cambiarli dalla risposta di @Tarun ..

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);

    }
}

e non dimenticare di aggiungere la libreria JSoup

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

e su 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();

}

questo è tutto .. Grazie a questo link


8

inserisci qui la descrizione dell'immagine

Google ha introdotto l' API degli aggiornamenti in-app

L'API attualmente supporta due flussi:

  • Il flusso "immediato" è un'esperienza utente a schermo intero che guida l'utente dal download all'aggiornamento prima che possa utilizzare la tua app.
  • Il "flusso flessibile" consente agli utenti di scaricare l'aggiornamento continuando a utilizzare la tua app.

Migliore risposta!!! Grazie
Artem Beziazychnyi

7

C'è la libreria AppUpdater . Come includere:

  1. Aggiungi il repository al tuo progetto build.gradle :
allprojects {
    repositories {
        jcenter()
        maven {
            url "https://jitpack.io"
        }
    }
}
  1. Aggiungi la libreria al tuo modulo build.gradle :
dependencies {
    compile 'com.github.javiersantos:AppUpdater:2.6.4'
}
  1. Aggiungi le autorizzazioni INTERNET e ACCESS_NETWORK_STATE al manifest della tua app:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  1. Aggiungi questo alla tua attività:
AppUpdater appUpdater = new AppUpdater(this); 
appUpdater.start();

Non funziona comunque. Utilizzando il seguente codice, dimmi cosa sto facendo di sbagliato.
Anurag Srivastava

Ciao, penso che ci sia un bug. Si prega di controllare questa discussione github.com/javiersantos/AppUpdater/issues/132
stenlytw

6

Proveniente da un'applicazione ibrida POV. Questo è un esempio javascript, ho un piè di pagina Aggiornamento disponibile nel menu principale. Se è disponibile un aggiornamento (ad es. Il mio numero di versione all'interno del file di configurazione è inferiore alla versione recuperata, visualizza il piè di pagina) Questo indirizzerà l'utente all'app / Play Store, dove l'utente può quindi fare clic sul pulsante di aggiornamento.

Ricevo anche i nuovi dati (cioè le note di rilascio) e li visualizzo in modalità modale all'accesso se è la prima volta su questa versione.

Sul dispositivo Pronto, imposta l'URL del tuo negozio

        if (device.platform == 'iOS')
           storeURL = 'https://itunes.apple.com/lookup?bundleId=BUNDLEID';
        else
           storeURL = 'https://play.google.com/store/apps/details?id=BUNDLEID';

Il metodo Aggiorna disponibile può essere eseguito tutte le volte che vuoi. Il mio viene eseguito ogni volta che l'utente accede alla schermata principale.

function isUpdateAvailable() {
    if (device.platform == 'iOS') {
        $.ajax(storeURL, {
            type: "GET",
            cache: false,
            dataType: 'json'
        }).done(function (data) {
            isUpdateAvailable_iOS(data.results[0]);
        }).fail(function (jqXHR, textStatus, errorThrown) {
            commsErrorHandler(jqXHR, textStatus, false);
        });
    } else {
        $.ajax(storeURL, {
            type: "GET",
            cache: false
        }).done(function (data) {
            isUpdateAvailable_Android(data);
        }).fail(function (jqXHR, textStatus, errorThrown) {
            commsErrorHandler(jqXHR, textStatus, false);
        });
    }
}

Richiamata iOS: Apple ha un'API, quindi molto facile da ottenere

function isUpdateAvailable_iOS (data) {
    var storeVersion = data.version;
    var releaseNotes = data.releaseNotes;
    // Check store Version Against My App Version ('1.14.3' -> 1143)
    var _storeV = parseInt(storeVersion.replace(/\./g, ''));
    var _appV = parseInt(appVersion.substring(1).replace(/\./g, ''));
    $('#ft-main-menu-btn').off();
    if (_storeV > _appV) {
        // Update Available
        $('#ft-main-menu-btn').text('Update Available');
        $('#ft-main-menu-btn').click(function () {
            openStore();
        });

    } else {
        $('#ft-main-menu-btn').html('&nbsp;');
        // Release Notes
        settings.updateReleaseNotes('v' + storeVersion, releaseNotes);
    }
}

Richiamata Android: PlayStore devi raschiare, come puoi vedere la versione è relativamente facile da afferrare e le novità prendo l'html invece del testo in quanto in questo modo posso usare la loro formattazione (cioè nuove righe ecc.)

function isUpdateAvailable_Android(data) {
    var html = $(data);
    var storeVersion = html.find('div[itemprop=softwareVersion]').text().trim();
    var releaseNotes = html.find('.whatsnew')[0].innerHTML;
    // Check store Version Against My App Version ('1.14.3' -> 1143)
    var _storeV = parseInt(storeVersion.replace(/\./g, ''));
    var _appV = parseInt(appVersion.substring(1).replace(/\./g, ''));
    $('#ft-main-menu-btn').off();
    if (_storeV > _appV) {
        // Update Available
        $('#ft-main-menu-btn').text('Update Available');
        $('#ft-main-menu-btn').click(function () {
            openStore();
        });

    } else {
        $('#ft-main-menu-btn').html('&nbsp;');
        // Release Notes
        settings.updateReleaseNotes('v' + storeVersion, releaseNotes);
    }
}

La logica del negozio aperto è semplice, ma per completezza

function openStore() {
    var url = 'https://itunes.apple.com/us/app/appname/idUniqueID';
    if (device.platform != 'iOS')
       url = 'https://play.google.com/store/apps/details?id=appid'
   window.open(url, '_system')
}

Assicurati che Play Store e App Store siano stati inseriti nella whitelist:

  <access origin="https://itunes.apple.com"/>
  <access origin="https://play.google.com"/>

Ricevo l'errore "Errore nell'analisi della risposta ajax: SyntaxError: Unexpected token <". quando viene chiamato ajax get. Puoi far luce su questo, cosa è andato storto?
Kapilrc

iOS o Android? il tuo URL è corretto? ti porta alla pagina corretta sul browser?
tyler_mitchell

5

Firebase Remote Config è migliore.

  • Aggiorna rapidamente e facilmente le nostre applicazioni senza la necessità di pubblicare una nuova build nell'app

Implementazione di Remote Config su Android

Aggiunta della dipendenza Remote Config

compile 'com.google.firebase:firebase-config:9.6.0'

Una volta terminato, possiamo quindi accedere all'istanza FirebaseRemoteConfig attraverso la nostra applicazione dove richiesto:

FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();

Recupero dei valori di Remote Config

boolean someBoolean = firebaseRemoteConfig.getBoolean("some_boolean");
byte[] someArray = firebaseRemoteConfig.getByteArray("some_array");
double someDouble = firebaseRemoteConfig.getDouble("some_double");
long someLong = firebaseRemoteConfig.getLong("some_long");
String appVersion = firebaseRemoteConfig.getString("appVersion");

Recupera i valori lato server

firebaseRemoteConfig.fetch(cacheExpiration)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        mFirebaseRemoteConfig.activateFetched();
                        // We got our config, let's do something with it!
                        if(appVersion < CurrentVersion){
                           //show update dialog
                        }
                    } else {
                        // Looks like there was a problem getting the config...
                    }
                }
            });

Ora, una volta caricata la nuova versione su Playstore, dobbiamo aggiornare il numero di versione all'interno di Firebase. Ora, se è una nuova versione, verrà visualizzata la finestra di dialogo di aggiornamento


5

All'interno del metodo OnCreate scrivi sotto il codice ..

VersionChecker versionChecker = new VersionChecker();
    try {
        latestVersion = versionChecker.execute().get();
        Toast.makeText(getBaseContext(), latestVersion , Toast.LENGTH_SHORT).show();

    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }

questo ti dà la versione dell'app Play Store ..

quindi devi controllare la versione dell'app come di seguito

PackageManager manager = getPackageManager();
    PackageInfo info = null;
    try {
        info = manager.getPackageInfo(getPackageName(), 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    assert info != null;
    version = info.versionName;

dopodiché puoi confrontarlo con la versione del negozio e configurare le tue schermate di aggiornamento

if(version.equals(latestVersion)){
        Toast.makeText(getBaseContext(), "No Update" , Toast.LENGTH_SHORT).show();
    }else {
        Toast.makeText(getBaseContext(), "Update" , Toast.LENGTH_SHORT).show();

    }

E aggiungi VersionChecker.class come sotto

public class VersionChecker extends AsyncTask<String, String, String> {

    private String newVersion;

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

        try {
            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(".hAyfc .htlgb")
                    .get(7)
                    .ownText();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return newVersion;
    }
}


3

Oltre a utilizzare JSoup, possiamo in alternativa eseguire la corrispondenza dei modelli per ottenere la versione dell'app da PlayStore.

Per abbinare l'ultimo modello da Google Playstore, cioè <div class="BgcNfc">Current Version</div><span class="htlgb"><div><span class="htlgb">X.X.X</span></div> dobbiamo prima abbinare la sequenza di nodi sopra e poi dalla sequenza sopra ottenere il valore della versione. Di seguito è riportato lo snippet di codice per lo stesso:

    private String getAppVersion(String patternString, String inputString) {
        try{
            //Create a pattern
            Pattern pattern = Pattern.compile(patternString);
            if (null == pattern) {
                return null;
            }

            //Match the pattern string in provided string
            Matcher matcher = pattern.matcher(inputString);
            if (null != matcher && matcher.find()) {
                return matcher.group(1);
            }

        }catch (PatternSyntaxException ex) {

            ex.printStackTrace();
        }

        return null;
    }


    private String getPlayStoreAppVersion(String appUrlString) {
        final String currentVersion_PatternSeq = "<div[^>]*?>Current\\sVersion</div><span[^>]*?>(.*?)><div[^>]*?>(.*?)><span[^>]*?>(.*?)</span>";
        final String appVersion_PatternSeq = "htlgb\">([^<]*)</s";
        String playStoreAppVersion = null;

        BufferedReader inReader = null;
        URLConnection uc = null;
        StringBuilder urlData = new StringBuilder();

        final URL url = new URL(appUrlString);
        uc = url.openConnection();
        if(uc == null) {
           return null;
        }
        uc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
        inReader = new BufferedReader(new InputStreamReader(uc.getInputStream()));
        if (null != inReader) {
            String str = "";
            while ((str = inReader.readLine()) != null) {
                           urlData.append(str);
            }
        }

        // Get the current version pattern sequence 
        String versionString = getAppVersion (currentVersion_PatternSeq, urlData.toString());
        if(null == versionString){ 
            return null;
        }else{
            // get version from "htlgb">X.X.X</span>
            playStoreAppVersion = getAppVersion (appVersion_PatternSeq, versionString);
        }

        return playStoreAppVersion;
    }

L'ho risolto attraverso questo, poiché funziona anche con le ultime modifiche del Playstore di Google. Spero che aiuti.


3
private void CheckUPdate() {
    VersionChecker versionChecker = new VersionChecker();
    try
    {   String appVersionName = BuildConfig.VERSION_NAME;
        String mLatestVersionName = versionChecker.execute().get();
        if(!appVersionName.equals(mLatestVersionName)){
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(Activity.this);
            alertDialog.setTitle("Please update your app");
            alertDialog.setMessage("This app version is no longer supported. Please update your app from the Play Store.");
            alertDialog.setPositiveButton("UPDATE NOW", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    final String appPackageName = getPackageName();
                    try {
                        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
                    } catch (android.content.ActivityNotFoundException anfe) {
                        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
                    }
                }
            });
            alertDialog.show();
        }

    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
}

@SuppressLint("StaticFieldLeak")
public class VersionChecker extends AsyncTask<String, String, String> {
    private String newVersion;
    @Override
    protected String doInBackground(String... params) {

        try {
            newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id="+getPackageName())
                    .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(".hAyfc .htlgb")
                    .get(7)
                    .ownText();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return newVersion;
    }
}

Fornisci alcune informazioni su come e cosa funzionerà questo codice
DarkSuniuM


2

Puoi provare a seguire il codice usando Jsoup

String latestVersion = doc.getElementsContainingOwnText("Current Version").parents().first().getAllElements().last().text();

2

inserisci qui la descrizione dell'immagineGoogle ha introdotto l'aggiornamento in-app api. In questo modo possiamo chiedere all'utente di aggiornare l'app all'interno dell'applicazione. se l'utente accetta, possiamo scaricare direttamente l'ultima app e installarla senza reindirizzarla al playstore. per maggiori dettagli fare riferimento al collegamento sottostante

link1 link2


Mi piace la GIF che hai fatto :)
Hunter

1

confermato solo che il metodo funziona ora:

newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + AcMainPage.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(".hAyfc .htlgb")
                        .get(5)
                        .ownText();

1

Google ha introdotto la funzionalità degli aggiornamenti in-app , ( https://developer.android.com/guide/app-bundle/in-app-updates ) funziona su Lollipop + e ti dà la possibilità di chiedere all'utente un aggiornamento con un simpatico dialogo (FLESSIBILE) o con messaggio a schermo intero obbligatorio (IMMEDIATO).

Ecco come apparirà l'aggiornamento flessibile : inserisci qui la descrizione dell'immagine

ed ecco il flusso di aggiornamento immediato : inserisci qui la descrizione dell'immagine

Puoi controllare la mia risposta qui https://stackoverflow.com/a/56808529/5502121 per ottenere il codice di esempio completo per l'implementazione dei flussi di aggiornamento sia flessibile che immediato . Spero che sia d'aiuto!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.