Прототип android-приложения с функцией обновления

Приложение UpdateApplication представляет из себя одноэкранное приложение интерфейс которого состоит из элементов  Button(кнопка) и TextView (тектовое поле).

Стартовый экран

Для корректной работы приложения необходимо добавить следующие разрешения в файл манифеста:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

Так же для корректной работы с версиями Android выше 7 в манифесте внути тега application должен быть добавлен FileProvider с указанием пути к файлу provider_paths:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="ru.slatinin.updateapplication.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>
</provider>

Содержание файла provider_paths:

<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="external_files" path="."/>
</paths>

При нажатии на кнопку «Получить обновление» вызывается внутренний метод приложения, который работает в отдельном потоке – updateAPK. Этот метод пытается получить apk-файл, который размещен в публичной папке Yandex.Диск. Файл представляет из себя установочный файл другой версии приложения UpdateApplication. В процессе скачивания в текстовом поле должны меняться сообщения отражающие этапы процесса загрузки файла.

Процесс скачивания

Так как Yandex.Диск не позволяет напрямую получать файл по публичной ссылке сначала метод updateAPK получает действительную ссылку для скачивания файла заключенную в JSON объект:

URL sUrl = new URL("https://cloud-api.yandex.net/v1/disk/public/resources/download?public_key=https://yadi.sk/d/74qNbPRS4RptGA");
connection = (HttpsURLConnection) sUrl.openConnection();
connection.connect();
input = connection.getInputStream();
InputStream in = new BufferedInputStream(input);
Scanner s = new Scanner(in).useDelimiter("\A");
String d = s.hasNext() ? s.next() : "";
if (!d.isEmpty()) {
JSONObject object = new JSONObject(d);
link = object.getString("href");
}

И уже по этой ссылке возможно оущестить непосредственно скачивание файла которое происходит в методе getAPK():

private void getApk(String link, File file) {
InputStream input = null;
OutputStream output = null;
HttpURLConnection connection = null;
try {
URL sUrl = new URL(link);
connection = (HttpURLConnection) sUrl.openConnection();
connection.connect();input = connection.getInputStream();
output = new FileOutputStream(file);
byte[] data = new byte[4096];
int count;
while ((count = input.read(data)) != -1) {
output.write(data, 0, count);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (output != null)
output.close();
if (input != null)
input.close();
} catch (IOException ignored) {
}if (connection != null)
connection.disconnect();
}
}

При первоначальной установке приложения UpdateApplication версия условно не является последней версией приложения. После скачивания условно последней версии приложения система Android (в случае версии Android 7+) сообщит через диалоговое окно, что для установки приложения необходимо предоставить соответствующее разрешение приложению UpdateApplication (установка из неизвестных источников). Необходимо нажать на кнопку «Настройки» в диалоговом окне.

Диалог предоставления разрешения

Откроется окно где необходимо перевести переключатель «Разрешить из этого источника» во включенное положение и далее нажать на системную кнопку «Назад» внизу экрана.

Предоставление разрешения на установку

Появится системное окно в котором необходимо нажать на кнопку «Установить».

Подтверждение установки обновления

После успешной установки, необходимо нажать кнопку «Открыть».

Открытие обновленной версии приложения

Вновь откроется интерфейс приложения UpdateApplication, но уже другая, условно последняя его версия. В случае повторной попытки скачать обновление в текстовом поле должно выйти сообщение о том, что на устройстве стоит последняя версия приложения.Процесс скачивания нормально запускается и без ведома пользователя, однако чтобы установить обновление вмешательство пользователя является обязательным.

Новая версия приложения

Ссылка на репозиторий проекта на github —https://github.com/Sandroisu/UpdateApplication.git

Print Friendly, PDF & Email

Добавить комментарий