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 |
如果只想验证版本之间的不匹配,可以更改:
如果它是市场上的应用程序,那么在应用程序启动时,启动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
将
&安培;
只需添加以下代码,您就可以了。
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