web-dev-qa-db-ja.com

Google Playストアからアプリのマーケットバージョン情報を取得する方法は?

ユーザーが古いバージョンのアプリケーションを使用している場合など、Playストアアプリケーションが更新されたときに、アプリケーションの更新を強制/推奨するようユーザーに求めるために、Google Playストアからアプリケーションバージョン情報を取得するにはどうすればよいですか?私はすでに andorid-market-api を実行していますが、これは公式な方法ではなく、Googleからの認証 oauth login が必要です。また、 Android query を実行しました。これはアプリ内バージョンチェックを提供しますが、私の場合は機能しません。次の2つの選択肢が見つかりました。

  • バージョン情報を保存するサーバーAPIを使用します
  • Googleタグを使用してアプリ内でアクセスします。これは推奨される方法ではありません。

それを簡単に行う他の方法はありますか?

35
ravidl

新しいクラスを作成するだけでライブラリを使用しないでください

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

IS ALL

37
Horacio Solorio

他の人が必要とする場合にバージョン番号を取得する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());
    });
8
Firze

このコードを使用すると、完全に機能します。

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

}
6
Vikram Kaldoke

Firebase Remote Configはここで最も役立ちます。

この回答を参照してください https://stackoverflow.com/a/45750132/2049384

5
Sreedhu Madhu

JSoupの使用とは別に、playStoreからアプリのバージョンを取得するためのパターンマッチングを行うこともできます。

Google Playstoreからの最新のパターン、つまり<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;
    }

これで解決しました。これにより、PlayStoreでGoogleが行った最新の変更も解決されます。お役に立てば幸いです。

4
DRK

バージョン情報を保存するサーバーAPIを使用

あなたが言ったように。これは更新を検出する簡単な方法です。すべてのAPI呼び出しでバージョン情報を渡します。プレイストアが更新されたら、サーバーのバージョンを変更します。サーバーのバージョンがインストール済みのアプリのバージョンよりも高くなると、APIレスポンスでステータスコード/メッセージを返すことができ、これを処理して更新メッセージを表示できます。 この方法を使用すると、WhatsAppのような非常に古いアプリの使用をブロックすることもできます。

または、プッシュ通知を使用できます。これは簡単です...

2
shijin

このソリューションの完全なソースコード: https://stackoverflow.com/a/50479184/5740468

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();
1
Сергей

次のWebServiceを呼び出すことができます。 http://carreto.pt/tools/Android-store-version/?package= [YOUR_APP_PACKAGE_NAME]

ボレーを使用した例:

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

Exを使用することをお勧めします。プッシュ通知を使用して、アプリに新しい更新があることを通知します。OR独自のサーバーを使用して、そこからアプリがバージョンを読み取れるようにします。

はい、アプリを更新するたびに追加の作業が必要になりますが、この場合、サービスが不足する可能性のある「非公式」またはサードパーティのものに依存していません。

あなたが何かを見逃した場合に備えて-あなたのトピックの以前の議論 アプリのバージョンをGoogle Playストアに問い合わせますか?

0
lganzzzo

最も簡単な方法は、Googleのfirebaseパッケージを使用し、新しいバージョンでリモート通知またはリアルタイム設定を使用し、バージョン番号が下のユーザーにidを送信することです。詳細を参照してください https://firebase.google.com/

0
alacoo
  • より良い方法は、 Firebase Remote Config を使用することです。
  • 他の方法は、独自のAPIを使用することです。

ここでの利点は、名前の代わりにバージョン番号を確認できることです。これはより便利です:)一方、リリース後に毎回api/firebaseのバージョンを更新する必要があります。

  • google Play Webページからバージョンを取得します。私はこの方法を実装しましたが、1年以上は機能しますが、この間、Webページのコンテンツが変更されたため、「マッチャー」を3〜4回変更する必要があります。また、どこで変更できるのかわからないため、時々チェックするのは頭痛の種です。それでもこの方法を使用する場合は、okHttpに基づいたkotlinコードを次に示します。

    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)
            return@Thread
        } catch (ignore: Error) {
        } catch (ignore: Exception) {
        }
    
        onChecked.versionUpdated(null)
    }.start()
    }
    
0
Siarhei

アプリのバージョンをリクエストする主な理由は、ユーザーに更新を促すためだと思います。これは将来のバージョンで機能を損なう可能性があるためです。

アプリの最小バージョンが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
}
0
Vaios