Uygulama güncellemeleri için Play Store'u programlı olarak kontrol edin


93

Uygulamamı Google Play Store'a koydum. Şirketimin birçok müşterisi tarafından kuruldu. Uygulamanın nasıl yükseltilmesinin amaçlandığının mekanizmasını anlıyorum.

Kullanıcılar, otomatik güncellemek istedikleri her uygulama için Play Store uygulamasındaki otomatik güncelleme onay kutusunu işaretlemelidir. Ancak, bazı kullanıcılar ilk etapta işaretini kaldırmış veya kontrol etmemiştir.

Yazdığım uygulama bakım sektörü içindir ve bakıcılar tarafından evde bakım sağlamak için kullanılıyor. Müşterilerimizden bazılarının 1200 bakıcısı var. Telefonları ayrı ayrı güncellemek için tüm bakıcıları ofise çağırmaları gerekir. Bu kesinlikle kabul edilemez.

Play Store'da uygulamamın güncellenmiş bir sürümü olup olmadığını programlı olarak kontrol etmenin bir yolu var mı?

Kullanıcı Play Store'u kontrol eden uygulamayı her başlattığında çalışan bir koda sahip olabilir miyim? Güncellenmiş bir sürüm varsa, kullanıcı oyun mağazasına yönlendirilebilir. Bu, otomatik güncellemenin kontrol edilmesinin gerekli olmadığı anlamına gelir.

Şimdiden teşekkürler

Mat


Oyun mağazası, bir uygulama için mevcut bir güncelleme varsa kullanıcıya zaten bir bildirim göndermiyor mu?
Nischaal Cooray

1
Uygulamanız, yazdığınız bir API'ye uzaktan bulut / internete bağlanıyor mu - Basitçe manuel olarak güncelleyebileceğiniz bir 'sürüm' değişkenine sahip olabileceğiniz için - uygulamayı açarken, yerel sürümü bulut sürümüyle kontrol edin - eğer varsa farklı, güncelleme öner
gavlaaaaaaaa

Bunu yapmak için eskiden jsoup kullanırdım, ancak şimdi Mevcut Sürüm alanını çıkarmak için bir normal ifade kullanıyorum .
Geezer McNubbins

Yanıtlar:


42

Güncelleme 17 Ekim 2019

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

24 Nisan 2019 Güncellemesi:

Android, muhtemelen bu sorunu çözecek bir özellik duyurdu. Uygulama içi Updates API'sini kullanarak: https://android-developers.googleblog.com/2018/11/unfolding-right-now-at-androiddevsummit.html

Orijinal:

Bildiğim kadarıyla, bunu destekleyen resmi bir Google API yok.

Bir API'den bir sürüm numarası almayı düşünmelisiniz.

Harici API'lere veya web sayfalarına (Google Play Store gibi) bağlanmak yerine. API'de veya web sayfasında bir şeylerin değişme riski vardır, bu nedenle mevcut uygulamanın sürüm kodunun kendi API'nizden aldığınız sürüm numarasının altında olup olmadığını kontrol etmeyi düşünmelisiniz.

Uygulamanızı güncellerseniz, kendi API'nizdeki sürümü uygulama sürüm numarasıyla değiştirmeniz gerektiğini unutmayın.

Kendi web sitenizde veya API'nizde sürüm numarasıyla bir dosya oluşturmanızı tavsiye ederim. (Sonunda bir cronjob yapın ve sürüm güncellemesini otomatik yapın ve bir şeyler ters gittiğinde bir bildirim gönderin)

Bu değeri Google Play Store sayfanızdan almanız gerekir (bu arada değiştirilir, artık çalışmaz):

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

Uygulamanızda, mobil cihazda kullanılan sürümün kendi API'nizde gösterilen sürüm numarasının altında olup olmadığını kontrol edin.

İdeal olarak, bir bildirimle güncellemesi gerektiğine dair bir gösterge gösterin.

Yapabileceğin şeyler

Kendi API'nizi kullanarak sürüm numarası

Artıları:

  • Google Play Store'un tüm kodunu yüklemenize gerek yok (veri / bant genişliğinden tasarruf sağlar)

Eksileri:

  • Kullanıcı çevrimdışı olabilir, bu da API'ye erişilemediği için kontrolü gereksiz hale getirir

Google Play Store web sayfasındaki sürüm numarası

Artıları:

  • API'ye ihtiyacınız yok

Eksileri:

  • Kullanıcı çevrimdışı olabilir, bu da API'ye erişilemediği için kontrolü gereksiz hale getirir
    • Bu yöntemi kullanmak, kullanıcılarınıza daha fazla bant genişliği / mobil veriye mal olabilir
    • Play store web sayfası değişebilir ve bu da 'ripper' sürümünüzün artık çalışmamasına neden olabilir.

Google Play Store web sayfasındaki sürüm numarası artık bunun nasıl çözülebileceği veya başka bir alternatifin mevcut olup olmadığı konusunda herhangi bir fikir Current Versionolarak listelendi Varies with devicemi?
shadygoneinsane


Aslında. Artık bir web isteği yaparken kendi google play sayfamızın html kaynağına erişemediğimiz için bu soruya geldik. bir FileNotFoundException alıyoruz.
Grisgram

Metni içeren bir div aramak gibi bir şey deneyecektim. Geçerli sürüm / Huidige sürüm Sonraki div'lerde ilk sayıyı ve nokta basamağını bulun. <div class = "hAyfc"> <div class = "BgcNfc"> Huidige versie </div> <div> <span class = "htlgb"> 1.0 </span> </div>
Richard Lindhout

Sınıf adı muhtemelen web sitelerindeki her güncellemede değiştirilecektir.
Richard Lindhout

35

JSoup'u apps build.gradle dosyanıza ekleyin:

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

ve aşağıdaki gibi güncel sürümü alın:

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

Ve aşağıdaki iş parçacığını yürütün:

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
            }
        }
    }

Daha fazla ayrıntı için şu adresi ziyaret edin: http://revisitingandroid.blogspot.in/2016/12/programmatically-check-play-store-for.html


@Override korumalı void onPostExecute (String onlineVersion) {}, kontrol sürümü için koşul Float değerinde değilse. Çünkü böyle bir hata atabilir. Geçersiz java.lang.NumberFormatException: Geçersiz float: "1.0.6". Öyleyse bunu kullan. if (! currentVersion.equalsIgnoreCase (onlineVersion)) {....}
Dharmishtha

1
Jsoup olmadan nasıl yapılacağına dair bir fikriniz var mı?
Hitesh Sahu

Sevgili @HiteshSahu, " play.google.com/store/apps/details?id=com.whatsapp&hl=tr " Play Store URL'sine basmanız gerekecek . Bu Açık Sayfa URL'si. Sayfayı sağ tıklayın ve "Sayfa Kaynağını Görüntüle" seçeneğine tıklayın. Sayfanın html'sinde bir öznitelik görebilirsiniz: "<div class =" content "itemprop =" softwareVersion "> 1.2 </div>". Html'yi ayrıştırmalı ve bu bayrağı manuel olarak almalısınız.
Tarun

2
getPackageManager().getPackageInfo(getPackageName(), 0).versionNameSadece kullanabilirsiniz BuildConfig.VERSION_NAME:)
Enoobong

1
Açıkça, herhangi bir zamanda değiştirilebilen oluşturulmuş bir sınıf adıdır. Bunu yapmamalısın.
Richard Lindhout

24

Firebase Remote Config , şu an için olası ve güvenilir bir çözüm olabilir, çünkü google herhangi bir API'yi ifşa etmedi.

Firebase Remote Config Belgelerini Kontrol Edin

Adımlar 1. Bir firebase projesi oluşturun ve projenize google_play_service.json ekleyin

2. Firebase konsolunda "android_latest_version_code" ve "android_latest_version_name" gibi anahtarlar oluşturun-> Remote Config

3. Android Kodu

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

Mevcut sürüm adını ve kodunu alın

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. Ve firebase "android_latest_version_code" ve "android_latest_version_name" i mevcut üretim sürümü adınız ve kodunuzla güncel tutun.

Firebase uzaktan yapılandırma hem Android hem de IPhone'da çalışır.


1
Firebase'de parametre oluşturmak için firebasetutorials.com/… sayfasına bakın .
CoolMind

Ben bu çözüm derleme hatasına yol açabilir, düşünüyorum: Caused by: com.android.tools.r8.utils.AbortException: Error: null, Cannot fit requested classes in a single dex file (# methods: 68703 > 65536). Bu durumda uygulamanıza MultiDex eklemelisiniz.
CoolMind

17

Geçerli alabilirsiniz Playstore Versiyon kullanarak JSoupaşağıda gibi bazı değişikliklerle:

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

@ Tarun cevabı artık çalışmıyor.


Bu çalışan dostum ama buna sonsuza kadar güvenebilir miyim yoksa yakın gelecekte değişecek mi?
Avinash Roy

1
Resmi bir çözüm olmadığı için buna güvenmeniz tavsiye edilmez.
Nikunj

@Nikunj AsyncTask'i genişleten bir GetVersionCode sınıfı oluşturuyorum ve kodunuzu o sınıfın içine yazdığımda getPackageName () hata veriyor. Bunu denedim, GetVersionCode.this ama hiçbir şey işe yaramıyor.
Aashish

1
.Select (". HAyfc .htlgb"). Get (7) kullanmak değişikliklere karşı sağlam değildir. Bunun yerine dizin 5'i kullanan başka bir çözüm gördüm. Doğru olanı seçmek için, genişletilmiş bir sorgu kullanıyorum .select (". HAyfc .BgcNfc: containsOwn (Mevcut Sürüm) + .htlgb.htlgb"). First () .text ()
HarryS

8

@Tarun cevabı mükemmel çalışıyordu. Ancak şimdi Google'dan google play web sitesinde yapılan son değişiklikler nedeniyle değil.

Bunları @Tarun yanıtından değiştirin ..

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

    }
}

ve JSoup kitaplığı eklemeyi unutmayın

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

ve Oncreate () üzerinde

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

}

işte bu .. Bu bağlantı sayesinde


8

görüntü açıklamasını buraya girin

Google, uygulama içi güncellemeler API'sini tanıttı

API şu anda iki akışı desteklemektedir:

  • "Anında" akış, kullanıcıyı, uygulamanızı kullanmadan önce indirmeden güncellemeye yönlendiren tam ekran bir kullanıcı deneyimidir.
  • "Esnek akış", kullanıcıların uygulamanızı kullanmaya devam ederken güncellemeyi indirmelerine olanak tanır.

En iyi cevap!!! Teşekkürler
Artem Beziazychnyi

7

Orada AppUpdater kütüphanesi. Nasıl eklenir:

  1. Depoyu proje build.gradle'a ekleyin :
allprojects {
    repositories {
        jcenter()
        maven {
            url "https://jitpack.io"
        }
    }
}
  1. Kitaplığı build.gradle modülünüze ekleyin :
dependencies {
    compile 'com.github.javiersantos:AppUpdater:2.6.4'
}
  1. INTERNET ve ACCESS_NETWORK_STATE izinlerini uygulamanızın Manifestine ekleyin:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  1. Bunu aktivitenize ekleyin:
AppUpdater appUpdater = new AppUpdater(this); 
appUpdater.start();

Nasılsa çalışmıyor. Aşağıdaki kodu kullanarak, lütfen bana neyi yanlış yaptığımı söyleyin.
Anurag Srivastava

Merhaba, bir hata olduğunu düşünüyorum. Lütfen bu tartışmayı kontrol edin github.com/javiersantos/AppUpdater/issues/132
stenlytw

6

Hibrit Uygulama Bakış Açısından Geliyor. Bu bir javascript örneğidir, ana menümde Güncelleştirilebilir bir altbilgi var. Bir güncelleme mevcutsa (yani, yapılandırma dosyasındaki sürüm numaram alınan sürümden daha azsa, altbilgiyi görüntüleyin) Bu daha sonra kullanıcıyı uygulama / oyun mağazasına yönlendirecek ve burada kullanıcı daha sonra güncelleme düğmesini tıklayabilir.

Ayrıca neyin yeni verilerini (yani Sürüm Notlarını) alırım ve bu sürümde ilk defa giriş yaptığımda bunları bir modalde görüntülerim.

Cihaza Hazır, mağaza URL'nizi ayarlayın

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

Güncelleme Kullanılabilir yöntemi istediğiniz sıklıkta çalıştırılabilir. Benimki, kullanıcı ana ekrana her gittiğinde çalıştırılır.

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

iOS Geri Çağırma: Apple'ın bir API'si var, bu yüzden edinmesi çok kolay

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

Android Geri Çağırma: PlayStore'u kazımanız gerekiyor, çünkü sürümün yakalanması nispeten kolay ve yeni olanı metin yerine html'yi bu şekilde kullanabiliyorum, bu şekilde biçimlendirmelerini (yani yeni satırlar vb.)

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

Açık mağaza mantığı basittir, ancak eksiksizlik içindir

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')
}

Play Store ve App Store'un Beyaz Listeye Eklendiğinden emin olun:

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

"Ajax yanıtı ayrıştırılırken hata oluştu: SyntaxError: Beklenmeyen simge <" hatası alıyorum. ajax get çağrıldığında. Buna biraz ışık tutabilir misin, ne ters gitti?
Kapilrc

ios veya android? URL'niz doğru mu? sizi tarayıcıda doğru sayfaya götürüyor mu?
tyler_mitchell

5

Firebase Remote Config daha iyidir.

  • Uygulamaya yeni bir yapı yayınlamaya gerek kalmadan uygulamalarımızı hızlı ve kolay bir şekilde güncelleyin

Android'de Remote Config'i Uygulama

Remote Config bağımlılığını ekleme

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

İşlem tamamlandıktan sonra, gerektiğinde uygulamamız genelinde FirebaseRemoteConfig örneğine erişebiliriz:

FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();

Remote Config değerlerini alma

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

Sunucu Tarafı değerlerini getir

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

Şimdi yeni sürümü Play Store'a yükledikten sonra, firebase içindeki sürüm numarasını güncellememiz gerekiyor. Şimdi yeni sürüm ise güncelleme iletişim kutusu görüntülenecektir


5

OnCreate yönteminin içinde aşağıdaki kodu yazın ..

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

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

bu size uygulamanın mağaza sürümünü oynamanızı sağlar.

daha sonra aşağıdaki gibi uygulama sürümünü kontrol etmelisiniz

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

daha sonra bunu mağaza sürümüyle karşılaştırabilir ve kendi güncelleme ekranlarınızı kurabilirsiniz

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

    }

Ve VersionChecker.class'ı aşağıdaki gibi ekleyin

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

JSoup kullanmanın yanı sıra, uygulama sürümünü playStore'dan almak için alternatif olarak model eşleştirme yapabiliriz.

Google Play Store'daki en son kalıbı eşleştirmek için, yani <div class="BgcNfc">Current Version</div><span class="htlgb"><div><span class="htlgb">X.X.X</span></div> önce yukarıdaki düğüm dizisini eşleştirmemiz ve ardından yukarıdaki diziden sürüm değerini almamız gerekir. Aynı kod parçacığı aşağıdadır:

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

En son Google Play Store değişiklikleri için de işe yaradığından, bunu çözdüm. Umarım yardımcı olur.


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

Lütfen bu kodun nasıl ve ne çalışacağı hakkında biraz bilgi verin
DarkSuniuM


2

Jsoup kullanarak aşağıdaki kodu deneyebilirsiniz

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

2

görüntü açıklamasını buraya girinGoogle, uygulama içi güncelleme API'sini kullanıma sundu. Bunu kullanarak, kullanıcıdan uygulama içinde uygulamayı güncellemesini isteyebiliriz. Kullanıcı kabul ederse, en son uygulamayı doğrudan indirebilir ve Play Store'a yönlendirmeden yükleyebiliriz. daha fazla ayrıntı için lütfen aşağıdaki bağlantıya bakın

link1 link2


Yaptığınız GIF'i beğendim :)
Hunter

1

şu anda sadece bu yöntemin çalıştığını doğruladı

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, Uygulama içi güncelleme özelliğini ( https://developer.android.com/guide/app-bundle/in-app-updates ) kullanıma sundu , Lollipop + üzerinde çalışıyor ve kullanıcıya güzel bir güncelleme isteme olanağı veriyor. iletişim kutusu (ESNEK) veya zorunlu tam ekran mesajı (HEMEN).

Burada nasıl Esnek güncelleme gibi görünecektir: görüntü açıklamasını buraya girin

ve işte Immedtiate güncelleme akışı: görüntü açıklamasını buraya girin

Burada Cevabımı kontrol edebilirsiniz https://stackoverflow.com/a/56808529/5502121 hem uygulayıcı tam örneği kodu almak için Esnek ve Acil güncelleme akışları. Umarım yardımcı olur!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.