关于java:如何允许用户从应用程序内部检查最新的应用程序版本?

How to allow users to check for the latest app version from inside the app?

我想在应用程序中添加"检查更新"按钮,以便当有人单击它时,它将显示一个用于检查应用程序版本的Toast消息/进度对话框。

如果找到新版本,应用程序将自动将其下载到手机,并允许用户手动安装更新的应用程序。

或者任何其他方法都可以,只要它可以检查最新版本并通知用户更新。


为了节省用于检查Android应用程序的新版本更新的时间,我将其编写为库和开源https://github.com/winsontan520/Android-WVersionManager


您可以使用此Android库:https://github.com/danielemaddaluno/Android-Update-Checker。它旨在提供一种可重复使用的工具,以便在商店中存在应用程序的任何较新发布更新时异步检查。
它基于使用Jsoup(http://jsoup.org/)来测试是否确实存在解析Google Play商店中应用页面的新更新:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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;
    }
}

并且作为"值"功能如下(如果值在0-99之间,则有效):

1
2
3
4
5
6
7
8
9
10
private long value(String string) {
    string = string.trim();
    if( string.contains("." )){
        final int index = string.lastIndexOf("." );
        return value( string.substring( 0, index ))* 100 + value( string.substring( index + 1 ));
    }
    else {
        return Long.valueOf( string );
    }
}

如果只想验证版本之间的不匹配,可以更改:

value(curVersion) < value(newVersion)value(curVersion) != value(newVersion)


如果它是市场上的应用程序,那么在应用程序启动时,启动Intent以打开市场应用程序,这将导致它检查更新。

否则,实现和更新检查器相当容易。这是我的代码(大致):

1
2
3
4
5
String response = SendNetworkUpdateAppRequest(); // Your code to do the network request
                                                 // should send the current version
                                                 // to server
if(response.equals("YES")) // Start Intent to download the app user has to manually install it by clicking on the notification
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("URL TO LATEST APK")));

当然你应该重写这个来在后台线程上做请求,但你明白了。

If you like something a little but more complex but allows your app to
automatically apply the update see here.


Google在两个月前更新了Play商店。
这是我现在正在使用的解决方案..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class GetVersionCode extends AsyncTask<Void, String, String> {

    @Override

    protected String doInBackground(Void... voids) {

        String newVersion = null;

        try {
            Document document = Jsoup.connect("https://play.google.com/store/apps/details?id=" + MainActivity.this.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) {
                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();
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return newVersion;

    }


    @Override

    protected void onPostExecute(String onlineVersion) {

        super.onPostExecute(onlineVersion);

        if (onlineVersion != null && !onlineVersion.isEmpty()) {

            if (Float.valueOf(currentVersion) < Float.valueOf(onlineVersion)) {
                //show anything
            }

        }

        Log.d("update","Current version" + currentVersion +"playstore version" + onlineVersion);

    }
}

并且不要忘记添加JSoup库

1
2
dependencies {
compile 'org.jsoup:jsoup:1.8.3'}

并在Oncreate()上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    String currentVersion;
    try {
        currentVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }

    new GetVersionCode().execute();

}

而已..
感谢这个链接


导航到您的播放页面:

1
https://play.google.com/store/apps/details?id=com.yourpackage

使用标准HTTP GET。
现在,以下jQuery为您找到重要信息:

当前版本

1
$("[itemprop='softwareVersion']").text()

什么是新的

1
2
$(".recent-change").each(function() { all += $(this).text() +"
"
; })

既然您可以手动提取这些信息,只需在您的应用程序中创建一个为您执行此操作的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public static String[] getAppVersionInfo(String playUrl) {
    HtmlCleaner cleaner = new HtmlCleaner();
    CleanerProperties props = cleaner.getProperties();
    props.setAllowHtmlInsideAttributes(true);
    props.setAllowMultiWordAttributes(true);
    props.setRecognizeUnicodeChars(true);
    props.setOmitComments(true);
    try {
        URL url = new URL(playUrl);
        URLConnection conn = url.openConnection();
        TagNode node = cleaner.clean(new InputStreamReader(conn.getInputStream()));
        Object[] new_nodes = node.evaluateXPath("//*[@class='recent-change']");
        Object[] version_nodes = node.evaluateXPath("//*[@itemprop='softwareVersion']");

        String version ="", whatsNew ="";
        for (Object new_node : new_nodes) {
            TagNode info_node = (TagNode) new_node;
            whatsNew += info_node.getAllChildren().get(0).toString().trim()
                    +"
"
;
        }
        if (version_nodes.length > 0) {
            TagNode ver = (TagNode) version_nodes[0];
            version = ver.getAllChildren().get(0).toString().trim();
        }
        return new String[]{version, whatsNew};
    } catch (IOException | XPatherException e) {
        e.printStackTrace();
        return null;
    }
}

使用HtmlCleaner


compile 'org.jsoup:jsoup:1.10.2'添加到APP LEVEL build.gradle中的依赖项

&安培;

只需添加以下代码,您就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
private class GetVersionCode extends AsyncTask<Void, String, String> {
    @Override
    protected String doInBackground(Void... voids) {

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

    @Override
    protected void onPostExecute(String onlineVersion) {
        super.onPostExecute(onlineVersion);

        if (!currentVersion.equalsIgnoreCase(onlineVersion)) {
            //show dialog
            new AlertDialog.Builder(context)
                    .setTitle("Updated app available!")
                    .setMessage("Want to update app?")
                    .setPositiveButton("Update", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            // continue with delete
                            final String appPackageName = getPackageName(); // getPackageName() from Context or Activity object
                            try {
                                Toast.makeText(getApplicationContext(),"App is in BETA version cannot update", Toast.LENGTH_SHORT).show();
                                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
                            } catch (ActivityNotFoundException anfe) {
                                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
                            }
                        }
                    })
                    .setNegativeButton("Later", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            // do nothing
                            dialog.dismiss();
                            new MyAsyncTask().execute();
                        }
                    })
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .show();

        }
    }
}


没有API,你无法自动安装它,你只需将它们重定向到它的市场页面,这样他们就可以升级。您可以将最新版本放在Web服务器上的文件中,然后让应用程序对其进行检查。这是一个实现:

http://code.google.com/p/openintents/source/browse/#svn%2Ftrunk%2FUpdateCheckerApp


您应首先检查市场上的应用程序版本,并将其与设备上的应用程序版本进行比较。如果它们不同,则可能是可用的更新。在这篇文章中,我写下了在设备上获取当前版本的市场和当前版本的代码,并将它们进行比较。我还展示了如何显示更新对话框并将用户重定向到更新页面。请访问此链接:https://stackoverflow.com/a/33925032/5475941