MAUI: обновить собственное приложение (Android)

Как я могу проверить свое собственное приложение, если доступна более новая версия, а затем автоматически обновить себя? Идея состоит в том, чтобы запросить API для новой версии и получить файл apk. Затем следует сохранить APK и запустить установку/обновление. Я не знаю, как это создать. Запрос к API не имеет большого значения, но как я могу хранить и выполнять APK-файл на Android-устройстве?

Я нашел только это но было слишком много ошибок компиляции (Context, Java, Buld, Intent, FileProvider не удалось найти).

Не подскажете, как решить эту "проблему"?

СПАСИБО!

Это сложно. Вам понадобится много специфичного для платформы кода. И в зависимости от версии нужен разный код. Например, 24+ не позволяет использовать только URL-адрес файла, вам нужен поставщик файлов. Android 10 вы можете уйти с разрешением «использовать устаревшее хранилище». 11+, вам нужно разрешение, которое Google разрешает в своем магазине, только для определенного списка приложений. Также вам потребуется разрешение на установку apk. Каждая версия Android вносит изменения, что заставляет меня пройтись по этому коду и исправить его. Из соображений "безопасности".

H.A.H. 18.11.2022 16:15

Есть ли где-нибудь учебники для разработки этого? Где я могу найти пример кода для этого. Если понятно, какая настройка для какой версии андроида, то реализую. Но мне нужно знать, как это сделать :(

nicetomitja 21.11.2022 09:41

Вы проверяли официальный документ об обновлении в приложениях?

Liyun Zhang - MSFT 23.11.2022 10:57

@nicetomitja Учебники - нет. Найдите «программно установить APK» и объедините некоторые ответы. Предупреждаю еще раз - каждую версию мне приходится это немного подправлять. Возможно, это не лучший выбор для вашего приложения.

H.A.H. 24.11.2022 06:38

Спасибо @LiyunZhang-MSFT. Но альтернативы MAUI/.NET нет, это просто Java, не так ли?

nicetomitja 24.11.2022 12:54

@Х.А.Х. У тебя есть другие идеи? Как я могу сделать так, чтобы я мог запускать программное обеспечение на устройстве и обновлять себя, если есть новая версия. Как я могу представить это, если у меня установлен файл APK и я не публикую приложение в PlayStore?

nicetomitja 24.11.2022 12:54

Создайте серверное приложение .NET, которое будет служить вам хранилищем. Первый контроллер используется для ответа на текущую версию запрашиваемого вами приложения. Затем, если есть разница, спросите пользователя, хочет ли он загрузить новую версию. Получите zip-архив с apk и примечаниями к патчу. Показать примечания к патчу. И последнее - попросить пользователя установить новое приложение. Вот как я делаю вещи.

H.A.H. 25.11.2022 08:14

Вы можете проверить ответ об установке apk в своем приложении.

Liyun Zhang - MSFT 25.11.2022 10:24

Спасибо, @LiyunZhang-MSFT! Это именно то, что я искал. Я попробую это позже и вернусь, если это сработает, как ожидалось.

nicetomitja 28.11.2022 07:55

Это сработало для вас?

Liyun Zhang - MSFT 29.11.2022 06:16

@LiyunZhang-MSFT: я пытался реализовать, но в MAUI есть некоторые ошибки. Скриншот Метод "StartAcitivity" неизвестен и параметр Context & Autority должен быть установлен другим способом.

nicetomitja 30.11.2022 08:00

Вы поместили код в mainactivity?

Liyun Zhang - MSFT 30.11.2022 08:05

Дайте мне немного времени, я изменил код, чтобы теперь у меня не было ошибок компиляции.

nicetomitja 30.11.2022 08:17

Есть ли возможность избежать того факта, что пользователь должен разрешить «установить неизвестные приложения» из источника? Кроме того, у меня проблема, что я получаю сообщение «приложение не установлено». Я удалил приложение вручную, чем работает apk. Возможно, это потому, что я не увеличил номер версии? Или мне всегда нужно сначала удалить приложение, а затем переустановить его?

nicetomitja 30.11.2022 14:17

Это системный диалог, который используется для предотвращения ошибочного удаления. Когда вы устанавливаете на свое устройство то же самое приложение, которое имеет новую версию, вам необходимо сначала удалить старую версию.

Liyun Zhang - MSFT 01.12.2022 10:16

У вас есть идеи, как этого добиться (удаление приложения в приложении)?

nicetomitja 01.12.2022 12:07

Вы можете проверить эту ссылку, которая об удалении приложения в ней.

Liyun Zhang - MSFT 02.12.2022 04:12

Спасибо! Но опять ошибки компиляции в MAUI: Скриншот

nicetomitja 02.12.2022 10:34
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
1
18
214
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете удалить свое приложение с помощью следующего кода:

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" />

Другие вопросы по теме