Как я могу проверить свое собственное приложение, если доступна более новая версия, а затем автоматически обновить себя? Идея состоит в том, чтобы запросить API для новой версии и получить файл apk. Затем следует сохранить APK и запустить установку/обновление. Я не знаю, как это создать. Запрос к API не имеет большого значения, но как я могу хранить и выполнять APK-файл на Android-устройстве?
Я нашел только это но было слишком много ошибок компиляции (Context, Java, Buld, Intent, FileProvider не удалось найти).
Не подскажете, как решить эту "проблему"?
СПАСИБО!
Есть ли где-нибудь учебники для разработки этого? Где я могу найти пример кода для этого. Если понятно, какая настройка для какой версии андроида, то реализую. Но мне нужно знать, как это сделать :(
Вы проверяли официальный документ об обновлении в приложениях?
@nicetomitja Учебники - нет. Найдите «программно установить APK» и объедините некоторые ответы. Предупреждаю еще раз - каждую версию мне приходится это немного подправлять. Возможно, это не лучший выбор для вашего приложения.
Спасибо @LiyunZhang-MSFT. Но альтернативы MAUI/.NET нет, это просто Java, не так ли?
@Х.А.Х. У тебя есть другие идеи? Как я могу сделать так, чтобы я мог запускать программное обеспечение на устройстве и обновлять себя, если есть новая версия. Как я могу представить это, если у меня установлен файл APK и я не публикую приложение в PlayStore?
Создайте серверное приложение .NET, которое будет служить вам хранилищем. Первый контроллер используется для ответа на текущую версию запрашиваемого вами приложения. Затем, если есть разница, спросите пользователя, хочет ли он загрузить новую версию. Получите zip-архив с apk и примечаниями к патчу. Показать примечания к патчу. И последнее - попросить пользователя установить новое приложение. Вот как я делаю вещи.
Вы можете проверить ответ об установке apk в своем приложении.
Спасибо, @LiyunZhang-MSFT! Это именно то, что я искал. Я попробую это позже и вернусь, если это сработает, как ожидалось.
Это сработало для вас?
@LiyunZhang-MSFT: я пытался реализовать, но в MAUI есть некоторые ошибки. Скриншот Метод "StartAcitivity" неизвестен и параметр Context & Autority должен быть установлен другим способом.
Вы поместили код в mainactivity?
Дайте мне немного времени, я изменил код, чтобы теперь у меня не было ошибок компиляции.
Есть ли возможность избежать того факта, что пользователь должен разрешить «установить неизвестные приложения» из источника? Кроме того, у меня проблема, что я получаю сообщение «приложение не установлено». Я удалил приложение вручную, чем работает apk. Возможно, это потому, что я не увеличил номер версии? Или мне всегда нужно сначала удалить приложение, а затем переустановить его?
Это системный диалог, который используется для предотвращения ошибочного удаления. Когда вы устанавливаете на свое устройство то же самое приложение, которое имеет новую версию, вам необходимо сначала удалить старую версию.
У вас есть идеи, как этого добиться (удаление приложения в приложении)?
Вы можете проверить эту ссылку, которая об удалении приложения в ней.
Спасибо! Но опять ошибки компиляции в MAUI: Скриншот
Вы можете удалить свое приложение с помощью следующего кода:
var name = this.ApplicationContext.PackageName;
Intent intent = new Intent(Intent.ActionDelete);
intent.SetData(Android.Net.Uri.Parse("package:" + name));
StartActivity(intent);
Кроме того, не забудьте добавить разрешения в AndroidManifest.xml:
<uses-permission android:name = "android.permission.DELETE_PACKAGES" />
<uses-permission android:name = "android.permission.REQUEST_DELETE_PACKAGES" />
Нет необходимости удалять приложение. Если он собран с тем же хранилищем ключей и подписью, можно установить одну версию напрямую, чтобы перезаписать существующую.
var context = Android.App.Application.Context;
var path = Path.Combine(Android.App.Application.Context.GetExternalFilesDir("").AbsolutePath, "com.companyname.Testproject.apk");
Java.IO.File file = new Java.IO.File(path);
using (Android.Content.Intent install = new Android.Content.Intent(Android.Content.Intent.ActionView))
{
Android.Net.Uri apkURI = AndroidX.Core.Content.FileProvider.GetUriForFile(context, context.ApplicationContext.PackageName + ".provider", file);
install.SetDataAndType(apkURI, "application/vnd.android.package-archive");
install.AddFlags(Android.Content.ActivityFlags.NewTask);
install.AddFlags(Android.Content.ActivityFlags.GrantReadUriPermission);
install.AddFlags(Android.Content.ActivityFlags.ClearTop);
install.PutExtra(Android.Content.Intent.ExtraNotUnknownSource, true);
Platform.CurrentActivity.StartActivity(install);
}
В AndroidManifext.xml я добавил:
<uses-permission android:name = "android.permission.INSTALL_PACKAGES" />
<uses-permission android:name = "android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name = "android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name = "android.permission.DELETE_PACKAGES" />
Это сложно. Вам понадобится много специфичного для платформы кода. И в зависимости от версии нужен разный код. Например, 24+ не позволяет использовать только URL-адрес файла, вам нужен поставщик файлов. Android 10 вы можете уйти с разрешением «использовать устаревшее хранилище». 11+, вам нужно разрешение, которое Google разрешает в своем магазине, только для определенного списка приложений. Также вам потребуется разрешение на установку apk. Каждая версия Android вносит изменения, что заставляет меня пройтись по этому коду и исправить его. Из соображений "безопасности".