Как разрешить пользователям проверять последнюю версию приложения внутри приложения?
Я хочу добавить кнопку "Проверить обновление" в приложениях, чтобы, когда кто-то нажимает на нее, она отобразит диалоговое окно тоста/прогресс для проверки версии приложения.
Если новая версия будет найдена, приложения автоматически загрузят ее на телефон и позволят пользователю вручную устанавливать обновленные приложения.
Или любой другой метод будет делать, если он может проверить последнюю версию и уведомить пользователя о необходимости обновления.
Ответы
Ответ 1
Если это приложение на рынке, а затем при запуске приложения, запустите Intent, чтобы с надеждой открыть приложение Market, которое заставит его проверять наличие обновлений.
В противном случае реализация и обновление проверки довольно просто. Вот мой код (примерно) для него:
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")));
Конечно, вы должны переписать это, чтобы выполнить запрос в фоновом потоке, но вы получите эту идею.
Если вам нравится что-то немного, но сложнее, но позволяет вашему приложению автоматически применять обновление, см. здесь.
Ответ 2
Чтобы сэкономить время для проверки обновления новой версии приложения для Android, я написал ее как библиотеку и с открытым исходным кодом в https://github.com/winsontan520/Android-WVersionManager
Ответ 3
Вы можете использовать эту Android-библиотеку: https://github.com/danielemaddaluno/Android-Update-Checker. Он направлен на предоставление повторно используемого инструмента для проверки асинхронно, если существует новое выпущенное обновление вашего приложения в Магазине.
Он основан на использовании Jsoup (http://jsoup.org/), чтобы проверить, действительно ли существует новое обновление для разбора страницы приложения в Google Play Store:
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):
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)
Ответ 4
Перейдите на страницу воспроизведения:
https://play.google.com/store/apps/details?id=com.yourpackage
Использование стандартного HTTP GET.
Теперь следующий jQuery найдет для вас важную информацию:
Текущая версия
$("[itemprop='softwareVersion']").text()
Что нового
$(".recent-change").each(function() { all += $(this).text() + "\n"; })
Теперь, когда вы можете извлечь эту информацию вручную, просто создайте в своем приложении метод, который выполняет это для вас.
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()
+ "\n";
}
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
Ответ 5
Для этого нет API, и вы не можете его автоматически установить, вы можете просто перенаправить их на страницу Market, чтобы они могли обновить. Вы можете загрузить свою последнюю версию в файл на веб-сервере и проверить это приложение. Здесь одна реализация этого:
http://code.google.com/p/openintents/source/browse/#svn%2Ftrunk%2FUpdateCheckerApp
Ответ 6
Вы должны сначала проверить версию приложения на рынке и сравнить ее с версией приложения на устройстве. Если они отличаются, это может быть доступное обновление. В этом посте я записал код для получения текущей версии рынка и текущей версии на устройстве и сравнил их вместе. Я также показал, как показать диалог обновления и перенаправить пользователя на страницу обновления. Перейдите по этой ссылке: fooobar.com/questions/114248/...
Ответ 7
добавить compile 'org.jsoup:jsoup:1.10.2'
в зависимости от УРОВЕНЬ APP build.gradle
&
Просто добавьте код ниже, и вы хорошо пойдете.
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();
}
}
}