Подтвердить что ты не робот

Как получить информацию о версии на рынке приложений из магазина Google Play?

Как я могу получить информацию о версии приложения из Google Play Store для запроса пользователя о принудительном/рекомендованном обновлении приложения при обновлении приложения Play Store, т.е. В случае, если пользователь использует приложение старой версии. Я уже прошел через andorid-market-api, который не является официальным способом, а также требует авторизации oauth для входа в систему от Google. Я также прошел через Android-запрос, который обеспечивает проверку версии в приложении, но он не работает в моем случае. Я нашел следующие две альтернативы:

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

Есть ли другие способы сделать это легко?

4b9b3361

Ответ 1

Я рекомендовал не использовать библиотеку, просто создать новый класс

1.

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

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("div.hAyfc:nth-child(4) > span:nth-child(2) > div:nth-child(1) > span:nth-child(1)")
                .first()
                .ownText();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return newVersion;
}
  1. В вашей деятельности:

        VersionChecker versionChecker = new VersionChecker();
        String latestVersion = versionChecker.execute().get();
    

ЭТО ВСЕ

Ответ 2

Вот версия jQuery, чтобы получить номер версии, если кому-то еще это нужно.

    $.get("https://play.google.com/store/apps/details?id=" + packageName + "&hl=en", function(data){
        console.log($('<div/>').html(data).contents().find('div[itemprop="softwareVersion"]').text().trim());
    });

Ответ 3

Используйте этот код, он прекрасно работает.

public void forceUpdate(){
    PackageManager packageManager = this.getPackageManager();
    PackageInfo packageInfo = null;
    try {
        packageInfo =packageManager.getPackageInfo(getPackageName(),0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    String currentVersion = packageInfo.versionName;
    new ForceUpdateAsync(currentVersion,TodayWork.this).execute();
}

public class ForceUpdateAsync extends AsyncTask<String, String, JSONObject> {

    private String latestVersion;
    private String currentVersion;
    private Context context;
    public ForceUpdateAsync(String currentVersion, Context context){
        this.currentVersion = currentVersion;
        this.context = context;
    }

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

        try {
            latestVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + context.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()
                    .select("div.hAyfc:nth-child(3) > span:nth-child(2) > div:nth-child(1) > span:nth-child(1)")
                    .first()
                    .ownText();
            Log.e("latestversion","---"+latestVersion);

        } catch (IOException e) {
            e.printStackTrace();
        }
        return new JSONObject();
    }

    @Override
    protected void onPostExecute(JSONObject jsonObject) {
        if(latestVersion!=null){
            if(!currentVersion.equalsIgnoreCase(latestVersion)){
                // Toast.makeText(context,"update is available.",Toast.LENGTH_LONG).show();
                if(!(context instanceof SplashActivity)) {
                    if(!((Activity)context).isFinishing()){
                        showForceUpdateDialog();
                    }
                }
            }
        }
        super.onPostExecute(jsonObject);
    }

    public void showForceUpdateDialog(){

        context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + context.getPackageName())));
    }

}

Ответ 4

Firebase Remote Config может помочь здесь,

Пожалуйста, обратитесь к этому ответу fooobar.com/questions/176528/...

Ответ 5

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

Чтобы соответствовать последней модели из Google PlayStore, т.е. <div class="BgcNfc">Current Version</div><span class="htlgb"><div><span class="htlgb">XXX</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. Надеюсь, это поможет.

Ответ 6

Использовать API-интерфейс сервера, который будет хранить информацию о версии

Как вы сказали. Это простой способ обнаружить обновление. Передавайте информацию о своей версии с помощью всех вызовов API. Когда обновляется игровой магазин, измените версию на сервере. После того, как версия сервера выше установленной версии приложения, вы можете вернуть код состояния/сообщение в ответе API, который может быть обработан, и может быть показано сообщение об обновлении. Вы также можете заблокировать пользователей от использования очень старого приложения, такого как WhatsApp, если вы используете этот метод.

Или вы можете использовать push-уведомление, которое легко сделать... Также

Ответ 7

Полный исходный код для этого решения: fooobar.com/questions/229575/...

import android.os.AsyncTask;
import android.support.annotation.Nullable;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class GooglePlayAppVersion extends AsyncTask<String, Void, String> {

    private final String packageName;
    private final Listener listener;
    public interface Listener {
        void result(String version);
    }

    public GooglePlayAppVersion(String packageName, Listener listener) {
        this.packageName = packageName;
        this.listener = listener;
    }

    @Override
    protected String doInBackground(String... params) {
        return getPlayStoreAppVersion(String.format("https://play.google.com/store/apps/details?id=%s", packageName));
    }

    @Override
    protected void onPostExecute(String version) {
        listener.result(version);
    }

    @Nullable
    private static String getPlayStoreAppVersion(String appUrlString) {
        String
              currentVersion_PatternSeq = "<div[^>]*?>Current\\sVersion</div><span[^>]*?>(.*?)><div[^>]*?>(.*?)><span[^>]*?>(.*?)</span>",
              appVersion_PatternSeq = "htlgb\">([^<]*)</s";
        try {
            URLConnection connection = new URL(appUrlString).openConnection();
            connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
            try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
                StringBuilder sourceCode = new StringBuilder();
                String line;
                while ((line = br.readLine()) != null) sourceCode.append(line);

                // Get the current version pattern sequence
                String versionString = getAppVersion(currentVersion_PatternSeq, sourceCode.toString());
                if (versionString == null) return null;

                // get version from "htlgb">X.X.X</span>
                return getAppVersion(appVersion_PatternSeq, versionString);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Nullable
    private static String getAppVersion(String patternString, String input) {
        try {
            Pattern pattern = Pattern.compile(patternString);
            if (pattern == null) return null;
            Matcher matcher = pattern.matcher(input);
            if (matcher.find()) return matcher.group(1);
        } catch (PatternSyntaxException e) {
            e.printStackTrace();
        }
        return null;
    }

}

Использование:

new GooglePlayAppVersion(getPackageName(), version -> 
    Log.d("TAG", String.format("App version: %s", version)
).execute();

Ответ 8

Я рекомендую использовать ex. push-уведомление, чтобы уведомить ваше приложение о том, что есть новое обновление, или используйте собственный сервер, чтобы включить приложение для чтения.

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

На всякий случай вы что-то пропустили - предыдущее обсуждение вашей темы запросить хранилище Google Play для версии приложения?

Ответ 9

Вы можете вызвать следующий WebService: http://carreto.pt/tools/android-store-version/?package=[YOUR_APP_PACKAGE_NAME]

Пример использования Volley:

String packageName = "com.google.android.apps.plus";
String url = "http://carreto.pt/tools/android-store-version/?package=";
JsonObjectRequest jsObjRequest = new JsonObjectRequest
    (Request.Method.GET, url+packageName, null, new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        /*
                                here you have access to:

                                package_name, - the app package name
                                status - success (true) of the request or not (false)
                                author - the app author
                                app_name - the app name on the store
                                locale - the locale defined by default for the app
                                publish_date - the date when the update was published
                                version - the version on the store
                                last_version_description - the update text description
                             */
                        try{
                            if(response != null && response.has("status") && response.getBoolean("status") && response.has("version")){
                                Toast.makeText(getApplicationContext(), response.getString("version").toString(), Toast.LENGTH_LONG).show();
                            }
                            else{
                                //TODO handling error
                            }
                        }
                        catch (Exception e){
                            //TODO handling error
                        }

                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        //TODO handling error
                    }
        });

Ответ 10

Самый простой способ - использовать пакет firebase из Google и использовать удаленные уведомления или конфигурацию в реальном времени с новой версией и отправил идентификатор пользователям ниже номера версии подробнее https://firebase.google.com/

Ответ 11

  • Лучше всего использовать Firebase Remote Config.
  • Другой способ - использовать собственный API.

Преимущества здесь в том, что вы сможете проверять номер версии вместо имени, что должно быть более удобным :) С другой стороны - вы должны заботиться об обновлении версии в api/firebase каждый раз после выпуска.

  • взять версию с веб-страницы Google Play. Я реализовал этот способ, и он работает более 1 года, но за это время мне пришлось менять "совпадения" 3-4 раза, потому что содержимое веб-страницы менялось. Также иногда болит голова, чтобы проверить это время от времени, потому что вы не можете знать, где это можно изменить. но если вы все еще хотите использовать этот способ, вот мой код kotlin, основанный на okHttp:

    private fun getVersion(onChecked: OnChecked, packageName: String) {
    
    Thread {
        try {
            val httpGet = HttpGet("https://play.google.com/store/apps/details?id="
                    + packageName + "&hl=it")
    
            val response: HttpResponse
            val httpParameters = BasicHttpParams()
            HttpConnectionParams.setConnectionTimeout(httpParameters, 10000)
            HttpConnectionParams.setSoTimeout(httpParameters, 10000)
            val httpclient = DefaultHttpClient(httpParameters)
            response = httpclient.execute(httpGet)
    
            val entity = response.entity
            val 'is': InputStream
            'is' = entity.content
            val reader: BufferedReader
            reader = BufferedReader(InputStreamReader('is', "iso-8859-1"), 8)
            val sb = StringBuilder()
            var line: String? = null
            while ({ line = reader.readLine(); line }() != null) {
                sb.append(line).append("\n")
            }
    
            val resString = sb.toString()
            var index = resString.indexOf(MATCHER)
            index += MATCHER.length
            val ver = resString.substring(index, index + 6) //6 is version length
            'is'.close()
            onChecked.versionUpdated(ver)
            [email protected]
        } catch (ignore: Error) {
        } catch (ignore: Exception) {
        }
    
        onChecked.versionUpdated(null)
    }.start()
    }
    

Ответ 12

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

Если минимальная версия приложения - 5.0, вы можете реализовать обновление в приложении в соответствии с документацией https://developer.android.com/guide/app-bundle/in-app-updates

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

Например, мы можем изменить фрагмент документации на что-то вроде этого:

// Creates instance of the manager.
val appUpdateManager = AppUpdateManagerFactory.create(context)

// Returns an intent object that you use to check for an update.
val appUpdateInfoTask = appUpdateManager.appUpdateInfo

// Checks that the platform will allow the specified type of update.
appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
    val version = appUpdateInfo.availableVersionCode()
    //do something with version. If there is not a newer version it returns an arbitary int
}

Ответ 13

Использование Jquery

$.get("https://play.google.com/store/apps/details?id=--bundleID--", function(data){
        htmlContentsArray=$('<div/>').html(data).contents();
        htmlContents=htmlContentsArray['prevObject']['0']['childNodes']['141'].outerText;
        if(htmlContents == ''){
            htmlContents=htmlContentsArray['prevObject']['0']['childNodes']['144'].outerText;
        }
        latest_version_array=htmlContents.split('Current Version');
            var latest_version_string=latest_version_array['1'];
            var latest_version=latest_version_string.substr(0,5);
});