以编程方式检查Play商店是否有应用更新

tur*_*boy 72 android

我已将我的应用程序放在Google Play商店中.它已被我公司的许多客户安装.我理解应用程序如何升级的机制.

用户应检查playstore应用程序中的自动更新复选框,以查找要自动更新的每个应用程序.但是,有些用户已取消选中或未首先检查它.

我写的应用程序是针对护理行业的,护理人员使用它来提供家庭护理.我们的一些客户有1200名护理员.他们必须打电话给所有护理人员进入办公室以单独更新电话.这显然是不可接受的.

有没有办法以编程方式检查Play商店中是否有我的应用程序的更新版本?

我可以拥有每次用户启动检查Play商店的应用程序时运行的代码吗?如果有更新版本,则可以将用户定向到Playstore.这意味着检查自动更新并不重要.

提前致谢

马特

Tar*_*run 34

在您的应用build.gradle文件中包含JSoup:

dependencies {
    compile 'org.jsoup:jsoup:1.8.3'
}
Run Code Online (Sandbox Code Playgroud)

并获得当前版本:

currentVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
Run Code Online (Sandbox Code Playgroud)

并执行以下线程:

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("div[itemprop=softwareVersion]")
                    .first()
                    .ownText();
            return newVersion;
        } catch (Exception e) {
            return newVersion;
        }
    }

    @Override
    protected void onPostExecute(String onlineVersion) {
        super.onPostExecute(onlineVersion);
        if (onlineVersion != null && !onlineVersion.isEmpty()) {
            if (Float.valueOf(currentVersion) < Float.valueOf(onlineVersion)) {
                //show dialog
            }
        }
        Log.d("update", "Current version " + currentVersion + "playstore version " + onlineVersion);
    }
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请访问:http://revisitingandroid.blogspot.in/2016/12/programmatically-check-play-store-for.html

  • `getPackageManager().getPackageInfo(getPackageName(),0).versionName`您可以使用`BuildConfig.VERSION_NAME` :) (2认同)
  • 它显然是一个生成的类名,可以随时更改。你不应该这样做。 (2认同)

Ric*_*out 31

AFAIK,没有支持此功能的官方Google API.

您应该考虑从API获取版本号.

而不是连接到外部API或网页(如Google Play商店).存在API或网页中可能发生变化的风险,因此您应该考虑检查当前应用的版本代码是否低于您从自己的API获得的版本号.

请记住,如果您更新了应用,则需要使用应用版本号更改自己API中的版本.

我建议您使用版本号在自己的网站或API中创建文件.(最终制作一个cronjob并自动更新版本,并在出现问题时发送通知)

您必须从Google Play商店页面获取此值:

<div class="content" itemprop="softwareVersion"> x.x.x  </div>
Run Code Online (Sandbox Code Playgroud)

如果移动设备上使用的版本低于您自己的API上显示的版本号,请检入您的应用.

理想情况下,显示她/他需要通知更新的指示.

你可以做的事情

使用您自己的API的版本号

优点:

  • 无需加载Google Play商店的全部代码(节省数据/带宽)

缺点:

  • 用户可以脱机,这使得检查无用,因为无法访问API

网页Google Play商店中的版本号

优点:

  • 您不需要API

缺点:

  • 用户可以脱机,这使得检查无用,因为无法访问API
    • 使用此方法可能会为您的用户带来更多带宽/移动数据
    • Play商店网页可能会更改,这会使您的版本"开膛手"不再起作用.


Sre*_*dhu 22

Firebase远程配置现在可能是一种可行且可靠的解决方案,因为谷歌没有公开任何api.

检查Firebase远程配置文档

步骤1. 创建一个firebase项目并将google_play_service.json添加到您的项目中

2.在firebase控制台 - >远程配置中创建"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);
}
Run Code Online (Sandbox Code Playgroud)

获取当前版本名称和代码

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
}
Run Code Online (Sandbox Code Playgroud)

4.使用您当前的生产版本名称和代码保持firebase"android_latest_version_code"和"android_latest_version_name"最新.

Firebase远程配置适用于Android和iPhone.


Nik*_*unj 16

您可以使用以下某些修改来获取当前的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);
}
Run Code Online (Sandbox Code Playgroud)

@Tarun的回答不再适用了.

  • 不建议依赖于此,因为它不是官方解决方案。 (2认同)

asw*_*ala 11

在此处输入图片说明

Google 引入了应用内更新 API

API 目前支持两种流:

  • “立即”流程是一种全屏用户体验,可引导用户从下载到更新,然后才能使用您的应用。
  • “灵活流程”允许用户在继续使用您的应用程序的同时下载更新。


tyl*_*ell 7

来自混合应用程序 POV。这是一个 javascript 示例,我的主菜单上有一个更新可用页脚。如果有可用更新(即我在配置文件中的版本号小于检索到的版本,显示页脚)这会将用户定向到应用程序/播放商店,然后用户可以在其中单击更新按钮。

如果是第一次使用此版本,我还会获取最新数据(即发行说明)并在登录时以模式显示这些数据。

在设备就绪上,设置您的商店 URL

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

可以根据需要随时运行更新可用方法。每次用户导航到主屏幕时都会运行我的。

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);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

iOS回调:苹果有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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

开放式商店逻辑很简单,但为了完整性

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')
}
Run Code Online (Sandbox Code Playgroud)

确保 Play 商店和 App Store 已被列入白名单:

  <access origin="https://itunes.apple.com"/>
  <access origin="https://play.google.com"/>
Run Code Online (Sandbox Code Playgroud)


ste*_*ytw 7

AppUpdater库.如何包括:

  1. 将存储库添加到项目 build.gradle:
allprojects {
    repositories {
        jcenter()
        maven {
            url "https://jitpack.io"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 将库添加到模块 build.gradle:
dependencies {
    compile 'com.github.javiersantos:AppUpdater:2.6.4'
}
Run Code Online (Sandbox Code Playgroud)
  1. 为您的应用的清单添加INTERNET和ACCESS_NETWORK_STATE权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Run Code Online (Sandbox Code Playgroud)
  1. 将此添加到您的活动中:
AppUpdater appUpdater = new AppUpdater(this); 
appUpdater.start();
Run Code Online (Sandbox Code Playgroud)


Raj*_*ddy 6

@Tarun的答案工作得很好.但现在不是,因为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);

    }
}
Run Code Online (Sandbox Code Playgroud)

并且不要忘记添加JSoup库

dependencies {
compile 'org.jsoup:jsoup:1.8.3'}
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

就是这样..感谢这个链接


小智 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();
    }
Run Code Online (Sandbox Code Playgroud)

这给你玩商店版的应用..

然后你必须检查应用程序版本如下

PackageManager manager = getPackageManager();
    PackageInfo info = null;
    try {
        info = manager.getPackageInfo(getPackageName(), 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    assert info != null;
    version = info.versionName;
Run Code Online (Sandbox Code Playgroud)

之后,您可以将其与商店版本进行比较,并设置您自己的更新屏幕

if(version.equals(latestVersion)){
        Toast.makeText(getBaseContext(), "No Update" , Toast.LENGTH_SHORT).show();
    }else {
        Toast.makeText(getBaseContext(), "Update" , Toast.LENGTH_SHORT).show();

    }
Run Code Online (Sandbox Code Playgroud)

并添加VersionChecker.class,如下所示

公共类VersionChecker扩展AsyncTask {

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

}


Nih*_*zar 5

Firebase 远程配置更好。

  • 快速轻松地更新我们的应用程序,而无需向应用程序发布新版本

在 Android 上实现远程配置

添加远程配置依赖

compile 'com.google.firebase:firebase-config:9.6.0'
Run Code Online (Sandbox Code Playgroud)

完成后,我们可以在需要时在整个应用程序中访问 FirebaseRemoteConfig 实例:

FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
Run Code Online (Sandbox Code Playgroud)

检索远程配置值

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");
Run Code Online (Sandbox Code Playgroud)

获取服务器端值

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...
                    }
                }
            });
Run Code Online (Sandbox Code Playgroud)

现在一旦将新版本上传到 Playstore,我们必须在 firebase 中更新版本号。现在,如果是新版本,将显示更新对话框