制。想要实现在有软件更新时可以通过U盘实现对软件的升级。功能实现这里需要使用到 FileProvider在Android 7之后出于安全考虑不再支持content://URL 或file:///URL这种文件访问方式。在Platforms/Android中主要添加/修改下面两个文件file_paths.xmlAndroidMainfest.xml在Platforms/Android/Resources下面新建xml文件夹并添加provider_paths.xml文件。?xml version1.0 encodingutf-8?paths xmlns:androidhttp://schemas.android.com/apk/res/androidroot-path nameroot path /files-path namefiles path /cache-path namecache path /external-path namecamera_photos path /external-files-path nameexternal_file_path path /external-cache-path nameexternal_cache_path path //paths修改Platforms/Android下面的AndroidManifest.xml文件在application下添加provider再添加一个安卓安装的权限REQUEST_INSTALL_PACKAGES(安装应用)WRITE_EXTERNAL_STORAGE写入外部存储中的文件READ_EXTERNAL_STORAGE读取外部存储中的文件AndroidManifest.xml文件内容如下?xml version1.0 encodingutf-8?manifest xmlns:androidhttp://schemas.android.com/apk/res/androidapplication android:allowBackuptrue android:iconmipmap/appicon android:roundIconmipmap/appicon_round android:supportsRtltrueproviderandroid:nameandroidx.core.content.FileProviderandroid:authoritiescom.companyname.mauiupdateapp.fileproviderandroid:exportedfalseandroid:grantUriPermissionstruemeta-dataandroid:nameandroid.support.FILE_PROVIDER_PATHSandroid:resourcexml/file_paths //provider/applicationuses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE /uses-permission android:nameandroid.permission.INTERNET /uses-permission android:nameandroid.permission.REQUEST_INSTALL_PACKAGES /uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE /uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGE /uses-permission android:nameandroid.permission.MANAGE_EXTERNAL_STORAGE //manifest在MainPage页面添加一个按钮用于实现软件安装功能简化了项目实现没有采用MVVM模式直接通过Clicked事件实现软件安装。Buttonx:NameUpdateBtnClickedOnCheckUpdateClickedHorizontalOptionsFillText安装Apk /按钮事件实现private async void OnCheckUpdateClicked(object? sender, EventArgs e){await CheckForUpdates();}private async Task CheckForUpdates(){try{UpdateBtn.IsEnabled false;await _updateService.InstallUpdateAsync();}catch (Exception ex){await DisplayAlertAsync(错误, $异常: {ex.Message}, 确定);}finally{UpdateBtn.IsEnabled true;}}更新服务实现public class UpdateService{public async Task InstallUpdateAsync(){// 调用平台特定的更新逻辑await UpdateHandlerFactory.Create().InstallUpdateAsync();}}public interface IUpdateHandler{Task InstallUpdateAsync();}public static class UpdateHandlerFactory{public static IUpdateHandler Create(){#if ANDROIDreturn new MauiUpdateApp.Platforms.Android.UpdateHandler();#elsereturn new DefaultUpdateHandler();#endif}}public class DefaultUpdateHandler : IUpdateHandler{public async Task InstallUpdateAsync(){// 默认实现非 Android 平台使用if (App.Current?.MainPage ! null){await App.Current.MainPage.DisplayAlertAsync(更新, 此平台不支持自动更新, 确定);}}}实现Android平台的安装Apk功能using Android.Content;using MauiUpdateApp.Services;using Android.App;namespace MauiUpdateApp.Platforms.Android;public class UpdateHandler : IUpdateHandler{private static readonly HttpClient client new HttpClient();public async Task InstallUpdateAsync(){try{var activity Platform.CurrentActivity;if (activity null){if (App.Current?.MainPage ! null){await App.Current.MainPage.DisplayAlertAsync(错误, 无法获取当前活动, 确定);}return;}PickOptions options new() { PickerTitle Please select a comic file, };var results await FilePicker.Default.PickAsync(options);if (results is null){return;}// 安装 APKInstallApk(results.FullPath, activity);}catch (Exception ex){// 处理错误Console.WriteLine($更新失败: {ex.Message});if (App.Current?.MainPage ! null){await App.Current.MainPage.DisplayAlertAsync(错误, $更新失败: {ex.Message}, 确定);}}}private static void InstallApk(string apkPath, Activity? activity){var file new Java.IO.File(apkPath);var uri AndroidX.Core.Content.FileProvider.GetUriForFile(activity, ${activity.PackageName}.fileprovider, file);var intent new Intent(Intent.ActionView);intent.SetDataAndType(uri, application/vnd.android.package-archive);intent.AddFlags(ActivityFlags.GrantReadUriPermission);intent.AddFlags(ActivityFlags.NewTask);activity.StartActivity(intent);}}
MAUI项目在Android平台通过U盘实现软件更新
发布时间:2026/5/24 15:03:34
制。想要实现在有软件更新时可以通过U盘实现对软件的升级。功能实现这里需要使用到 FileProvider在Android 7之后出于安全考虑不再支持content://URL 或file:///URL这种文件访问方式。在Platforms/Android中主要添加/修改下面两个文件file_paths.xmlAndroidMainfest.xml在Platforms/Android/Resources下面新建xml文件夹并添加provider_paths.xml文件。?xml version1.0 encodingutf-8?paths xmlns:androidhttp://schemas.android.com/apk/res/androidroot-path nameroot path /files-path namefiles path /cache-path namecache path /external-path namecamera_photos path /external-files-path nameexternal_file_path path /external-cache-path nameexternal_cache_path path //paths修改Platforms/Android下面的AndroidManifest.xml文件在application下添加provider再添加一个安卓安装的权限REQUEST_INSTALL_PACKAGES(安装应用)WRITE_EXTERNAL_STORAGE写入外部存储中的文件READ_EXTERNAL_STORAGE读取外部存储中的文件AndroidManifest.xml文件内容如下?xml version1.0 encodingutf-8?manifest xmlns:androidhttp://schemas.android.com/apk/res/androidapplication android:allowBackuptrue android:iconmipmap/appicon android:roundIconmipmap/appicon_round android:supportsRtltrueproviderandroid:nameandroidx.core.content.FileProviderandroid:authoritiescom.companyname.mauiupdateapp.fileproviderandroid:exportedfalseandroid:grantUriPermissionstruemeta-dataandroid:nameandroid.support.FILE_PROVIDER_PATHSandroid:resourcexml/file_paths //provider/applicationuses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE /uses-permission android:nameandroid.permission.INTERNET /uses-permission android:nameandroid.permission.REQUEST_INSTALL_PACKAGES /uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE /uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGE /uses-permission android:nameandroid.permission.MANAGE_EXTERNAL_STORAGE //manifest在MainPage页面添加一个按钮用于实现软件安装功能简化了项目实现没有采用MVVM模式直接通过Clicked事件实现软件安装。Buttonx:NameUpdateBtnClickedOnCheckUpdateClickedHorizontalOptionsFillText安装Apk /按钮事件实现private async void OnCheckUpdateClicked(object? sender, EventArgs e){await CheckForUpdates();}private async Task CheckForUpdates(){try{UpdateBtn.IsEnabled false;await _updateService.InstallUpdateAsync();}catch (Exception ex){await DisplayAlertAsync(错误, $异常: {ex.Message}, 确定);}finally{UpdateBtn.IsEnabled true;}}更新服务实现public class UpdateService{public async Task InstallUpdateAsync(){// 调用平台特定的更新逻辑await UpdateHandlerFactory.Create().InstallUpdateAsync();}}public interface IUpdateHandler{Task InstallUpdateAsync();}public static class UpdateHandlerFactory{public static IUpdateHandler Create(){#if ANDROIDreturn new MauiUpdateApp.Platforms.Android.UpdateHandler();#elsereturn new DefaultUpdateHandler();#endif}}public class DefaultUpdateHandler : IUpdateHandler{public async Task InstallUpdateAsync(){// 默认实现非 Android 平台使用if (App.Current?.MainPage ! null){await App.Current.MainPage.DisplayAlertAsync(更新, 此平台不支持自动更新, 确定);}}}实现Android平台的安装Apk功能using Android.Content;using MauiUpdateApp.Services;using Android.App;namespace MauiUpdateApp.Platforms.Android;public class UpdateHandler : IUpdateHandler{private static readonly HttpClient client new HttpClient();public async Task InstallUpdateAsync(){try{var activity Platform.CurrentActivity;if (activity null){if (App.Current?.MainPage ! null){await App.Current.MainPage.DisplayAlertAsync(错误, 无法获取当前活动, 确定);}return;}PickOptions options new() { PickerTitle Please select a comic file, };var results await FilePicker.Default.PickAsync(options);if (results is null){return;}// 安装 APKInstallApk(results.FullPath, activity);}catch (Exception ex){// 处理错误Console.WriteLine($更新失败: {ex.Message});if (App.Current?.MainPage ! null){await App.Current.MainPage.DisplayAlertAsync(错误, $更新失败: {ex.Message}, 确定);}}}private static void InstallApk(string apkPath, Activity? activity){var file new Java.IO.File(apkPath);var uri AndroidX.Core.Content.FileProvider.GetUriForFile(activity, ${activity.PackageName}.fileprovider, file);var intent new Intent(Intent.ActionView);intent.SetDataAndType(uri, application/vnd.android.package-archive);intent.AddFlags(ActivityFlags.GrantReadUriPermission);intent.AddFlags(ActivityFlags.NewTask);activity.StartActivity(intent);}}