找回密码
 立即注册
首页 业界区 业界 MAUI项目在Android平台通过U盘实现软件更新 ...

MAUI项目在Android平台通过U盘实现软件更新

诉称 昨天 22:05
需求

项目使用MAUI开发的用Android工控机进行相关功能的实现。作为操作设备的屏幕嵌入到仪器中,要使用串口操作实现对仪器的控制。想要实现在有软件更新时,可以通过U盘实现对软件的升级。
功能实现

这里需要使用到 FileProvider,在Android 7之后出于安全考虑不再支持content://URL 或file:///URL这种文件访问方式。在Platforms/Android中主要添加/修改下面两个文件:

  • file_paths.xml
  • AndroidMainfest.xml
1.png

在Platforms/Android/Resources下面新建xml文件夹,并添加 provider_paths.xml文件。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  3.         <root-path name="root" path="" />
  4.         <files-path name="files" path="" />
  5.         <cache-path name="cache" path="" />
  6.         <external-path name="camera_photos" path="" />
  7.         <external-files-path name="external_file_path" path="" />
  8.         <external-cache-path name="external_cache_path" path="" />
  9. </paths>
复制代码
修改Platforms/Android下面的AndroidManifest.xml文件,在application下添加provider,再添加一个安卓安装的权限

  • REQUEST_INSTALL_PACKAGES(安装应用)
  • WRITE_EXTERNAL_STORAGE(写入外部存储中的文件)
  • READ_EXTERNAL_STORAGE(读取外部存储中的文件)
AndroidManifest.xml文件内容如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  3.         <root-path name="root" path="" />
  4.         <files-path name="files" path="" />
  5.         <cache-path name="cache" path="" />
  6.         <external-path name="camera_photos" path="" />
  7.         <external-files-path name="external_file_path" path="" />
  8.         <external-cache-path name="external_cache_path" path="" />
  9. </paths><?xml version="1.0" encoding="utf-8"?>
  10. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  11.         <root-path name="root" path="" />
  12.         <files-path name="files" path="" />
  13.         <cache-path name="cache" path="" />
  14.         <external-path name="camera_photos" path="" />
  15.         <external-files-path name="external_file_path" path="" />
  16.         <external-cache-path name="external_cache_path" path="" />
  17. </paths>                    
复制代码
在MainPage页面添加一个按钮用于实现软件安装功能,简化了项目实现,没有采用MVVM模式,直接通过Clicked事件实现软件安装。
  1. [/code]按钮事件实现:
  2. [code]private async void OnCheckUpdateClicked(object? sender, EventArgs e)
  3. {
  4.         await CheckForUpdates();
  5. }
  6. private async Task CheckForUpdates()
  7. {
  8.         try
  9.         {
  10.                 UpdateBtn.IsEnabled = false;
  11.         await _updateService.InstallUpdateAsync();
  12.         }
  13.         catch (Exception ex)
  14.         {
  15.                 await DisplayAlertAsync("错误", $"异常: {ex.Message}", "确定");
  16.         }
  17.         finally
  18.         {
  19.                 UpdateBtn.IsEnabled = true;
  20.         }
  21. }
复制代码
更新服务实现:
  1. public class UpdateService
  2. {
  3.     public async Task InstallUpdateAsync()
  4.     {
  5.         // 调用平台特定的更新逻辑
  6.         await UpdateHandlerFactory.Create().InstallUpdateAsync();
  7.     }
  8. }
  9. public interface IUpdateHandler
  10. {
  11.     Task InstallUpdateAsync();
  12. }
  13. public static class UpdateHandlerFactory
  14. {
  15.     public static IUpdateHandler Create()
  16.     {
  17. #if ANDROID
  18.         return new MauiUpdateApp.Platforms.Android.UpdateHandler();
  19. #else
  20.         return new DefaultUpdateHandler();
  21. #endif
  22.     }
  23. }
  24. public class DefaultUpdateHandler : IUpdateHandler
  25. {
  26.     public async Task InstallUpdateAsync()
  27.     {
  28.         // 默认实现,非 Android 平台使用
  29.         if (App.Current?.MainPage != null)
  30.         {
  31.             await App.Current.MainPage.DisplayAlertAsync("更新", "此平台不支持自动更新", "确定");
  32.         }
  33.     }
  34. }
复制代码
实现Android平台的安装Apk功能:
  1. using Android.Content;
  2. using MauiUpdateApp.Services;
  3. using Android.App;
  4. namespace MauiUpdateApp.Platforms.Android;
  5. public class UpdateHandler : IUpdateHandler
  6. {
  7.     private static readonly HttpClient client = new HttpClient();
  8.    
  9.     public async Task InstallUpdateAsync()
  10.     {
  11.         try
  12.         {
  13.             var activity = Platform.CurrentActivity;
  14.             if (activity == null)
  15.             {
  16.                 if (App.Current?.MainPage != null)
  17.                 {
  18.                     await App.Current.MainPage.DisplayAlertAsync("错误", "无法获取当前活动", "确定");
  19.                 }
  20.                 return;
  21.             }
  22.             
  23.             PickOptions options = new() { PickerTitle = "Please select a comic file", };
  24.             var results = await FilePicker.Default.PickAsync(options);
  25.             if (results is null)
  26.             {
  27.                 return;
  28.             }
  29.             // 安装 APK
  30.             InstallApk(results.FullPath, activity);
  31.         }
  32.         catch (Exception ex)
  33.         {
  34.             // 处理错误
  35.             Console.WriteLine($"更新失败: {ex.Message}");
  36.             if (App.Current?.MainPage != null)
  37.             {
  38.                 await App.Current.MainPage.DisplayAlertAsync("错误", $"更新失败: {ex.Message}", "确定");
  39.             }
  40.         }
  41.     }
  42.    
  43.     private static void InstallApk(string apkPath, Activity? activity)
  44.     {
  45.         var file = new Java.IO.File(apkPath);
  46.         var uri = AndroidX.Core.Content.FileProvider.GetUriForFile(activity, $"{activity.PackageName}.fileprovider", file);
  47.         
  48.         var intent = new Intent(Intent.ActionView);
  49.         intent.SetDataAndType(uri, "application/vnd.android.package-archive");
  50.         intent.AddFlags(ActivityFlags.GrantReadUriPermission);
  51.         intent.AddFlags(ActivityFlags.NewTask);
  52.         
  53.         activity.StartActivity(intent);
  54.     }
  55. }
复制代码
以上为整个项目实现安装Apk的代码,想要获取源码的话,可以从
https://github.com/mzy666888/MauiUpdateApp中获取,欢迎给个Star
参考:https://www.cnblogs.com/MASA/p/16612541.html
出处:https://www.cnblogs.com/sesametech-netcore/本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册