#java #android #android-update-app
#java #Android #android-update-app
Вопрос:
Я пытаюсь сделать возможным для пользователей обновление приложения ann с устройства. У нас есть сервер, на котором пользователь может загрузить apk-файл с новой версией приложения. Вот код, который запускается после нажатия кнопки:
Handler handler = new Handler(Looper.getMainLooper());
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
File folder = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString());
File file = new File(folder.getAbsolutePath(), "localdb.apk");
final Uri uri = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) ?
FileProvider.getUriForFile(MainActivity.this, BuildConfig.APPLICATION_ID ".provider", file) :
Uri.fromFile(file);
if (file.exists())
file.delete();
//url to get app from server
String url = Names.UPDATE_URL;
InputStream input = null;
OutputStream output = null;
HttpURLConnection connection = null;
try {
URL sUrl = new URL(url);
connection = (HttpURLConnection) sUrl.openConnection();
connection.connect();
// download the file
input = connection.getInputStream();
output = new FileOutputStream(file);
byte data[] = new byte[4096];
int count;
while ((count = input.read(data)) != -1) {
// allow canceling with back button
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();
}
handler.post(new Runnable() {
@Override
public void run() {
Intent install = new Intent(Intent.ACTION_INSTALL_PACKAGE)
.setData(uri)
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(install);
}
});
}
});
thread.start();
Вот что у меня есть в манифесте:
...<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.QUICKBOOT_POWERON" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="ru.mob.myapp.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
...
и, наконец, XML-файл provider_paths:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="external_files" path="."/>
</paths>
Итак, все работает нормально, я загружаю apk с новой версией, она называется так же, как и уже установленная,
система просит меня установить (обновить) мое приложение, но когда все почти готово, я получаю сообщение «Приложение не установлено» без каких-либо подробностей.
У кого-нибудь есть решение, подсказка, совет?
Комментарии:
1. Можете ли вы предоставить подробную информацию о том, как вы создаете apk, который загружается на устройство?
2. Привет, я просто использую кнопку build APK в Android Studio
3. Хорошо, иногда, если вы не создаете правильно подписанный файл apk, это приведет к тому, что вы описали выше. Я бы дважды проверил, что создаваемый вами apk может быть установлен на устройстве.
4. Его определенно можно установить, я могу удалить текущий APK, затем получить другой из URL, и он устанавливается просто отлично. Но я понял — попытаюсь использовать подписанный APK, возможно, это причина.
5. Я решил это! Единственная причина проблемы заключается в том, что файл на сервере был поврежден. После того, как я поместил туда обычный файл, он работает идеально!