使用Jsoup的版本检查器不再工作

时间:2018-04-11 09:02:32

标签: android google-play jsoup version android-studio-3.0

我在Play商店有一个应用程序已有近一年的时间。我使用下面的代码检查当前版本并显示用户弹出窗口,以便在新版本可用时进行更新。

private boolean checkVersionNumber() {
            boolean isCurrentVersion = true;
            DebugLog.d(TAG + "https://play.google.com/store/apps/details?id=" + getPackageName());

            VersionChecker versionChecker = new VersionChecker();

            try {
                String latestVersion = versionChecker.execute().get();
                PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
                String currentVersion = pInfo.versionName;

                if (!TextUtils.isEmpty(latestVersion) && !TextUtils.isEmpty(currentVersion)) {
                    DebugLog.d(TAG + "checkVersionNumber: VERSIONS NOT EMPTY");
                    if (latestVersion.equalsIgnoreCase(currentVersion)) {
                        DebugLog.d(TAG + "checkVersionNumber: IS THE CURRENT VERSION");
                        isCurrentVersion = true;
                    } else {
                        DebugLog.d(TAG + "checkVersionNumber: IS THE CURRENT VERSION");
                        isCurrentVersion = false;
                    }
                } else {
                    DebugLog.d(TAG + "checkVersionNumber: VERSIONS WERE EMPTY");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }

            return isCurrentVersion;

        }

以下是 VersionChecker

的代码
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=" + 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("div[itemprop=softwareVersion]").first()
                        .ownText();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return newVersion;
        }
    }

到目前为止工作正常。但是在过去的一个月里,所有用户都在崩溃之中。

java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                                             at android.os.AsyncTask$3.done(AsyncTask.java:325)
                                                                             at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
                                                                             at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
                                                                             at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                             at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
                                                                             at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                                             at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                                             at java.lang.Thread.run(Thread.java:761)
                                                                          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.myapp.activity.SplashActivity$VersionChecker.doInBackground(SplashActivity.java:190)
                                                                             at com.myapp.activity.SplashActivity$VersionChecker.doInBackground(SplashActivity.java:176)
                                                                             at android.os.AsyncTask$2.call(AsyncTask.java:305)
                                                                             at java.util.concurrent.FutureTask.run(FutureTask.java:237)

我不确定是什么问题。有谁知道这个api是否正常工作.. ???

1 个答案:

答案 0 :(得分:1)

解析当前版本的Play商店是一个非常糟糕的主意。 Play商店可以随时更改它的HTML(如您所知)。它还会对那些有正当理由留下旧版本的用户(例如,他们正在旅行并拥有非常昂贵的互联网)进行一段时间的处理。

更好的想法是使用类似Firebase remote config的内容来配置应用的最低可接受版本。在您发布应用更新后的某个时间(可能是一周或两周)将此更新到最新版本。那样:

  • 您可以完全控制流程
  • Play商店HTML更改不会导致崩溃
  • 您可以让用户有机会控制他们何时升级,以方便他们使用