【问题标题】:Android In-app version checkAndroid 应用内版本检查
【发布时间】:2019-11-27 14:13:14
【问题描述】:

我想在我的应用打开时在 google play 上查看应用版本。如果应用程序的版本高于已安装的应用程序,我想通知用户更新应用程序。我发现来自here 的“android-query” jar,在此我无法动态检查版本,我想设置 Major、Minor 或 Revision。任何人请帮助我该怎么做?

提前致谢

【问题讨论】:

  • 嗨 Jonathon Reinhart,对不起,我真的不明白。你能解释一下吗?
  • 这一直是由应用程序完成的,甚至是谷歌自己的应用程序。有时,后端服务的更新方式不再与旧版本的应用程序兼容。因此,如果您不想支持 3 年前的版本,可能需要在您的应用中执行此操作,因为有些人从不更新任何内容。
  • 在这里找到解决方案stackoverflow.com/questions/7298106/…
  • 不知道我是否正确回答了您的问题?

标签: android


【解决方案1】:

基本上,您应该检查市场上应用的最新版本以及设备上应用的版本,并确定是否有可用的更新。为此,请尝试以下操作:

您应该使用它来获取当前版本(设备上的应用程序版本):

private String getCurrentVersion(){
PackageManager pm = this.getPackageManager();
PackageInfo pInfo = null;

        try {
            pInfo =  pm.getPackageInfo(this.getPackageName(),0);

        } catch (PackageManager.NameNotFoundException e1) {
            e1.printStackTrace();
        }
        String currentVersion = pInfo.versionName;

        return currentVersion;
    }

并使用它来获取 Google play 中的最新版本(取自 https://stackoverflow.com/a/32942785/444991):

private class GetLatestVersion extends AsyncTask<String, String, String> {
String latestVersion;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params) {
        try {
            //It retrieves the latest version by scraping the content of current version from play store at runtime
            String urlOfAppFromPlayStore = "https://play.google.com/store/apps/details?id= your app package address";
            Document  doc = Jsoup.connect(urlOfAppFromPlayStore).get();
            latestVersion = doc.getElementsByAttributeValue("itemprop","softwareVersion").first().text();

        }catch (Exception e){
            e.printStackTrace();

        }

        return latestVersion;
    }
}

然后,当您的应用启动时,像这样检查它们:

String latestVersion = "";
        String currentVersion = getCurrentVersion();
        Log.d(LOG_TAG, "Current version = " + currentVersion);
        try {
            latestVersion = new GetLatestVersion().execute().get();
            Log.d(LOG_TAG, "Latest version = " + latestVersion);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        //If the versions are not the same
        if(!currentVersion.equals(latestVersion)){
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("An Update is Available");
            builder.setPositiveButton("Update", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //Click button action
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=your app package address")));
                    dialog.dismiss();
                }
            });

            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //Cancel button action
                }
            });

            builder.setCancelable(false);
            builder.show();
        }

并显示用户更新对话框。但请确保您已经导入了 jsoup 库。

额外:要导入 jsoup 库,请按以下步骤操作:

1- 转到文件菜单
2- 项目结构
3- 左侧点击应用
4- 选择依赖项选项卡
5- 点击 +
6-点击库依赖
7- 搜索“jsoup”
8- 选择 org.jsoup:jsoup 并点击确定

【讨论】:

  • 有什么办法不用jsoup lib\
  • 是的,有,但这种方法是现代且直接的。要添加 jsoup,您甚至不需要找到 jar 文件。您只需打开 Android Studio 转到文件菜单并按照我的 8 个步骤操作,然后您只需搜索名称 jsoup 即可添加 jsoup。这是 1、2、3 方法 :) 如果您需要更多解释,请告诉我。
  • 以后,不要在没有明确归属的情况下从其他地方复制内容。它被视为剽窃。见stackoverflow.com/help/referencing
  • 现在,通过在上面的 AsyncTask doInBackground 函数中添加一些小修改,我也一样工作:
  • 如果 Play 商店的 html 页面被更改会发生什么
【解决方案2】:

如果您不想使用 Jsoup 之类的库,可以使用类似这样的工具从 Google Play 获取当前版本号:

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;

public class StackAppVersion {

    public static void main(String[] args) {
        try {
            System.out.println(currentVersion());
        } catch (IOException ex) {
            System.out.println("Failed to read Google Play page!");
        }
    }

    private static String currentVersion() throws IOException {
        StringBuilder sb = new StringBuilder();

        try (Reader reader = new InputStreamReader(
                new URL("https://play.google.com/store/apps/details?id=com.stackexchange.marvin&hl=en")
                        .openConnection()
                        .getInputStream()
                , "UTF-8"
        )) {
            while (true) {
                int ch = reader.read();
                if (ch < 0) {
                    break;
                }
                sb.append((char) ch);
            }
        } catch (MalformedURLException ex) {
            // Can swallow this exception if your static URL tests OK.
        }

        String parts[] = sb.toString().split("softwareVersion");

        return parts[1].substring(
                parts[1].indexOf('>') + 1, parts[1].indexOf('<')
        ).trim();
    }
}

如果你在 URL 中保留“&hl=en”,字符编码 UTF-8 应该没问题。

【讨论】:

    【解决方案3】:

    在@Mohammad 的回答中添加了一些修改,对于当前的播放页面,下面对我有用。

     @Override
        protected String doInBackground(String... params) {
    
            try {
                Document doc = Jsoup.connect("https://play.google.com/store/apps/details?id=YOUR_PACKAGE_NAME").get();
                Element element = doc.getElementsByClass("BgcNfc").get(3);
                latestVersion = element.parent().children().get(1).children().text();
            } catch (Exception e) {
                latestVersion = currentVersion;
            }
    
            return latestVersion;
        }
    

    ***这不是一个通用的答案,因为它可能会随着播放页面的变化而改变*

    【讨论】:

      【解决方案4】:

      已接受的答案不再有效。最近我不得不更改代码。

      尝试以下方法:

      Jsoup.connect("https://play.google.com/store/apps/details?id=APPPACKAGE&hl=en")
                      .timeout(10000)
                      .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:contains(Current Version)").last().parent()
                      .select("span").last()
                      .ownText();
      

      【讨论】:

      • 完美运行,似乎比其他解决方案更具前瞻性。确保将 &amp;hl=en 放在 google play URL 的末尾,否则它可能会以另一种语言获取,并且无法正常工作。
      【解决方案5】:

      经过大量在线搜索后,我设法找到了一个可行的解决方案!所以对于其他寻找正确答案的人来说

      受保护的字符串 doInBackground(Void... voids) {

              StringBuilder sb = new StringBuilder();
      
              try (Reader reader = new InputStreamReader(
                      new URL("https://play.google.com/store/apps/details?id="+BuildConfig.APPLICATION_ID+"&hl=en")
                              .openConnection()
                              .getInputStream()
                      , "UTF-8"
              )) {
                  while (true) {
                      int ch = reader.read();
                      if (ch < 0) {
                          break;
                      }
                      sb.append((char) ch);
                  }
              } catch (MalformedURLException ex) {
                  Log.d("ERROR", ex.getMessage());
                  return null;
              } catch (UnsupportedEncodingException e) {
                  e.printStackTrace();
                  Log.d("ERROR", e.getMessage());
                  return null;
              } catch (IOException e) {
                  e.printStackTrace();
                  Log.d("ERROR", e.getMessage());
                  return null;
              }
      
              String parts[] = sb.toString().split("Current Version");
              String res = parts[1].substring(
                      parts[1].indexOf("htlgb") + 7, parts[1].indexOf("htlgb") + 11
              ).trim().toString();
              return res;
      
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-21
        • 1970-01-01
        • 2012-08-26
        • 2021-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多