0

我当前的代码可以很好地从谷歌商店获取当前版本,但是是否可以在同一个响应中同时获取当前版本和最新版本?如果应用程序在 Play 商店中更新并且用户仍在使用旧版本,我想向用户推荐更新。下面是我的代码

public class AppVersion extends AsyncTask<String, Void, String> {

    private final String packageName;
    private final Listener listener;

    public interface Listener {
        void result(String version);
    }

    AppVersion(String packageName, Listener listener) {
        this.packageName = packageName;
        this.listener = listener;
    }

    @Override
    protected String doInBackground(String... params) {
        return getPlayStoreAppVersion(String.format("https://play.google.com/store/apps/details?id=%s", packageName));
    }

    @Override
    protected void onPostExecute(String version) {
        listener.result(version);
    }

    @Nullable
    private static String getPlayStoreAppVersion(String appUrlString) {
        String
                currentVersion_PatternSeq = "<div[^>]*?>Current\\sVersion</div><span[^>]*?>(.*?)><div[^>]*?>(.*?)><span[^>]*?>(.*?)</span>",
                appVersion_PatternSeq = "htlgb\">([^<]*)</s";
        try {
            URLConnection connection = new URL(appUrlString).openConnection();
            connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
            try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
                StringBuilder sourceCode = new StringBuilder();
                String line;
                while ((line = br.readLine()) != null) sourceCode.append(line);

                // Get the current version pattern sequence
                String versionString = getAppVersion(currentVersion_PatternSeq, sourceCode.toString());
                if (versionString == null) return null;

                // get version from "htlgb">X.X.X</span>
                return getAppVersion(appVersion_PatternSeq, versionString);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Nullable
    private static String getAppVersion(String patternString, String input) {
        try {
            Pattern pattern = Pattern.compile(patternString);
            if (pattern == null) return null;
            Matcher matcher = pattern.matcher(input);
            if (matcher.find()) return matcher.group(1);
        } catch (PatternSyntaxException e) {
            e.printStackTrace();
        }
        return null;
    }

}

并调用我使用的方法

   new AppVersion(context.getPackageName(), version ->
                Log.d("app version test", String.format("App version: %s", version)
                )).execute();
4

2 回答 2

1

在我看来,这对您的应用程序来说是一个糟糕的设计。您不应依赖抓取到 Play 商店来向用户显示升级提示。如果 Play 商店决定改变他们的 HTML 设计怎么办?您可能会让所有用户陷入困境。

更好的解决方案是使用Firebase Remote Config之类的东西。让您的应用从中读取允许的最低版本代码。然后它完全由您控制,您甚至不必编写服务器 - firebase 为您完成。

于 2019-02-15T09:51:07.983 回答
0

您可以从 BuildConfig 类获取 App 版本:

BuildConfig.VERSION_CODE.toString()

我还想澄清一件事,您无法在 Playstore 上获得已发布应用的应用版本。.

您可以将您的版本代码放在后端服务器上,然后通过 api 调用将该代码与您当前的应用程序版本进行检查。

我想这会对你有所帮助。

于 2019-02-14T11:32:39.387 回答