Программно проверять наличие обновлений приложений в Play Store

93

Я разместил свое приложение в магазине Google Play. Его установили многие клиенты моей компании. Я понимаю, как должно обновляться приложение.

Пользователи должны установить флажок автоматического обновления в приложении playstore для каждого приложения, которое они хотят обновлять автоматически. Однако некоторые пользователи не отметили его или не отметили в первую очередь.

Приложение, которое я написал, предназначено для индустрии ухода и используется лицами, осуществляющими уход, для оказания помощи на дому. У некоторых наших клиентов 1200 опекунов. Им придется вызывать в офис всех лиц, осуществляющих уход, для индивидуального обновления телефонов. Это явно недопустимо.

Есть ли способ программно проверить, есть ли обновленная версия моего приложения в Play Store?

Могу ли я иметь код, который запускается каждый раз, когда пользователь запускает приложение, которое проверяет Play Store? Если есть обновленная версия, пользователь может быть направлен в игровой магазин. Это будет означать, что автоматическое обновление не обязательно проверять.

заранее спасибо

Мэтт

черепаха
источник
Разве магазин воспроизведения уже не отправляет уведомление пользователю, если для приложения доступно обновление?
Nischaal Cooray 08
1
Подключается ли ваше приложение к облаку / Интернету через API, который вы написали - Так как у вас может быть просто переменная версии, которую вы можете обновить вручную - при открытии приложения проверьте локальную версию с облачной версией - если они отличаются, предложите обновление
gavlaaaaaaaa 08
Раньше для этого я использовал jsoup, но теперь использую регулярное выражение для извлечения поля Current Version .
Geezer McNubbins

Ответы:

42

Обновление 17 октября 2019 г.

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

Обновление 24 апреля 2019 г .:

Android анонсировал функцию, которая, вероятно, решит эту проблему. Использование API обновлений в приложении: https://android-developers.googleblog.com/2018/11/unfolding-right-now-at-androiddevsummit.html

Оригинал:

Насколько мне известно, официального Google API, поддерживающего это, не существует.

Вам следует подумать о том, чтобы получить номер версии из API.

Вместо подключения к внешним API или веб-страницам (например, Google Play Store). Существует риск того, что что-то может измениться в API или на веб-странице, поэтому вам следует подумать о том, чтобы проверить, не соответствует ли код версии текущего приложения номеру версии, который вы получаете из собственного API.

Просто помните, что если вы обновляете свое приложение, вам нужно изменить версию в собственном API с номером версии приложения.

Я бы порекомендовал вам создать файл на вашем собственном веб-сайте или в API с номером версии. (В конце концов, сделайте cronjob и сделайте автоматическое обновление версии и отправьте уведомление, когда что-то пойдет не так)

Вы должны получить это значение со своей страницы в Google Play Store (тем временем изменено, больше не работает):

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

Проверьте в своем приложении, что версия, используемая на мобильном телефоне, не ниже номера версии, указанного в вашем собственном API.

В идеале, показать указание на необходимость обновления с уведомлением.

Что ты можешь сделать

Номер версии с использованием собственного API

Плюсы:

  • Нет необходимости загружать весь код Google Play Store (экономия данных / пропускной способности)

Минусы:

  • Пользователь может быть в автономном режиме, что делает проверку бесполезной, так как API недоступен.

Номер версии на веб-странице Google Play Store

Плюсы:

  • Вам не нужен API

Минусы:

  • Пользователь может быть в автономном режиме, что делает проверку бесполезной, так как API недоступен.
    • Использование этого метода может стоить вашим пользователям больше полосы пропускания / мобильных данных.
    • Веб-страница магазина Play может измениться, из-за чего ваша версия «риппер» больше не будет работать.
Ричард Линдхаут
источник
Номер версии на веб-странице Google Play Store теперь Current Versionуказан как Varies with deviceлюбая идея, как это можно решить, или доступна ли какая-либо другая альтернатива ??
shadygoneinsane 05
используйте stackoverflow.com/questions/19244305/…
AshuKingSharma
На самом деле. Пришел к этому вопросу, поскольку мы больше не можем получить доступ к источнику html нашей собственной страницы воспроизведения Google при выполнении веб-запроса. мы получаем FileNotFoundException.
Grisgram
Попробовал бы что-то вроде поиска div, содержащего текст. Текущая версия / Huidige Versie Найдите первое число и цифру с точками в следующих div. <div class = "hAyfc"> <div class = "BgcNfc"> Huidige Versie </div> <div> <span class = "htlgb"> 1.0 </span> </div>
Ричард Линдхаут,
Имя класса, вероятно, будет изменяться при каждом обновлении на их веб-сайте.
Ричард Линдхаут,
35

Включите JSoup в файл build.gradle ваших приложений:

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

и получите текущую версию, например:

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

И выполните следующий поток:

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

Для получения дополнительной информации посетите: http://revisitingandroid.blogspot.in/2016/12/programmatically-check-play-store-for.html.

Тарун
источник
в @Override protected void onPostExecute (String onlineVersion) {}, если условие для версии проверки не должно быть в значении Float. Потому что это может вызвать ошибку типа Invalid java.lang.NumberFormatException: Invalid float: "1.0.6". Так что используйте это. if (! currentVersion.equalsIgnoreCase (onlineVersion)) {....}
Дхармиштха
1
Есть идеи, как это сделать без Jsoup?
Hitesh Sahu
Уважаемый @HiteshSahu, вам нужно будет перейти по URL-адресу игрового магазина play.google.com/store/apps/details?id=com.whatsapp&hl=en . URL этой открытой страницы. Щелкните страницу правой кнопкой мыши и выберите параметр «Просмотреть исходный код страницы». В HTML-коде страницы вы можете увидеть атрибут: "<div class =" content "itemprop =" softwareVersion "> 1.2 </div>". Вам нужно разобрать html и получить этот флаг вручную.
Тарун
2
getPackageManager().getPackageInfo(getPackageName(), 0).versionNameВы могли бы просто использовать BuildConfig.VERSION_NAME:)
Enoobong
1
Это явно сгенерированное имя класса, которое можно изменить в любое время. Вы не должны этого делать.
Ричард Линдхаут,
24

Firebase Remote Config на данный момент может быть возможным и надежным решением, поскольку Google не предоставил ему API.

Проверьте документы Firebase Remote Config

Шаги 1. Создайте проект firebase и добавьте в свой проект google_play_service.json

2. Создайте такие ключи, как «android_latest_version_code» и «android_latest_version_name» в консоли firebase-> Remote Config

3. Код 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);
}

Получить название и код текущей версии

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. И постоянно обновляйте firebase "android_latest_version_code" и "android_latest_version_name", используя имя и код текущей производственной версии.

Удаленная конфигурация Firebase работает как на Android, так и на IPhone.

Сридху Мадху
источник
1
См firebasetutorials.com/... для создания параметров в Firebase.
CoolMind
Я думаю, что это решение может привести к ошибке компиляции: Caused by: com.android.tools.r8.utils.AbortException: Error: null, Cannot fit requested classes in a single dex file (# methods: 68703 > 65536). В этом случае вам следует добавить MultiDex в ваше приложение.
CoolMind 01
17

Вы можете получить текущую версию Playstore, используя JSoupнекоторые модификации, как показано ниже:

@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 больше не работает.

Никундж
источник
Это рабочий приятель, но могу ли я полагаться на него вечно или он изменится в ближайшем будущем ??
Авинаш Рой
1
На это не рекомендуется полагаться, потому что это не официальное решение.
Nikunj 05
@Nikunj Я создаю класс GetVersionCode, который расширяет AsyncTask, и когда я пишу ваш код внутри этого класса, getPackageName () показывает ошибку. Я пробовал это, GetVersionCode.this, но ничего не работает.
Aashish
1
Использование .select (". HAyfc .htlgb"). Get (7) не является устойчивым к изменениям. Я видел другое решение, использующее вместо этого индекс 5. Чтобы выбрать правильный, я использую расширенный запрос .select (". HAyfc .BgcNfc: containsOwn (Текущая версия) + .htlgb.htlgb"). First () .text ()
HarryS
8

Ответ @Tarun работал отлично. Но теперь нет из-за недавних изменений от Google на веб-сайте Google Play.

Просто измените это из ответа @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);

    }
}

и не забудьте добавить библиотеку JSoup

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

и на 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();

}

вот и все .. Благодаря этой ссылке

Раджеш Надди
источник
8

введите описание изображения здесь

Google представил API обновлений в приложении

В настоящее время API поддерживает два потока:

  • «Немедленный» поток - это полноэкранный пользовательский интерфейс, который направляет пользователя от загрузки к обновлению, прежде чем он сможет использовать ваше приложение.
  • «Гибкий поток» позволяет пользователям загружать обновление, продолжая использовать ваше приложение.
Aswanth Bonthala
источник
Лучший ответ!!! Спасибо
Артем Безязычный
7

Есть библиотека AppUpdater . Как включить:

  1. Добавьте репозиторий в свой проект build.gradle :
allprojects {
    repositories {
        jcenter()
        maven {
            url "https://jitpack.io"
        }
    }
}
  1. Добавьте библиотеку в свой модуль build.gradle :
dependencies {
    compile 'com.github.javiersantos:AppUpdater:2.6.4'
}
  1. Добавьте разрешения INTERNET и ACCESS_NETWORK_STATE в манифест вашего приложения:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  1. Добавьте это к своей деятельности:
AppUpdater appUpdater = new AppUpdater(this); 
appUpdater.start();
stenlytw
источник
Все равно не работает. Используя следующий код, скажите, что я делаю не так.
Анураг Шривастава
Привет, я думаю, это ошибка. Пожалуйста, проверьте это обсуждение github.com/javiersantos/AppUpdater/issues/132
stenlytw
6

Исходя из гибридного приложения POV. Это пример javascript, у меня есть нижний колонтитул «Доступно обновление» в моем главном меню. Если доступно обновление (т. Е. Номер моей версии в файле конфигурации меньше, чем полученная версия, отобразить нижний колонтитул), это направит пользователя в магазин приложений / воспроизведения, где пользователь затем может нажать кнопку обновления.

Я также получаю новые данные (например, примечания к выпуску) и отображаю их в модальном окне при входе в систему, если это первый раз в этой версии.

На устройстве Ready укажите URL-адрес вашего магазина

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

Метод «Доступно обновление» можно запускать сколь угодно часто. Мой запускается каждый раз, когда пользователь переходит на главный экран.

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: у Apple есть API, поэтому его очень легко получить

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: PlayStore вам нужно очистить, как вы можете видеть, версию относительно легко получить, а что нового я беру html вместо текста, так как таким образом я могу использовать их форматирование (т.е. новые строки и т. Д.)

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

Логика открытого магазина проста, но для полноты картины

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 и App Store внесены в белый список:

  <access origin="https://itunes.apple.com"/>
  <access origin="https://play.google.com"/>
tyler_mitchell
источник
Я получаю сообщение об ошибке «Ошибка при синтаксическом анализе ответа ajax: SyntaxError: Unexpected token <». когда вызывается ajax get. Вы можете пролить свет на это, что пошло не так?
Kapilrc
ios или android? ваш URL правильный? переводит вас на правильную страницу в браузере?
tyler_mitchell
5

Firebase Remote Config лучше.

  • Быстро и легко обновляйте наши приложения без необходимости публиковать новую сборку в приложении.

Реализация удаленной настройки на Android

Добавление зависимости Remote Config

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

После этого мы можем получить доступ к экземпляру FirebaseRemoteConfig во всем нашем приложении, где это необходимо:

FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();

Получение значений удаленной конфигурации

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

Получение значений на стороне сервера

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

Теперь после загрузки новой версии в playstore нам нужно обновить номер версии внутри firebase. Теперь, если это новая версия, отобразится диалоговое окно обновления.

Нихас Низар
источник
5

Внутри метода OnCreate напишите ниже код ..

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

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

это дает вам версию приложения для магазина воспроизведения ..

тогда вам нужно проверить версию приложения, как показано ниже

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

после этого вы можете сравнить его с версией магазина и настроить собственные экраны обновления

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

    }

И добавьте VersionChecker.class, как показано ниже.

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

Настройте сервер, который предоставляет URL-адрес HTTP, который сообщает о последней версии, затем используйте AlarmManager для вызова этого URL-адреса и посмотрите, совпадает ли версия на устройстве с последней версией. Если это не так, выскочите сообщение или уведомление и отправьте их на рынок для обновления.

Вот несколько примеров кода: Как разрешить пользователям проверять наличие последней версии приложения изнутри приложения?

Macieg
источник
3

Помимо использования JSoup, мы также можем выполнить сопоставление с образцом для получения версии приложения из playStore.

Чтобы соответствовать последнему шаблону из игрового магазина Google, то есть <div class="BgcNfc">Current Version</div><span class="htlgb"><div><span class="htlgb">X.X.X</span></div> сначала нужно сопоставить указанную выше последовательность узлов, а затем из указанной выше последовательности получить значение версии. Ниже приведен фрагмент кода для того же:

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

Я решил эту проблему, так как это работает и для последних изменений в Google PlayStore. Надеюсь, это поможет.

DRK
источник
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;
    }
}
Баладжи Бал
источник
Пожалуйста, предоставьте некоторую информацию о том, как и что этот код будет работать
DarkSuniuM
2

Для этого нет официального GooglePlay API.

Но вы можете использовать эту неофициальную библиотеку для получения данных о версии приложения.

И, если вышеуказанное не работает для вас, вы всегда можете http подключиться к странице своего приложения (например, https://play.google.com/store/apps/details?id=com.shots.android&hl=en ) и проанализируйте поле «Текущая версия».

Гилад Хаимов
источник
1
Эта
библиотека
2

Вы можете попробовать следующий код, используя Jsoup

String latestVersion = doc.getElementsContainingOwnText("Current Version").parents().first().getAllElements().last().text();
Притеш Патель
источник
2

введите описание изображения здесьGoogle представил api для обновления в приложении. Используя это, мы можем попросить пользователя обновить приложение внутри приложения. Если пользователь соглашается, мы можем напрямую загрузить последнее приложение и установить его без перенаправления в игровой магазин. для получения более подробной информации перейдите по ссылке ниже

ссылка1 ссылка2

Магеш Пандиан
источник
Мне нравится созданный вами GIF :)
Хантер
1

подтвердил, что только этот метод работает сейчас:

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 представил функцию обновлений в приложении ( https://developer.android.com/guide/app-bundle/in-app-updates ), она работает на Lollipop + и дает вам возможность запросить у пользователя обновление с помощью приятного диалог (ГИБКИЙ) или с обязательным полноэкранным сообщением (НЕМЕДЛЕННО).

Вот как будет выглядеть Гибкое обновление: введите описание изображения здесь

и вот поток немедленного обновления: введите описание изображения здесь

Вы можете проверить мой ответ здесь https://stackoverflow.com/a/56808529/5502121, чтобы получить полный пример кода для реализации как гибкого, так и немедленного потоков обновления. Надеюсь, это поможет!

Кирилл Кармазин
источник