Приложение 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