Как разрешить пользователям проверять наличие последней версии приложения внутри приложения? - PullRequest
54 голосов
/ 04 сентября 2011

Я хочу добавить в приложения кнопку «Проверить наличие обновлений», чтобы при нажатии на нее отображалось всплывающее сообщение / диалоговое окно хода выполнения для проверки версии приложения.

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

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

Ответы [ 8 ]

43 голосов
/ 04 апреля 2013

Чтобы сэкономить время написания для проверки обновления новой версии приложения для Android, я написал его как библиотеку и с открытым исходным кодом на https://github.com/winsontan520/Android-WVersionManager

38 голосов
/ 19 января 2014

Вы можете использовать эту библиотеку Android: https://github.com/danielemaddaluno/Android-Update-Checker. Она направлена ​​на предоставление инструмента многократного использования для асинхронной проверки, если существует какое-либо более новое выпущенное обновление вашего приложения в Магазине.Он основан на использовании Jsoup (http://jsoup.org/) для проверки, действительно ли существует новое обновление при разборе страницы приложения в Google Play Store:

private boolean web_update(){
    try {       
        String curVersion = applicationContext.getPackageManager().getPackageInfo(package_name, 0).versionName; 
        String newVersion = curVersion;
        newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + package_name + "&hl=en")
                .timeout(30000)
                .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
                .referrer("http://www.google.com")
                .get()
                .select("div[itemprop=softwareVersion]")
                .first()
                .ownText();
        return (value(curVersion) < value(newVersion)) ? true : false;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

И в качестве функции «значение» следующее(работает, если значения находятся между 0-99):

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

Если вы хотите только проверить несоответствие между версиями, вы можете изменить:

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

26 голосов
/ 04 сентября 2011

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

В противном случае реализация и проверка обновлений довольно просты. Вот мой код (примерно) для этого:

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

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

Если вам нравится что-то немного более сложное, но оно позволяет вашему приложению автоматически применить обновление см. здесь .

10 голосов
/ 09 мая 2018

Google обновил игровой магазин за два месяца до этого.Это решение работает прямо сейчас для меня ..

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

}

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

5 голосов
/ 09 ноября 2015

Перейдите на страницу воспроизведения:

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

Использование стандартного HTTP GET. Теперь следующий jQuery найдет для вас важную информацию:

Текущая версия

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

Что нового

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

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

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

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

Использует HtmlCleaner

4 голосов
/ 04 мая 2017

добавить compile 'org.jsoup:jsoup:1.10.2' к зависимостям в УРОВЕНЬ ПРИЛОЖЕНИЯ build.gradle

&

Просто добавьте приведенный ниже код и все готово.

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

        try {
            newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + SplashActivity.this.getPackageName() + "&hl=it")
                    .timeout(30000)
                    .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
                    .referrer("http://www.google.com")
                    .get()
                    .select("div[itemprop=softwareVersion]")
                    .first()
                    .ownText();
            return newVersion;
        } catch (Exception e) {
            return newVersion;
        }
    }

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

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

        }
    }
}
2 голосов
/ 04 сентября 2011

API для этого не существует, и вы не можете автоматически установить его, вы можете просто перенаправить их на страницу Market, чтобы они могли обновиться. Ваша последняя версия может быть в файле на веб-сервере, и приложение может проверить ее. Вот одна из реализаций этого:

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

0 голосов
/ 13 февраля 2016

Сначала необходимо проверить версию приложения на маркете и сравнить ее с версией приложения на устройстве.Если они отличаются, возможно, доступно обновление.В этом посте я записал код для получения текущей версии маркета и текущей версии на устройстве и сравнил их вместе.Я также показал, как показать диалог обновления и перенаправить пользователя на страницу обновления.Пожалуйста, перейдите по этой ссылке: https://stackoverflow.com/a/33925032/5475941

...