Android

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

Как разрешить пользователям проверять наличие последней версии приложения изнутри приложения?

Я хочу добавить кнопку "Проверить наличие обновлений" в приложениях, чтобы, когда кто-то нажимал на нее, отображалось всплывающее сообщение / диалоговое окно выполнения для проверки версии приложения.

При обнаружении новой версии приложения автоматически загружают ее на телефон и позволяют пользователю вручную устанавливать обновленные приложения.

Или любой другой метод подойдет, если он может проверять наличие последней версии и уведомлять пользователя об обновлении.


Обновление: Теперь вы можете делать это внутри своего приложения с помощью https://developer.android.com/guide/playcore/in-app-updates

Переведено автоматически
Ответ 1

Вы можете использовать эту библиотеку для 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(BuildConfig.APPLICATION_ID, 0).versionName;
String newVersion = curVersion;
newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + BuildConfig.APPLICATION_ID + "&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)

Ответ 2

Если это приложение из Market, то при запуске приложения появляется намерение открыть приложение 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")));

Конечно, вам следует переписать это, чтобы выполнять запрос в фоновом потоке, но вы поняли идею.


Если вам нравится что-то немного более сложное, но позволяющее вашему приложению автоматически применять обновление, смотрите Здесь.


Ответ 3

Google обновил play Store за два месяца до этого. Это решение работает прямо сейчас для меня..

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

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

и в Oncreate ()

@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();

}

вот и все..
Благодаря этой ссылке

Ответ 4

добавить compile 'org.jsoup:jsoup:1.10.2' к зависимостям в сборке на УРОВНЕ ПРИЛОЖЕНИЯ.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();

}
}
}
java android http