在Play商店获取当前应用程序版本

3

我已经实现了代码来获取我的应用在Play商店中的当前版本,这样我就可以建议用户在Play商店中有任何新版本时升级应用程序。 这段代码以前运行得很好,但现在不起作用。

我使用的获取当前应用版本的代码如下:

newVersion = Jsoup.connect(
    "https://play.google.com/store/apps/details?id=" +
    "<app 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();

看起来Google Play商店网页已经更新了,我找不到任何具有itemprops=softwareVersion的div。我已经检查了我的应用程序在Google Play商店网页上的源代码,但它也没有显示当前应用程序版本。

我收到的异常是:

Process: com.srsvalutech.theparkking, PID: 25357
java.lang.RuntimeException: An error occured while executing doInBackground()
 at android.os.AsyncTask$3.done(AsyncTask.java:300)
 at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
 at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
 at java.util.concurrent.FutureTask.run(FutureTask.java:242)
 at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
 at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.jsoup.nodes.Element.ownText()' on a null object reference
 at com.srsvalutech.theparkking.view.SplashScreenActivity$GetAppCurrentVersionAsyncTask.doInBackground(SplashScreenActivity.java:124)
 at com.srsvalutech.theparkking.view.SplashScreenActivity$GetAppCurrentVersionAsyncTask.doInBackground(SplashScreenActivity.java:102)
 at android.os.AsyncTask$2.call(AsyncTask.java:288)
 at java.util.concurrent.FutureTask.run(FutureTask.java:237)
 at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
 at java.lang.Thread.run(Thread.java:818) 

有没有其他方式可以在Android中以编程方式获取Play商店上的Android应用程序的当前版本?请保留HTML标记。
3个回答

2
我遇到了同样的问题,这个问题的答案来自于jppavez: 如何获取Xamarin Android的Play商店版本号 对我有用。
只需将以下内容替换
.select("div[itemprop=softwareVersion]")
.first()
.ownText();

使用

.select("div:containsOwn(Current Version)")
.next()
.text();

编辑: 如果谷歌再次更改Play Store的源代码,不要忘记捕获RuntimeException以防止应用程序崩溃。 例如,与Crashlytics崩溃报告结合使用:

    } catch (RuntimeException e) {
        Crashlytics.logException(e);

1
我们使用的解决方案!
.select("div:containsOwn(Current Version) + div")
                                          .first()
                                          .text(); 

0

这个库基于JSoup来解析HTML: https://github.com/danielemaddaluno/Android-Update-Checker

你想要的一个基本实现将会像这样:

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

如果您只想验证版本之间的不匹配,可以更改以下内容:
value(curVersion) < value(newVersion) 改为 value(curVersion) != value(newVersion)

实际上,我已经按照你建议的实现了相同的内容,但现在它在jsoup.connect()...owntext处出现了空指针异常错误。 - S.Vishwakarma
上传logcat,空指针是因为某个值为空。 - Gastón Saillén

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接