アプリのアップデートについてPlayストアをプログラムで確認する


92

アプリをGooglePlayストアに配置しました。それは私の会社の多くの顧客によってインストールされました。アプリのアップグレードのメカニズムを理解しています。

ユーザーは、自動更新するアプリごとに、Playストアアプリの[自動更新]チェックボックスをオンにする必要があります。ただし、一部のユーザーは、最初からチェックを外したり、チェックを外したりしています。

私が書いたアプリは介護業界向けで、介護者が在宅介護を提供するために使用しています。私の顧客の中には1200人の介護者がいます。電話を個別に更新するには、すべての介護者をオフィスに呼び込む必要があります。これは明らかに受け入れられません。

Playストアにアプリの更新バージョンがあるかどうかをプログラムで確認する方法はありますか?

ユーザーがPlayストアをチェックするアプリを起動するたびに実行されるコードを入手できますか?更新されたバージョンがある場合、ユーザーはプレイストアに誘導される可能性があります。これは、自動更新をチェックする必要がないことを意味します。

前もって感謝します

マット


アプリで利用可能なアップデートがある場合、Playストアはすでにユーザーに通知をプッシュしていませんか?
Nischaal Cooray 2014

1
アプリケーションは、作成したAPIから離れた場所でクラウド/インターネットに接続しますか?手動で更新できる「バージョン」変数を使用できるため、アプリケーションを開いたときに、ローカルバージョンをクラウドバージョンで確認しますか?異なる、更新を提案する
gavlaaaaaaaa 2014

以前はjsoupを使用してこれを実行していましたが、現在は正規表現を使用して[現在のバージョン]フィールド抽出しています
Geezer McNubbins 2018

回答:


42

2019年10月17日更新

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

2019年4月24日更新:

Androidは、おそらくこの問題を修正する機能を発表しました。アプリ内アップデートAPIの使用:https//android-developers.googleblog.com/2018/11/unfolding-right-now-at-androiddevsum​​mit.html

元の:

私の知る限り、これをサポートする公式のGoogleAPIはありません。

APIからバージョン番号を取得することを検討する必要があります。

外部APIまたはWebページ(Google Playストアなど)に接続する代わりに。APIまたはウェブページで何かが変更される可能性があるため、現在のアプリのバージョンコードが独自のAPIから取得したバージョン番号を下回っているかどうかを確認することを検討する必要があります。

アプリを更新する場合は、アプリのバージョン番号を使用して独自のAPIのバージョンを変更する必要があることを覚えておいてください。

独自のWebサイトまたはAPIで、バージョン番号を使用してファイルを作成することをお勧めします。(最終的にcronジョブを作成し、バージョンの更新を自動化し、問題が発生したときに通知を送信します)

この値は、Google Playストアページから取得する必要があります(その間に変更され、機能しなくなります)。

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

モバイルで使用されているバージョンが、独自のAPIで表示されているバージョン番号よりも低いかどうかをアプリで確認してください。

理想的には、通知で更新する必要があることを示します。

できること

独自のAPIを使用したバージョン番号

長所:

  • Google Playストアのコード全体をロードする必要はありません(データ/帯域幅を節約します)

短所:

  • ユーザーはオフラインになる可能性があり、APIにアクセスできないため、チェックが役に立たなくなります

ウェブページGooglePlayストアのバージョン番号

長所:

  • APIは必要ありません

短所:

  • ユーザーはオフラインになる可能性があり、APIにアクセスできないため、チェックが役に立たなくなります
    • この方法を使用すると、ユーザーにより多くの帯域幅/モバイルデータがかかる可能性があります
    • Playストアのウェブページが変更され、バージョン「リッパー」が機能しなくなる可能性があります。

Google Playストアのウェブページのバージョン番号は、これを解決する方法や他の代替手段が利用できるかどうかのアイデアCurrent VersionとしてリストされていVaries with deviceますか?
shadygoneinsane 2018年


確かに。Webリクエストを実行すると、独自のGoogle PlayページのHTMLソースにアクセスできなくなったため、この質問に来ました。FileNotFoundExceptionを受け取ります。
グリスグラム2018

テキストを含むdivを探すようなことを試みます。現在のバージョン/ Huidigeversie次のdivで最初の数字とドットの数字を見つけます。<div class = "hAyfc"> <div class = "BgcNfc"> Huidige versie </ div> <div> <span class = "htlgb"> 1.0 </ span> </ div>
Richard Lindhout 2018

クラス名は、おそらくWebサイトの更新ごとに変更されます。
リチャードリンドハウト2018

35

アプリのbuild.gradleファイルにJSoupを含めます。

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値に含まれていてはならない場合。このようなエラーがスローされる可能性があるためです。Invalidjava.lang.NumberFormatException:Invalid float: "1.0.6"。したがって、これを使用してください。if(!currentVersion.equalsIgnoreCase(onlineVersion)){....}
Dharmishtha 2017

1
Jsoupなしでそれを行う方法についてのアイデアはありますか?
Hitesh Sahu 2017

@HiteshSahu様、プレイストアのURL「play.google.com/store/apps/details?id=com.whatsapp&hl=en」にアクセスする必要があります。このオープンページのURL。ページを右クリックし、[ページソースの表示]オプションをクリックします。ページのhtmlには、「<div class = "content" itemprop = "softwareVersion"> 1.2 </ div>」という属性が表示されます。HTMLを解析し、このフラグを手動で取得する必要があります。
タルン2017

2
getPackageManager().getPackageInfo(getPackageName(), 0).versionNameあなたはただ使うことができますBuildConfig.VERSION_NAME:)
Enoobong 2018

1
これは明らかに生成されたクラス名であり、いつでも変更できます。あなたはこれをすべきではありません。
リチャードリンドハウト

24

GoogleはAPIを公開していなかったため、Firebase RemoteConfigは今のところ可能で信頼性の高いソリューションである可能性があります。

Firebase RemoteConfigドキュメントを確認する

手順 1.Firebaseプロジェクトを作成し、プロジェクトにgoogle_play_service.jsonを追加します

2. Firebase Console-> RemoteConfigで「android_latest_version_code」や「android_latest_version_name」などのキーを作成します

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
Firebaseでパラメータを作成するには、firebasetutorials.com / をご覧ください。
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

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の回答はもう機能していません。


これは働いている仲間ですが、私はこれを永遠に信頼できますか、それとも近い将来変更されますか?
Avinash Roy 2018

1
これは公式の解決策ではないため、これに依存することはお勧めしません。
Nikunj 2018

@Nikunj AsyncTaskを拡張するクラスGetVersionCodeを作成し、そのクラス内にコードを書き込むと、getPackageName()にエラーが表示されます。GetVersionCode.thisを試しましたが、何も機能しません。
Aashish 2018年

1
.select( "。hAyfc.htlgb")。get(7)の使用は、変更に対して堅牢ではありません。代わりにインデックス5を使用した別のソリューションを見ました。正しいものを選択するには、拡張クエリ.select( "。hAyfc.BgcNfc:containsOwn(Current Version)+ .htlgb.htlgb")。first()。
text

8

@Tarunの回答は完全に機能していましたが、Google Play WebサイトでのGoogleからの最近の変更により、現在は機能していません。

@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は現在、次の2つのフローをサポートしています。

  • 「即時」フローは、ユーザーがアプリを使用する前に、ダウンロードから更新までユーザーをガイドするフルスクリーンのユーザーエクスペリエンスです。
  • 「柔軟なフロー」により、ユーザーはアプリを使い続けながらアップデートをダウンロードできます。

ベストアンサー!!! ありがとう
Artem Beziazychnyi

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

とにかく動作していません。次のコードを使用して、私が間違っていることを教えてください。
Anurag Srivastava 2018年

こんにちは、バグがあると思います。この議論ご確認くださいgithub.com/javiersantos/AppUpdater/issues/132
stenlytw

6

ハイブリッドアプリケーションのPOVから来ています。これはJavaScriptの例です。メインメニューに[利用可能な更新]フッターがあります。更新が利用可能な場合(つまり、構成ファイル内のバージョン番号が取得したバージョンよりも小さい場合は、フッターを表示します)。これにより、ユーザーはアプリ/ Playストアに移動し、そこでユーザーは更新ボタンをクリックできます。

また、whats newデータ(リリースノートなど)を取得し、このバージョンで初めての場合は、ログイン時にモーダルで表示します。

デバイスレディで、ストアのURLを設定します

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

Update Availableメソッドは、何度でも実行できます。ユーザーがホーム画面に移動するたびに、鉱山が実行されます。

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ストアとAppStoreがホワイトリストに登録されていることを確認します。

  <access origin="https://itunes.apple.com"/>
  <access origin="https://play.google.com"/>

「ajax応答の解析エラー:SyntaxError:予期しないトークン<」というエラーが発生します。ajaxgetが呼び出されたとき。これに光を当てることができますか、何が悪かったのですか?
kapilrc 2017年

iOSまたはAndroid?あなたのURLは正しいですか?ブラウザのページを修正しますか?
tyler_mitchell 2017年

5

Firebase RemoteConfigの方が優れています。

  • 新しいビルドをアプリに公開することなく、アプリケーションをすばやく簡単に更新できます

Androidでのリモート構成の実装

リモート構成の依存関係の追加

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

新しいバージョンをPlayストアにアップロードしたら、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();
    }

これにより、Playストアバージョンのアプリが提供されます。

次に、以下のようにアプリのバージョンを確認する必要があります

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

最新バージョンを報告するHTTPURLを公開するサーバーをセットアップし、AlarmManagerを使用してそのURLを呼び出し、デバイスのバージョンが最新バージョンと同じかどうかを確認します。メッセージや通知がポップアップしない場合は、アップグレードするために市場に送信してください。

いくつかのコード例があります:ユーザーがアプリ内から最新のアプリバージョンを確認できるようにするにはどうすればよいですか?


3

JSoupを使用する以外に、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;
    }

これは最新のGooglePlayストアの変更でも機能するため、これで解決しました。お役に立てば幸いです。


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

それを行うための公式のGooglePlayAPIはありません。

ただし、この非公式ライブラリを使用して、アプリのバージョンデータを取得できます。

また、上記がうまくいかない場合は、いつでもアプリのページ(https://play.google.com/store/apps/details?id=com.shots.android&hl=enなど)にhttp接続して「現在のバージョン」フィールドを解析します。


1
この
ライブラリ

2

Jsoupを使用して次のコードを試すことができます

String latestVersion = doc.getElementsContainingOwnText("Current Version").parents().first().getAllElements().last().text();

2

ここに画像の説明を入力してくださいGoogleはアプリ内アップデートAPIを導入しました。これを使用して、アプリケーション内のアプリを更新するようにユーザーに依頼できます。ユーザーが同意すれば、最新のアプリを直接ダウンロードして、Playストアにリダイレクトせずにインストールできます。詳細については、以下のリンクを参照してください

リンク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 +で動作し、ユーザーに素敵なアップデートを要求する機能を提供します。ダイアログ(FLEXIBLE)または必須のフルスクリーンメッセージ(IMMEDIATE)付き。

ここではどのように柔軟なのアップデートは次のようになります。 ここに画像の説明を入力してください

即時更新フローは次のとおりです。 ここに画像の説明を入力してください

https://stackoverflow.com/a/56808529/5502121で私の答えを確認して、フレキシブル即時の両方の更新フローを実装するための完全なサンプルコードを入手できます。それが役に立てば幸い!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.