【问题标题】:Android get Google Play Store app versionAndroid 获取 Google Play Store 应用版本
【发布时间】:2018-02-22 12:04:32
【问题描述】:

我正在使用此代码获取 Google Play 商店应用程序版本,但这会导致我的应用程序挂起。请指定获取应用版本的另一种方式或如何使用此代码使应用不挂起并成功运行。

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=" + "trai.gov.in.dnd" + "&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();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return newVersion;
    }
}

这是我从 asynctask 获取应用版本的代码

VersionChecker versionChecker = new VersionChecker();
try {
    String appVersionName = BuildConfig.VERSION_NAME;
    String mLatestVersionName = versionChecker.execute().get();
    if (versionChecker.compareVersionNames(appVersionName, mLatestVersionName) == -1) {
        showAppUpdateDialog();
    }
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}

【问题讨论】:

  • 适用于特定应用?
  • 是的特定应用程序
  • 你能粘贴调用这个异步任务的函数的代码吗?
  • 您是如何修复 compareVersionNames 错误的?
  • 你好兄弟,直到今天你还在使用 asyntask,还是因为 asyntask 已经被弃用,你已经找到了替代方案。

标签: android google-play version


【解决方案1】:

只需替换您的代码

.get()
.select("div[itemprop=softwareVersion]")
.first()
.ownText();

                    

如下:

.get()
.select(".hAyfc .htlgb")
.get(3)
.ownText();

它会起作用的..!

【讨论】:

  • 您现在需要使用 .get(5) 而不是 .get(3),但这是我发现的唯一可行的方法。
  • 您是如何修复 compareVersionNames 错误的?
【解决方案2】:

出现问题是因为在 Google Play 网站上不再找到元素 div [itemprop = softwareVersion](因此它不再返回版本号),它应该只使用 google 在您的网站上所做的更改更改为新查询.

注意:考虑到如果再次改变结构,则必须更改此代码。

希望对你有帮助

更新:12/09/2019

public class VersionChecker extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {

        private String newVersion;

        try {
        Document document = Jsoup.connect("https://play.google.com/store/apps/details?id=" + "com.example.package" + "&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();
                    }
                }
            }
        }
        return newVersion;
    }
}

Codigo Java

VersionChecker versionChecker = new VersionChecker();
try {
    String latestVersion = versionChecker.execute().get();
    String versionName = BuildConfig.VERSION_NAME.replace("-DEBUG","");
    if (latestVersion != null && !latestVersion.isEmpty()) {
        if (!latestVersion.equals(versionName)) {
            showDialogToSendToPlayStore();
        }else{
            continueWithTheLogin();
        }
    }
    Log.d("update", "Current version " + Float.valueOf(versionName) + ", Playstore version " + Float.valueOf(latestVersion));

} catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    e.printStackTrace();
}

【讨论】:

  • 不错!您的解决方案比上面的解决方案更好。
  • 什么是 showDialogToSendToPlayStore()?我应该添加一个库吗?
【解决方案3】:
  1. 您似乎使用 Google Play 商店网站上显示的“应用程序版本”来向您的用户触发“更新弹出窗口”,并在有新版本可用时通知您。首先,Google Play 商店网站经常更改,因此这不是很可靠,因为您的应用可能无法“解析/处理”这些更改。如果您想保留这种方法,其他一些答案已经解释了如何解析正确的 HTML 标记以及如何在后台正确执行。请记住,您的应用程序仍将负责“解析”,最终您将在 Web 服务器上远程进行解析,并向您的应用程序公开一个稳定的 API 端点以检索您自己的应用程序的“最新版本”。如果您不想费心解析 HTML 标记或托管自己的 API,则有第三方 API 可以为您完成这些工作。我们在这里提供了一个这样的 API:https://42matters.com/docs/app-market-data/android/apps/lookup(它返回一个带有应用程序最新“版本名称”的 JSON 对象)。

  2. 您也可以使用https://github.com/danielemaddaluno/Android-Update-Checker 来不实现您自己的代码,在幕后它的作用或多或少与您相同。

  3. 就我个人而言,我会使用 Firebase Remote Config https://firebase.google.com/docs/remote-config 之类的远程服务或托管在您网站上的简单 JSON 文件,指定您应用的最新发布版本(只要记住在您的应用更新真正发布于Google Play,现在可能需要一段时间)。另外,我宁愿使用此处解释的“版本代码”:https://developer.android.com/studio/publish/versioning 使用这种方法,您可以在需要时“触发”更新,更多的控制权在您身边(尤其是在您想要恢复“请更新”消息的情况下,如果您在发布的最新版本中发现错误很有用)

【讨论】:

    【解决方案4】:

    改变这两行

    {
     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")
    ....
    

    您正在使用BuildConfig.APPLICATION_ID,但您需要package_name

    BuildConfig 由 Gradle 提供。如果您没有使用Gradle 构建,则无法使用BuildConfig 访问包名称。

    我会使用Context.getPackageName(),因为结果是由操作系统提供的,而不是构建参数中的常量。

    【讨论】:

    • 好的,让我检查一下。
    • 你在 asynctask 里面做这个?
    • 应用加载仍在通话时间。
    • 在异步任务中是的
    • 您的清单中有互联网权限吗?你能发布你的错误日志吗?谢谢
    【解决方案5】:

    你需要把它放到AysncTask中

     //********* Check for Updated Version of APP
        private class GetVersionCode extends AsyncTask<Void, String, String> {
            String currentVersion = null;
    
            @Override
            protected String doInBackground(Void... voids) {
    
                String newVersion = null;
    
                try {
                    currentVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
                    newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + Activity.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) {
                    e.printStackTrace();
                }
                return null;
            }
    
            @Override
            protected void onPostExecute(String onlineVersion) {
                super.onPostExecute(onlineVersion);
                if (onlineVersion != null && !onlineVersion.isEmpty()) {
                    if (!currentVersion.equalsIgnoreCase(onlineVersion)) {
                        //Todo code here
    
                    }
                }
                Log.d("update", "Current version " + currentVersion + "playstore version " + onlineVersion);
            }
        }
    

    【讨论】:

    • 嗨,OP 说他已经有一个 asynctask,检查我的 asnwer 中的 cmets
    • 哦,我明白了……如果他在这方面做错了什么,可能会清除它。
    • 没问题老兄:)
    【解决方案6】:

    Google 将 API 从“softwareVersion”更改为“currentVersion”,我们可以使用“.hAyfc .htlgb”获得相同的版本

    以下代码将不起作用,即

    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[itemprop=softwareVersion]").first().ownText();
    

    只需添加此代码即可代替上面的代码,它会正常工作,即

    Document document = 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();
        if(document != null) {
            if(document.select(".hAyfc .htlgb").get(5) != null) {
                latestVersion = document.select(".hAyfc .htlgb").get(5).ownText();
            } else {
                latestVersion = currentVersion;
            }
        }
    
    Note: There is no official API to get the current application version from Google Play. So use the above code to get the current version. Sometimes get(5).ownText() will change as google is updating the Google Play site. [Previously it was working with get(2).ownText()].
    

    【讨论】:

      【解决方案7】:

      试试这个,

      替换代码,

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

      【讨论】:

        【解决方案8】:

        您可以使用 UpdateManager 更轻松地实现这一点 - https://developer.android.com/reference/com/google/android/things/update/UpdateManager

        您可以这样设置更新管理器

        // Creates instance of the manager.
        AppUpdateManager appUpdateManager = AppUpdateManagerFactory.create(this);
        
        // Returns an intent object that you use to check for an update.
        Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
        
        //On Success Listener
        appUpdateInfoTask.addOnSuccessListener(this);
        

        在您的 On Success 方法中,您可以调用

        result.availableVersionCode()
        

        当版本不同时返回 0。如果不同,您可以直接从您的应用中提取此值。

        【讨论】:

          猜你喜欢
          • 2022-07-19
          • 2016-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多