Программно проверять наличие обновлений приложений в 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


На самом деле. Пришел к этому вопросу, поскольку мы больше не можем получить доступ к источнику 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 поддерживает два потока:

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

Лучший ответ!!! Спасибо
Артем Безязычный

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

Все равно не работает. Используя следующий код, скажите, что я делаю не так.
Анураг Шривастава

Привет, я думаю, это ошибка. Пожалуйста, проверьте это обсуждение 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"/>

Я получаю сообщение об ошибке «Ошибка при синтаксическом анализе ответа 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-адреса и посмотрите, совпадает ли версия на устройстве с последней версией. Если это не так, выскочите сообщение или уведомление и отправьте их на рынок для обновления.

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


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. Надеюсь, это поможет.


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 ) и проанализируйте поле «Текущая версия».



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, чтобы получить полный пример кода для реализации как гибкого, так и немедленного потоков обновления. Надеюсь, это поможет!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.