找回密码
 立即注册
首页 业界区 业界 Flutter应用自动更新系统:生产环境的挑战与解决方案 ...

Flutter应用自动更新系统:生产环境的挑战与解决方案

靳谷雪 2025-9-20 07:26:29
Flutter应用自动更新系统:生产环境的挑战与解决方案

本文基于BeeCount(蜜蜂记账)项目的实际开发经验,深入探讨Android应用自动更新的完整实现,包括GitHub Releases集成、APK安装、R8混淆问题处理等核心技术难点。
项目背景

BeeCount(蜜蜂记账)是一款开源、简洁、无广告的个人记账应用。所有财务数据完全由用户掌控,支持本地存储和可选的云端同步,确保数据绝对安全。
引言

在移动应用开发中,自动更新功能是提升用户体验的重要环节。对于独立开发者而言,如何在没有应用商店分发渠道的情况下,构建一套可靠的应用更新机制,是一个充满挑战的技术问题。BeeCount通过GitHub Releases + 自动更新的方式,为用户提供了便捷的版本升级体验,但在实践中遇到了诸多技术难点,特别是生产环境下的R8代码混淆问题。
更新系统架构

整体架构设计
  1. ┌─────────────────┐<provider
  2.     android:name="androidx.core.content.FileProvider"
  3.     android:authorities="${applicationId}.fileprovider"
  4.     android:exported="false"
  5.     android:grantUriPermissions="true">
  6.     <meta-data
  7.         android:name="android.support.FILE_PROVIDER_PATHS"
  8.         android:resource="@xml/file_paths" />
  9. </provider>┌──────────────────┐<provider
  10.     android:name="androidx.core.content.FileProvider"
  11.     android:authorities="${applicationId}.fileprovider"
  12.     android:exported="false"
  13.     android:grantUriPermissions="true">
  14.     <meta-data
  15.         android:name="android.support.FILE_PROVIDER_PATHS"
  16.         android:resource="@xml/file_paths" />
  17. </provider>┌─────────────────┐
  18. │   Flutter App   │<provider
  19.     android:name="androidx.core.content.FileProvider"
  20.     android:authorities="${applicationId}.fileprovider"
  21.     android:exported="false"
  22.     android:grantUriPermissions="true">
  23.     <meta-data
  24.         android:name="android.support.FILE_PROVIDER_PATHS"
  25.         android:resource="@xml/file_paths" />
  26. </provider>│   GitHub API<provider
  27.     android:name="androidx.core.content.FileProvider"
  28.     android:authorities="${applicationId}.fileprovider"
  29.     android:exported="false"
  30.     android:grantUriPermissions="true">
  31.     <meta-data
  32.         android:name="android.support.FILE_PROVIDER_PATHS"
  33.         android:resource="@xml/file_paths" />
  34. </provider> │<provider
  35.     android:name="androidx.core.content.FileProvider"
  36.     android:authorities="${applicationId}.fileprovider"
  37.     android:exported="false"
  38.     android:grantUriPermissions="true">
  39.     <meta-data
  40.         android:name="android.support.FILE_PROVIDER_PATHS"
  41.         android:resource="@xml/file_paths" />
  42. </provider>│   APK Storage   │
  43. │   (Update UI)   │◄──►│   (Releases)<provider
  44.     android:name="androidx.core.content.FileProvider"
  45.     android:authorities="${applicationId}.fileprovider"
  46.     android:exported="false"
  47.     android:grantUriPermissions="true">
  48.     <meta-data
  49.         android:name="android.support.FILE_PROVIDER_PATHS"
  50.         android:resource="@xml/file_paths" />
  51. </provider> │◄──►│   (Assets)<provider
  52.     android:name="androidx.core.content.FileProvider"
  53.     android:authorities="${applicationId}.fileprovider"
  54.     android:exported="false"
  55.     android:grantUriPermissions="true">
  56.     <meta-data
  57.         android:name="android.support.FILE_PROVIDER_PATHS"
  58.         android:resource="@xml/file_paths" />
  59. </provider>  │
  60. │<provider
  61.     android:name="androidx.core.content.FileProvider"
  62.     android:authorities="${applicationId}.fileprovider"
  63.     android:exported="false"
  64.     android:grantUriPermissions="true">
  65.     <meta-data
  66.         android:name="android.support.FILE_PROVIDER_PATHS"
  67.         android:resource="@xml/file_paths" />
  68. </provider><provider
  69.     android:name="androidx.core.content.FileProvider"
  70.     android:authorities="${applicationId}.fileprovider"
  71.     android:exported="false"
  72.     android:grantUriPermissions="true">
  73.     <meta-data
  74.         android:name="android.support.FILE_PROVIDER_PATHS"
  75.         android:resource="@xml/file_paths" />
  76. </provider><provider
  77.     android:name="androidx.core.content.FileProvider"
  78.     android:authorities="${applicationId}.fileprovider"
  79.     android:exported="false"
  80.     android:grantUriPermissions="true">
  81.     <meta-data
  82.         android:name="android.support.FILE_PROVIDER_PATHS"
  83.         android:resource="@xml/file_paths" />
  84. </provider><provider
  85.     android:name="androidx.core.content.FileProvider"
  86.     android:authorities="${applicationId}.fileprovider"
  87.     android:exported="false"
  88.     android:grantUriPermissions="true">
  89.     <meta-data
  90.         android:name="android.support.FILE_PROVIDER_PATHS"
  91.         android:resource="@xml/file_paths" />
  92. </provider> │<provider
  93.     android:name="androidx.core.content.FileProvider"
  94.     android:authorities="${applicationId}.fileprovider"
  95.     android:exported="false"
  96.     android:grantUriPermissions="true">
  97.     <meta-data
  98.         android:name="android.support.FILE_PROVIDER_PATHS"
  99.         android:resource="@xml/file_paths" />
  100. </provider>│<provider
  101.     android:name="androidx.core.content.FileProvider"
  102.     android:authorities="${applicationId}.fileprovider"
  103.     android:exported="false"
  104.     android:grantUriPermissions="true">
  105.     <meta-data
  106.         android:name="android.support.FILE_PROVIDER_PATHS"
  107.         android:resource="@xml/file_paths" />
  108. </provider><provider
  109.     android:name="androidx.core.content.FileProvider"
  110.     android:authorities="${applicationId}.fileprovider"
  111.     android:exported="false"
  112.     android:grantUriPermissions="true">
  113.     <meta-data
  114.         android:name="android.support.FILE_PROVIDER_PATHS"
  115.         android:resource="@xml/file_paths" />
  116. </provider><provider
  117.     android:name="androidx.core.content.FileProvider"
  118.     android:authorities="${applicationId}.fileprovider"
  119.     android:exported="false"
  120.     android:grantUriPermissions="true">
  121.     <meta-data
  122.         android:name="android.support.FILE_PROVIDER_PATHS"
  123.         android:resource="@xml/file_paths" />
  124. </provider><provider
  125.     android:name="androidx.core.content.FileProvider"
  126.     android:authorities="${applicationId}.fileprovider"
  127.     android:exported="false"
  128.     android:grantUriPermissions="true">
  129.     <meta-data
  130.         android:name="android.support.FILE_PROVIDER_PATHS"
  131.         android:resource="@xml/file_paths" />
  132. </provider>  │<provider
  133.     android:name="androidx.core.content.FileProvider"
  134.     android:authorities="${applicationId}.fileprovider"
  135.     android:exported="false"
  136.     android:grantUriPermissions="true">
  137.     <meta-data
  138.         android:name="android.support.FILE_PROVIDER_PATHS"
  139.         android:resource="@xml/file_paths" />
  140. </provider>│<provider
  141.     android:name="androidx.core.content.FileProvider"
  142.     android:authorities="${applicationId}.fileprovider"
  143.     android:exported="false"
  144.     android:grantUriPermissions="true">
  145.     <meta-data
  146.         android:name="android.support.FILE_PROVIDER_PATHS"
  147.         android:resource="@xml/file_paths" />
  148. </provider><provider
  149.     android:name="androidx.core.content.FileProvider"
  150.     android:authorities="${applicationId}.fileprovider"
  151.     android:exported="false"
  152.     android:grantUriPermissions="true">
  153.     <meta-data
  154.         android:name="android.support.FILE_PROVIDER_PATHS"
  155.         android:resource="@xml/file_paths" />
  156. </provider><provider
  157.     android:name="androidx.core.content.FileProvider"
  158.     android:authorities="${applicationId}.fileprovider"
  159.     android:exported="false"
  160.     android:grantUriPermissions="true">
  161.     <meta-data
  162.         android:name="android.support.FILE_PROVIDER_PATHS"
  163.         android:resource="@xml/file_paths" />
  164. </provider><provider
  165.     android:name="androidx.core.content.FileProvider"
  166.     android:authorities="${applicationId}.fileprovider"
  167.     android:exported="false"
  168.     android:grantUriPermissions="true">
  169.     <meta-data
  170.         android:name="android.support.FILE_PROVIDER_PATHS"
  171.         android:resource="@xml/file_paths" />
  172. </provider> │
  173. └─────────────────┘<provider
  174.     android:name="androidx.core.content.FileProvider"
  175.     android:authorities="${applicationId}.fileprovider"
  176.     android:exported="false"
  177.     android:grantUriPermissions="true">
  178.     <meta-data
  179.         android:name="android.support.FILE_PROVIDER_PATHS"
  180.         android:resource="@xml/file_paths" />
  181. </provider>└──────────────────┘<provider
  182.     android:name="androidx.core.content.FileProvider"
  183.     android:authorities="${applicationId}.fileprovider"
  184.     android:exported="false"
  185.     android:grantUriPermissions="true">
  186.     <meta-data
  187.         android:name="android.support.FILE_PROVIDER_PATHS"
  188.         android:resource="@xml/file_paths" />
  189. </provider>└─────────────────┘
  190. <provider
  191.     android:name="androidx.core.content.FileProvider"
  192.     android:authorities="${applicationId}.fileprovider"
  193.     android:exported="false"
  194.     android:grantUriPermissions="true">
  195.     <meta-data
  196.         android:name="android.support.FILE_PROVIDER_PATHS"
  197.         android:resource="@xml/file_paths" />
  198. </provider><provider
  199.     android:name="androidx.core.content.FileProvider"
  200.     android:authorities="${applicationId}.fileprovider"
  201.     android:exported="false"
  202.     android:grantUriPermissions="true">
  203.     <meta-data
  204.         android:name="android.support.FILE_PROVIDER_PATHS"
  205.         android:resource="@xml/file_paths" />
  206. </provider> │<provider
  207.     android:name="androidx.core.content.FileProvider"
  208.     android:authorities="${applicationId}.fileprovider"
  209.     android:exported="false"
  210.     android:grantUriPermissions="true">
  211.     <meta-data
  212.         android:name="android.support.FILE_PROVIDER_PATHS"
  213.         android:resource="@xml/file_paths" />
  214. </provider><provider
  215.     android:name="androidx.core.content.FileProvider"
  216.     android:authorities="${applicationId}.fileprovider"
  217.     android:exported="false"
  218.     android:grantUriPermissions="true">
  219.     <meta-data
  220.         android:name="android.support.FILE_PROVIDER_PATHS"
  221.         android:resource="@xml/file_paths" />
  222. </provider><provider
  223.     android:name="androidx.core.content.FileProvider"
  224.     android:authorities="${applicationId}.fileprovider"
  225.     android:exported="false"
  226.     android:grantUriPermissions="true">
  227.     <meta-data
  228.         android:name="android.support.FILE_PROVIDER_PATHS"
  229.         android:resource="@xml/file_paths" />
  230. </provider><provider
  231.     android:name="androidx.core.content.FileProvider"
  232.     android:authorities="${applicationId}.fileprovider"
  233.     android:exported="false"
  234.     android:grantUriPermissions="true">
  235.     <meta-data
  236.         android:name="android.support.FILE_PROVIDER_PATHS"
  237.         android:resource="@xml/file_paths" />
  238. </provider><provider
  239.     android:name="androidx.core.content.FileProvider"
  240.     android:authorities="${applicationId}.fileprovider"
  241.     android:exported="false"
  242.     android:grantUriPermissions="true">
  243.     <meta-data
  244.         android:name="android.support.FILE_PROVIDER_PATHS"
  245.         android:resource="@xml/file_paths" />
  246. </provider>   │<provider
  247.     android:name="androidx.core.content.FileProvider"
  248.     android:authorities="${applicationId}.fileprovider"
  249.     android:exported="false"
  250.     android:grantUriPermissions="true">
  251.     <meta-data
  252.         android:name="android.support.FILE_PROVIDER_PATHS"
  253.         android:resource="@xml/file_paths" />
  254. </provider><provider
  255.     android:name="androidx.core.content.FileProvider"
  256.     android:authorities="${applicationId}.fileprovider"
  257.     android:exported="false"
  258.     android:grantUriPermissions="true">
  259.     <meta-data
  260.         android:name="android.support.FILE_PROVIDER_PATHS"
  261.         android:resource="@xml/file_paths" />
  262. </provider><provider
  263.     android:name="androidx.core.content.FileProvider"
  264.     android:authorities="${applicationId}.fileprovider"
  265.     android:exported="false"
  266.     android:grantUriPermissions="true">
  267.     <meta-data
  268.         android:name="android.support.FILE_PROVIDER_PATHS"
  269.         android:resource="@xml/file_paths" />
  270. </provider><provider
  271.     android:name="androidx.core.content.FileProvider"
  272.     android:authorities="${applicationId}.fileprovider"
  273.     android:exported="false"
  274.     android:grantUriPermissions="true">
  275.     <meta-data
  276.         android:name="android.support.FILE_PROVIDER_PATHS"
  277.         android:resource="@xml/file_paths" />
  278. </provider><provider
  279.     android:name="androidx.core.content.FileProvider"
  280.     android:authorities="${applicationId}.fileprovider"
  281.     android:exported="false"
  282.     android:grantUriPermissions="true">
  283.     <meta-data
  284.         android:name="android.support.FILE_PROVIDER_PATHS"
  285.         android:resource="@xml/file_paths" />
  286. </provider>   │
  287. <provider
  288.     android:name="androidx.core.content.FileProvider"
  289.     android:authorities="${applicationId}.fileprovider"
  290.     android:exported="false"
  291.     android:grantUriPermissions="true">
  292.     <meta-data
  293.         android:name="android.support.FILE_PROVIDER_PATHS"
  294.         android:resource="@xml/file_paths" />
  295. </provider><provider
  296.     android:name="androidx.core.content.FileProvider"
  297.     android:authorities="${applicationId}.fileprovider"
  298.     android:exported="false"
  299.     android:grantUriPermissions="true">
  300.     <meta-data
  301.         android:name="android.support.FILE_PROVIDER_PATHS"
  302.         android:resource="@xml/file_paths" />
  303. </provider> └───── 版本检查 ─────────┼───── APK下载 ────────┘
  304. <?xml version="1.0" encoding="utf-8"?>
  305. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  306. <provider
  307.     android:name="androidx.core.content.FileProvider"
  308.     android:authorities="${applicationId}.fileprovider"
  309.     android:exported="false"
  310.     android:grantUriPermissions="true">
  311.     <meta-data
  312.         android:name="android.support.FILE_PROVIDER_PATHS"
  313.         android:resource="@xml/file_paths" />
  314. </provider>
  315. <provider
  316.     android:name="androidx.core.content.FileProvider"
  317.     android:authorities="${applicationId}.fileprovider"
  318.     android:exported="false"
  319.     android:grantUriPermissions="true">
  320.     <meta-data
  321.         android:name="android.support.FILE_PROVIDER_PATHS"
  322.         android:resource="@xml/file_paths" />
  323. </provider><cache-path name="apk_cache" path="apk/" />
  324. <provider
  325.     android:name="androidx.core.content.FileProvider"
  326.     android:authorities="${applicationId}.fileprovider"
  327.     android:exported="false"
  328.     android:grantUriPermissions="true">
  329.     <meta-data
  330.         android:name="android.support.FILE_PROVIDER_PATHS"
  331.         android:resource="@xml/file_paths" />
  332. </provider>
  333. <provider
  334.     android:name="androidx.core.content.FileProvider"
  335.     android:authorities="${applicationId}.fileprovider"
  336.     android:exported="false"
  337.     android:grantUriPermissions="true">
  338.     <meta-data
  339.         android:name="android.support.FILE_PROVIDER_PATHS"
  340.         android:resource="@xml/file_paths" />
  341. </provider><cache-path name="all_cache" path="." />
  342. <provider
  343.     android:name="androidx.core.content.FileProvider"
  344.     android:authorities="${applicationId}.fileprovider"
  345.     android:exported="false"
  346.     android:grantUriPermissions="true">
  347.     <meta-data
  348.         android:name="android.support.FILE_PROVIDER_PATHS"
  349.         android:resource="@xml/file_paths" />
  350. </provider>
  351. <provider
  352.     android:name="androidx.core.content.FileProvider"
  353.     android:authorities="${applicationId}.fileprovider"
  354.     android:exported="false"
  355.     android:grantUriPermissions="true">
  356.     <meta-data
  357.         android:name="android.support.FILE_PROVIDER_PATHS"
  358.         android:resource="@xml/file_paths" />
  359. </provider><external-files-path name="external_app_files" path="." />
  360. </paths><provider
  361.     android:name="androidx.core.content.FileProvider"
  362.     android:authorities="${applicationId}.fileprovider"
  363.     android:exported="false"
  364.     android:grantUriPermissions="true">
  365.     <meta-data
  366.         android:name="android.support.FILE_PROVIDER_PATHS"
  367.         android:resource="@xml/file_paths" />
  368. </provider><provider
  369.     android:name="androidx.core.content.FileProvider"
  370.     android:authorities="${applicationId}.fileprovider"
  371.     android:exported="false"
  372.     android:grantUriPermissions="true">
  373.     <meta-data
  374.         android:name="android.support.FILE_PROVIDER_PATHS"
  375.         android:resource="@xml/file_paths" />
  376. </provider>│
  377. <provider
  378.     android:name="androidx.core.content.FileProvider"
  379.     android:authorities="${applicationId}.fileprovider"
  380.     android:exported="false"
  381.     android:grantUriPermissions="true">
  382.     <meta-data
  383.         android:name="android.support.FILE_PROVIDER_PATHS"
  384.         android:resource="@xml/file_paths" />
  385. </provider><provider
  386.     android:name="androidx.core.content.FileProvider"
  387.     android:authorities="${applicationId}.fileprovider"
  388.     android:exported="false"
  389.     android:grantUriPermissions="true">
  390.     <meta-data
  391.         android:name="android.support.FILE_PROVIDER_PATHS"
  392.         android:resource="@xml/file_paths" />
  393. </provider><provider
  394.     android:name="androidx.core.content.FileProvider"
  395.     android:authorities="${applicationId}.fileprovider"
  396.     android:exported="false"
  397.     android:grantUriPermissions="true">
  398.     <meta-data
  399.         android:name="android.support.FILE_PROVIDER_PATHS"
  400.         android:resource="@xml/file_paths" />
  401. </provider><provider
  402.     android:name="androidx.core.content.FileProvider"
  403.     android:authorities="${applicationId}.fileprovider"
  404.     android:exported="false"
  405.     android:grantUriPermissions="true">
  406.     <meta-data
  407.         android:name="android.support.FILE_PROVIDER_PATHS"
  408.         android:resource="@xml/file_paths" />
  409. </provider><provider
  410.     android:name="androidx.core.content.FileProvider"
  411.     android:authorities="${applicationId}.fileprovider"
  412.     android:exported="false"
  413.     android:grantUriPermissions="true">
  414.     <meta-data
  415.         android:name="android.support.FILE_PROVIDER_PATHS"
  416.         android:resource="@xml/file_paths" />
  417. </provider>┌──────────────────┐
  418. <provider
  419.     android:name="androidx.core.content.FileProvider"
  420.     android:authorities="${applicationId}.fileprovider"
  421.     android:exported="false"
  422.     android:grantUriPermissions="true">
  423.     <meta-data
  424.         android:name="android.support.FILE_PROVIDER_PATHS"
  425.         android:resource="@xml/file_paths" />
  426. </provider><provider
  427.     android:name="androidx.core.content.FileProvider"
  428.     android:authorities="${applicationId}.fileprovider"
  429.     android:exported="false"
  430.     android:grantUriPermissions="true">
  431.     <meta-data
  432.         android:name="android.support.FILE_PROVIDER_PATHS"
  433.         android:resource="@xml/file_paths" />
  434. </provider><provider
  435.     android:name="androidx.core.content.FileProvider"
  436.     android:authorities="${applicationId}.fileprovider"
  437.     android:exported="false"
  438.     android:grantUriPermissions="true">
  439.     <meta-data
  440.         android:name="android.support.FILE_PROVIDER_PATHS"
  441.         android:resource="@xml/file_paths" />
  442. </provider><provider
  443.     android:name="androidx.core.content.FileProvider"
  444.     android:authorities="${applicationId}.fileprovider"
  445.     android:exported="false"
  446.     android:grantUriPermissions="true">
  447.     <meta-data
  448.         android:name="android.support.FILE_PROVIDER_PATHS"
  449.         android:resource="@xml/file_paths" />
  450. </provider><provider
  451.     android:name="androidx.core.content.FileProvider"
  452.     android:authorities="${applicationId}.fileprovider"
  453.     android:exported="false"
  454.     android:grantUriPermissions="true">
  455.     <meta-data
  456.         android:name="android.support.FILE_PROVIDER_PATHS"
  457.         android:resource="@xml/file_paths" />
  458. </provider>│   FileProvider   │
  459. <provider
  460.     android:name="androidx.core.content.FileProvider"
  461.     android:authorities="${applicationId}.fileprovider"
  462.     android:exported="false"
  463.     android:grantUriPermissions="true">
  464.     <meta-data
  465.         android:name="android.support.FILE_PROVIDER_PATHS"
  466.         android:resource="@xml/file_paths" />
  467. </provider><provider
  468.     android:name="androidx.core.content.FileProvider"
  469.     android:authorities="${applicationId}.fileprovider"
  470.     android:exported="false"
  471.     android:grantUriPermissions="true">
  472.     <meta-data
  473.         android:name="android.support.FILE_PROVIDER_PATHS"
  474.         android:resource="@xml/file_paths" />
  475. </provider><provider
  476.     android:name="androidx.core.content.FileProvider"
  477.     android:authorities="${applicationId}.fileprovider"
  478.     android:exported="false"
  479.     android:grantUriPermissions="true">
  480.     <meta-data
  481.         android:name="android.support.FILE_PROVIDER_PATHS"
  482.         android:resource="@xml/file_paths" />
  483. </provider><provider
  484.     android:name="androidx.core.content.FileProvider"
  485.     android:authorities="${applicationId}.fileprovider"
  486.     android:exported="false"
  487.     android:grantUriPermissions="true">
  488.     <meta-data
  489.         android:name="android.support.FILE_PROVIDER_PATHS"
  490.         android:resource="@xml/file_paths" />
  491. </provider><provider
  492.     android:name="androidx.core.content.FileProvider"
  493.     android:authorities="${applicationId}.fileprovider"
  494.     android:exported="false"
  495.     android:grantUriPermissions="true">
  496.     <meta-data
  497.         android:name="android.support.FILE_PROVIDER_PATHS"
  498.         android:resource="@xml/file_paths" />
  499. </provider>│   (APK安装)<provider
  500.     android:name="androidx.core.content.FileProvider"
  501.     android:authorities="${applicationId}.fileprovider"
  502.     android:exported="false"
  503.     android:grantUriPermissions="true">
  504.     <meta-data
  505.         android:name="android.support.FILE_PROVIDER_PATHS"
  506.         android:resource="@xml/file_paths" />
  507. </provider>  │
  508. <provider
  509.     android:name="androidx.core.content.FileProvider"
  510.     android:authorities="${applicationId}.fileprovider"
  511.     android:exported="false"
  512.     android:grantUriPermissions="true">
  513.     <meta-data
  514.         android:name="android.support.FILE_PROVIDER_PATHS"
  515.         android:resource="@xml/file_paths" />
  516. </provider><provider
  517.     android:name="androidx.core.content.FileProvider"
  518.     android:authorities="${applicationId}.fileprovider"
  519.     android:exported="false"
  520.     android:grantUriPermissions="true">
  521.     <meta-data
  522.         android:name="android.support.FILE_PROVIDER_PATHS"
  523.         android:resource="@xml/file_paths" />
  524. </provider><provider
  525.     android:name="androidx.core.content.FileProvider"
  526.     android:authorities="${applicationId}.fileprovider"
  527.     android:exported="false"
  528.     android:grantUriPermissions="true">
  529.     <meta-data
  530.         android:name="android.support.FILE_PROVIDER_PATHS"
  531.         android:resource="@xml/file_paths" />
  532. </provider><provider
  533.     android:name="androidx.core.content.FileProvider"
  534.     android:authorities="${applicationId}.fileprovider"
  535.     android:exported="false"
  536.     android:grantUriPermissions="true">
  537.     <meta-data
  538.         android:name="android.support.FILE_PROVIDER_PATHS"
  539.         android:resource="@xml/file_paths" />
  540. </provider><provider
  541.     android:name="androidx.core.content.FileProvider"
  542.     android:authorities="${applicationId}.fileprovider"
  543.     android:exported="false"
  544.     android:grantUriPermissions="true">
  545.     <meta-data
  546.         android:name="android.support.FILE_PROVIDER_PATHS"
  547.         android:resource="@xml/file_paths" />
  548. </provider>└──────────────────┘
复制代码
核心设计原则


  • 版本检查智能化:自动对比本地与远程版本
  • 下载体验优化:带进度条的后台下载
  • 缓存机制:避免重复下载相同版本
  • 安装流程简化:一键式更新体验
  • 错误处理完善:网络异常、权限问题等场景处理
  • 生产环境适配:R8混淆兼容性处理
更新服务核心实现

服务接口定义
  1. abstract class UpdateService {
  2.   /// 检查更新
  3.   static Future<UpdateResult> checkUpdate();
  4.   /// 下载并安装更新
  5.   static Future<UpdateResult> downloadAndInstallUpdate(
  6. <provider
  7.     android:name="androidx.core.content.FileProvider"
  8.     android:authorities="${applicationId}.fileprovider"
  9.     android:exported="false"
  10.     android:grantUriPermissions="true">
  11.     <meta-data
  12.         android:name="android.support.FILE_PROVIDER_PATHS"
  13.         android:resource="@xml/file_paths" />
  14. </provider>BuildContext context,
  15. <provider
  16.     android:name="androidx.core.content.FileProvider"
  17.     android:authorities="${applicationId}.fileprovider"
  18.     android:exported="false"
  19.     android:grantUriPermissions="true">
  20.     <meta-data
  21.         android:name="android.support.FILE_PROVIDER_PATHS"
  22.         android:resource="@xml/file_paths" />
  23. </provider>String downloadUrl, {
  24. <provider
  25.     android:name="androidx.core.content.FileProvider"
  26.     android:authorities="${applicationId}.fileprovider"
  27.     android:exported="false"
  28.     android:grantUriPermissions="true">
  29.     <meta-data
  30.         android:name="android.support.FILE_PROVIDER_PATHS"
  31.         android:resource="@xml/file_paths" />
  32. </provider>Function(double progress, String status)? onProgress,
  33.   });
  34.   /// 显示更新对话框
  35.   static Future<void> showUpdateDialog(
  36. <provider
  37.     android:name="androidx.core.content.FileProvider"
  38.     android:authorities="${applicationId}.fileprovider"
  39.     android:exported="false"
  40.     android:grantUriPermissions="true">
  41.     <meta-data
  42.         android:name="android.support.FILE_PROVIDER_PATHS"
  43.         android:resource="@xml/file_paths" />
  44. </provider>BuildContext context, {
  45. <provider
  46.     android:name="androidx.core.content.FileProvider"
  47.     android:authorities="${applicationId}.fileprovider"
  48.     android:exported="false"
  49.     android:grantUriPermissions="true">
  50.     <meta-data
  51.         android:name="android.support.FILE_PROVIDER_PATHS"
  52.         android:resource="@xml/file_paths" />
  53. </provider>required bool isForced,
  54. <provider
  55.     android:name="androidx.core.content.FileProvider"
  56.     android:authorities="${applicationId}.fileprovider"
  57.     android:exported="false"
  58.     android:grantUriPermissions="true">
  59.     <meta-data
  60.         android:name="android.support.FILE_PROVIDER_PATHS"
  61.         android:resource="@xml/file_paths" />
  62. </provider>VoidCallback? onLaterPressed,
  63. <provider
  64.     android:name="androidx.core.content.FileProvider"
  65.     android:authorities="${applicationId}.fileprovider"
  66.     android:exported="false"
  67.     android:grantUriPermissions="true">
  68.     <meta-data
  69.         android:name="android.support.FILE_PROVIDER_PATHS"
  70.         android:resource="@xml/file_paths" />
  71. </provider>Function(double progress, String status)? onProgress,
  72.   });
  73.   /// 静默检查更新
  74.   static Future<void> silentCheckForUpdates(BuildContext context);
  75. }
复制代码
版本检查实现
  1. class UpdateService {
  2.   static final Dio _dio = Dio();
  3.   static const String _cachedApkPathKey = 'cached_apk_path';
  4.   static const String _cachedApkVersionKey = 'cached_apk_version';
  5.   /// 生成随机User-Agent,避免被GitHub限制
  6.   static String _generateRandomUserAgent() {
  7. <provider
  8.     android:name="androidx.core.content.FileProvider"
  9.     android:authorities="${applicationId}.fileprovider"
  10.     android:exported="false"
  11.     android:grantUriPermissions="true">
  12.     <meta-data
  13.         android:name="android.support.FILE_PROVIDER_PATHS"
  14.         android:resource="@xml/file_paths" />
  15. </provider>final userAgents = [
  16. <provider
  17.     android:name="androidx.core.content.FileProvider"
  18.     android:authorities="${applicationId}.fileprovider"
  19.     android:exported="false"
  20.     android:grantUriPermissions="true">
  21.     <meta-data
  22.         android:name="android.support.FILE_PROVIDER_PATHS"
  23.         android:resource="@xml/file_paths" />
  24. </provider>  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
  25. <provider
  26.     android:name="androidx.core.content.FileProvider"
  27.     android:authorities="${applicationId}.fileprovider"
  28.     android:exported="false"
  29.     android:grantUriPermissions="true">
  30.     <meta-data
  31.         android:name="android.support.FILE_PROVIDER_PATHS"
  32.         android:resource="@xml/file_paths" />
  33. </provider>  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
  34. <provider
  35.     android:name="androidx.core.content.FileProvider"
  36.     android:authorities="${applicationId}.fileprovider"
  37.     android:exported="false"
  38.     android:grantUriPermissions="true">
  39.     <meta-data
  40.         android:name="android.support.FILE_PROVIDER_PATHS"
  41.         android:resource="@xml/file_paths" />
  42. </provider>  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
  43. <provider
  44.     android:name="androidx.core.content.FileProvider"
  45.     android:authorities="${applicationId}.fileprovider"
  46.     android:exported="false"
  47.     android:grantUriPermissions="true">
  48.     <meta-data
  49.         android:name="android.support.FILE_PROVIDER_PATHS"
  50.         android:resource="@xml/file_paths" />
  51. </provider>  // ... 更多User-Agent
  52. <provider
  53.     android:name="androidx.core.content.FileProvider"
  54.     android:authorities="${applicationId}.fileprovider"
  55.     android:exported="false"
  56.     android:grantUriPermissions="true">
  57.     <meta-data
  58.         android:name="android.support.FILE_PROVIDER_PATHS"
  59.         android:resource="@xml/file_paths" />
  60. </provider>];
  61. <provider
  62.     android:name="androidx.core.content.FileProvider"
  63.     android:authorities="${applicationId}.fileprovider"
  64.     android:exported="false"
  65.     android:grantUriPermissions="true">
  66.     <meta-data
  67.         android:name="android.support.FILE_PROVIDER_PATHS"
  68.         android:resource="@xml/file_paths" />
  69. </provider>final random = (DateTime.now().millisecondsSinceEpoch % userAgents.length);
  70. <provider
  71.     android:name="androidx.core.content.FileProvider"
  72.     android:authorities="${applicationId}.fileprovider"
  73.     android:exported="false"
  74.     android:grantUriPermissions="true">
  75.     <meta-data
  76.         android:name="android.support.FILE_PROVIDER_PATHS"
  77.         android:resource="@xml/file_paths" />
  78. </provider>return userAgents[random];
  79.   }
  80.   /// 检查更新信息
  81.   static Future<UpdateResult> checkUpdate() async {
  82. <provider
  83.     android:name="androidx.core.content.FileProvider"
  84.     android:authorities="${applicationId}.fileprovider"
  85.     android:exported="false"
  86.     android:grantUriPermissions="true">
  87.     <meta-data
  88.         android:name="android.support.FILE_PROVIDER_PATHS"
  89.         android:resource="@xml/file_paths" />
  90. </provider>try {
  91. <provider
  92.     android:name="androidx.core.content.FileProvider"
  93.     android:authorities="${applicationId}.fileprovider"
  94.     android:exported="false"
  95.     android:grantUriPermissions="true">
  96.     <meta-data
  97.         android:name="android.support.FILE_PROVIDER_PATHS"
  98.         android:resource="@xml/file_paths" />
  99. </provider>  // 获取当前版本信息
  100. <provider
  101.     android:name="androidx.core.content.FileProvider"
  102.     android:authorities="${applicationId}.fileprovider"
  103.     android:exported="false"
  104.     android:grantUriPermissions="true">
  105.     <meta-data
  106.         android:name="android.support.FILE_PROVIDER_PATHS"
  107.         android:resource="@xml/file_paths" />
  108. </provider>  final currentInfo = await _getAppInfo();
  109. <provider
  110.     android:name="androidx.core.content.FileProvider"
  111.     android:authorities="${applicationId}.fileprovider"
  112.     android:exported="false"
  113.     android:grantUriPermissions="true">
  114.     <meta-data
  115.         android:name="android.support.FILE_PROVIDER_PATHS"
  116.         android:resource="@xml/file_paths" />
  117. </provider>  final currentVersion = _normalizeVersion(currentInfo.version);
  118. <provider
  119.     android:name="androidx.core.content.FileProvider"
  120.     android:authorities="${applicationId}.fileprovider"
  121.     android:exported="false"
  122.     android:grantUriPermissions="true">
  123.     <meta-data
  124.         android:name="android.support.FILE_PROVIDER_PATHS"
  125.         android:resource="@xml/file_paths" />
  126. </provider>  logI('UpdateService', '当前版本: $currentVersion');
  127. <provider
  128.     android:name="androidx.core.content.FileProvider"
  129.     android:authorities="${applicationId}.fileprovider"
  130.     android:exported="false"
  131.     android:grantUriPermissions="true">
  132.     <meta-data
  133.         android:name="android.support.FILE_PROVIDER_PATHS"
  134.         android:resource="@xml/file_paths" />
  135. </provider>  // 检查缓存的APK
  136. <provider
  137.     android:name="androidx.core.content.FileProvider"
  138.     android:authorities="${applicationId}.fileprovider"
  139.     android:exported="false"
  140.     android:grantUriPermissions="true">
  141.     <meta-data
  142.         android:name="android.support.FILE_PROVIDER_PATHS"
  143.         android:resource="@xml/file_paths" />
  144. </provider>  final cachedResult = await _checkCachedApk(currentVersion);
  145. <provider
  146.     android:name="androidx.core.content.FileProvider"
  147.     android:authorities="${applicationId}.fileprovider"
  148.     android:exported="false"
  149.     android:grantUriPermissions="true">
  150.     <meta-data
  151.         android:name="android.support.FILE_PROVIDER_PATHS"
  152.         android:resource="@xml/file_paths" />
  153. </provider>  if (cachedResult != null) {
  154. <provider
  155.     android:name="androidx.core.content.FileProvider"
  156.     android:authorities="${applicationId}.fileprovider"
  157.     android:exported="false"
  158.     android:grantUriPermissions="true">
  159.     <meta-data
  160.         android:name="android.support.FILE_PROVIDER_PATHS"
  161.         android:resource="@xml/file_paths" />
  162. </provider><provider
  163.     android:name="androidx.core.content.FileProvider"
  164.     android:authorities="${applicationId}.fileprovider"
  165.     android:exported="false"
  166.     android:grantUriPermissions="true">
  167.     <meta-data
  168.         android:name="android.support.FILE_PROVIDER_PATHS"
  169.         android:resource="@xml/file_paths" />
  170. </provider>return cachedResult;
  171. <provider
  172.     android:name="androidx.core.content.FileProvider"
  173.     android:authorities="${applicationId}.fileprovider"
  174.     android:exported="false"
  175.     android:grantUriPermissions="true">
  176.     <meta-data
  177.         android:name="android.support.FILE_PROVIDER_PATHS"
  178.         android:resource="@xml/file_paths" />
  179. </provider>  }
  180. <provider
  181.     android:name="androidx.core.content.FileProvider"
  182.     android:authorities="${applicationId}.fileprovider"
  183.     android:exported="false"
  184.     android:grantUriPermissions="true">
  185.     <meta-data
  186.         android:name="android.support.FILE_PROVIDER_PATHS"
  187.         android:resource="@xml/file_paths" />
  188. </provider>  // 配置Dio超时和重试机制
  189. <provider
  190.     android:name="androidx.core.content.FileProvider"
  191.     android:authorities="${applicationId}.fileprovider"
  192.     android:exported="false"
  193.     android:grantUriPermissions="true">
  194.     <meta-data
  195.         android:name="android.support.FILE_PROVIDER_PATHS"
  196.         android:resource="@xml/file_paths" />
  197. </provider>  _dio.options.connectTimeout = const Duration(seconds: 30);
  198. <provider
  199.     android:name="androidx.core.content.FileProvider"
  200.     android:authorities="${applicationId}.fileprovider"
  201.     android:exported="false"
  202.     android:grantUriPermissions="true">
  203.     <meta-data
  204.         android:name="android.support.FILE_PROVIDER_PATHS"
  205.         android:resource="@xml/file_paths" />
  206. </provider>  _dio.options.receiveTimeout = const Duration(minutes: 2);
  207. <provider
  208.     android:name="androidx.core.content.FileProvider"
  209.     android:authorities="${applicationId}.fileprovider"
  210.     android:exported="false"
  211.     android:grantUriPermissions="true">
  212.     <meta-data
  213.         android:name="android.support.FILE_PROVIDER_PATHS"
  214.         android:resource="@xml/file_paths" />
  215. </provider>  _dio.options.sendTimeout = const Duration(minutes: 2);
  216. <provider
  217.     android:name="androidx.core.content.FileProvider"
  218.     android:authorities="${applicationId}.fileprovider"
  219.     android:exported="false"
  220.     android:grantUriPermissions="true">
  221.     <meta-data
  222.         android:name="android.support.FILE_PROVIDER_PATHS"
  223.         android:resource="@xml/file_paths" />
  224. </provider>  // 获取最新release信息 - 添加重试机制
  225. <provider
  226.     android:name="androidx.core.content.FileProvider"
  227.     android:authorities="${applicationId}.fileprovider"
  228.     android:exported="false"
  229.     android:grantUriPermissions="true">
  230.     <meta-data
  231.         android:name="android.support.FILE_PROVIDER_PATHS"
  232.         android:resource="@xml/file_paths" />
  233. </provider>  Response? resp;
  234. <provider
  235.     android:name="androidx.core.content.FileProvider"
  236.     android:authorities="${applicationId}.fileprovider"
  237.     android:exported="false"
  238.     android:grantUriPermissions="true">
  239.     <meta-data
  240.         android:name="android.support.FILE_PROVIDER_PATHS"
  241.         android:resource="@xml/file_paths" />
  242. </provider>  int attempts = 0;
  243. <provider
  244.     android:name="androidx.core.content.FileProvider"
  245.     android:authorities="${applicationId}.fileprovider"
  246.     android:exported="false"
  247.     android:grantUriPermissions="true">
  248.     <meta-data
  249.         android:name="android.support.FILE_PROVIDER_PATHS"
  250.         android:resource="@xml/file_paths" />
  251. </provider>  const maxAttempts = 3;
  252. <provider
  253.     android:name="androidx.core.content.FileProvider"
  254.     android:authorities="${applicationId}.fileprovider"
  255.     android:exported="false"
  256.     android:grantUriPermissions="true">
  257.     <meta-data
  258.         android:name="android.support.FILE_PROVIDER_PATHS"
  259.         android:resource="@xml/file_paths" />
  260. </provider>  while (attempts < maxAttempts) {
  261. <provider
  262.     android:name="androidx.core.content.FileProvider"
  263.     android:authorities="${applicationId}.fileprovider"
  264.     android:exported="false"
  265.     android:grantUriPermissions="true">
  266.     <meta-data
  267.         android:name="android.support.FILE_PROVIDER_PATHS"
  268.         android:resource="@xml/file_paths" />
  269. </provider><provider
  270.     android:name="androidx.core.content.FileProvider"
  271.     android:authorities="${applicationId}.fileprovider"
  272.     android:exported="false"
  273.     android:grantUriPermissions="true">
  274.     <meta-data
  275.         android:name="android.support.FILE_PROVIDER_PATHS"
  276.         android:resource="@xml/file_paths" />
  277. </provider>attempts++;
  278. <provider
  279.     android:name="androidx.core.content.FileProvider"
  280.     android:authorities="${applicationId}.fileprovider"
  281.     android:exported="false"
  282.     android:grantUriPermissions="true">
  283.     <meta-data
  284.         android:name="android.support.FILE_PROVIDER_PATHS"
  285.         android:resource="@xml/file_paths" />
  286. </provider><provider
  287.     android:name="androidx.core.content.FileProvider"
  288.     android:authorities="${applicationId}.fileprovider"
  289.     android:exported="false"
  290.     android:grantUriPermissions="true">
  291.     <meta-data
  292.         android:name="android.support.FILE_PROVIDER_PATHS"
  293.         android:resource="@xml/file_paths" />
  294. </provider>try {
  295. <provider
  296.     android:name="androidx.core.content.FileProvider"
  297.     android:authorities="${applicationId}.fileprovider"
  298.     android:exported="false"
  299.     android:grantUriPermissions="true">
  300.     <meta-data
  301.         android:name="android.support.FILE_PROVIDER_PATHS"
  302.         android:resource="@xml/file_paths" />
  303. </provider><provider
  304.     android:name="androidx.core.content.FileProvider"
  305.     android:authorities="${applicationId}.fileprovider"
  306.     android:exported="false"
  307.     android:grantUriPermissions="true">
  308.     <meta-data
  309.         android:name="android.support.FILE_PROVIDER_PATHS"
  310.         android:resource="@xml/file_paths" />
  311. </provider>  logI('UpdateService', '尝试第$attempts次请求GitHub API...');
  312. <provider
  313.     android:name="androidx.core.content.FileProvider"
  314.     android:authorities="${applicationId}.fileprovider"
  315.     android:exported="false"
  316.     android:grantUriPermissions="true">
  317.     <meta-data
  318.         android:name="android.support.FILE_PROVIDER_PATHS"
  319.         android:resource="@xml/file_paths" />
  320. </provider><provider
  321.     android:name="androidx.core.content.FileProvider"
  322.     android:authorities="${applicationId}.fileprovider"
  323.     android:exported="false"
  324.     android:grantUriPermissions="true">
  325.     <meta-data
  326.         android:name="android.support.FILE_PROVIDER_PATHS"
  327.         android:resource="@xml/file_paths" />
  328. </provider>  resp = await _dio.get(
  329. <provider
  330.     android:name="androidx.core.content.FileProvider"
  331.     android:authorities="${applicationId}.fileprovider"
  332.     android:exported="false"
  333.     android:grantUriPermissions="true">
  334.     <meta-data
  335.         android:name="android.support.FILE_PROVIDER_PATHS"
  336.         android:resource="@xml/file_paths" />
  337. </provider><provider
  338.     android:name="androidx.core.content.FileProvider"
  339.     android:authorities="${applicationId}.fileprovider"
  340.     android:exported="false"
  341.     android:grantUriPermissions="true">
  342.     <meta-data
  343.         android:name="android.support.FILE_PROVIDER_PATHS"
  344.         android:resource="@xml/file_paths" />
  345. </provider><provider
  346.     android:name="androidx.core.content.FileProvider"
  347.     android:authorities="${applicationId}.fileprovider"
  348.     android:exported="false"
  349.     android:grantUriPermissions="true">
  350.     <meta-data
  351.         android:name="android.support.FILE_PROVIDER_PATHS"
  352.         android:resource="@xml/file_paths" />
  353. </provider>'https://api.github.com/repos/TNT-Likely/BeeCount/releases/latest',
  354. <provider
  355.     android:name="androidx.core.content.FileProvider"
  356.     android:authorities="${applicationId}.fileprovider"
  357.     android:exported="false"
  358.     android:grantUriPermissions="true">
  359.     <meta-data
  360.         android:name="android.support.FILE_PROVIDER_PATHS"
  361.         android:resource="@xml/file_paths" />
  362. </provider><provider
  363.     android:name="androidx.core.content.FileProvider"
  364.     android:authorities="${applicationId}.fileprovider"
  365.     android:exported="false"
  366.     android:grantUriPermissions="true">
  367.     <meta-data
  368.         android:name="android.support.FILE_PROVIDER_PATHS"
  369.         android:resource="@xml/file_paths" />
  370. </provider><provider
  371.     android:name="androidx.core.content.FileProvider"
  372.     android:authorities="${applicationId}.fileprovider"
  373.     android:exported="false"
  374.     android:grantUriPermissions="true">
  375.     <meta-data
  376.         android:name="android.support.FILE_PROVIDER_PATHS"
  377.         android:resource="@xml/file_paths" />
  378. </provider>options: Options(
  379. <provider
  380.     android:name="androidx.core.content.FileProvider"
  381.     android:authorities="${applicationId}.fileprovider"
  382.     android:exported="false"
  383.     android:grantUriPermissions="true">
  384.     <meta-data
  385.         android:name="android.support.FILE_PROVIDER_PATHS"
  386.         android:resource="@xml/file_paths" />
  387. </provider><provider
  388.     android:name="androidx.core.content.FileProvider"
  389.     android:authorities="${applicationId}.fileprovider"
  390.     android:exported="false"
  391.     android:grantUriPermissions="true">
  392.     <meta-data
  393.         android:name="android.support.FILE_PROVIDER_PATHS"
  394.         android:resource="@xml/file_paths" />
  395. </provider><provider
  396.     android:name="androidx.core.content.FileProvider"
  397.     android:authorities="${applicationId}.fileprovider"
  398.     android:exported="false"
  399.     android:grantUriPermissions="true">
  400.     <meta-data
  401.         android:name="android.support.FILE_PROVIDER_PATHS"
  402.         android:resource="@xml/file_paths" />
  403. </provider>  headers: {
  404. <provider
  405.     android:name="androidx.core.content.FileProvider"
  406.     android:authorities="${applicationId}.fileprovider"
  407.     android:exported="false"
  408.     android:grantUriPermissions="true">
  409.     <meta-data
  410.         android:name="android.support.FILE_PROVIDER_PATHS"
  411.         android:resource="@xml/file_paths" />
  412. </provider><provider
  413.     android:name="androidx.core.content.FileProvider"
  414.     android:authorities="${applicationId}.fileprovider"
  415.     android:exported="false"
  416.     android:grantUriPermissions="true">
  417.     <meta-data
  418.         android:name="android.support.FILE_PROVIDER_PATHS"
  419.         android:resource="@xml/file_paths" />
  420. </provider><provider
  421.     android:name="androidx.core.content.FileProvider"
  422.     android:authorities="${applicationId}.fileprovider"
  423.     android:exported="false"
  424.     android:grantUriPermissions="true">
  425.     <meta-data
  426.         android:name="android.support.FILE_PROVIDER_PATHS"
  427.         android:resource="@xml/file_paths" />
  428. </provider><provider
  429.     android:name="androidx.core.content.FileProvider"
  430.     android:authorities="${applicationId}.fileprovider"
  431.     android:exported="false"
  432.     android:grantUriPermissions="true">
  433.     <meta-data
  434.         android:name="android.support.FILE_PROVIDER_PATHS"
  435.         android:resource="@xml/file_paths" />
  436. </provider>'Accept': 'application/vnd.github+json',
  437. <provider
  438.     android:name="androidx.core.content.FileProvider"
  439.     android:authorities="${applicationId}.fileprovider"
  440.     android:exported="false"
  441.     android:grantUriPermissions="true">
  442.     <meta-data
  443.         android:name="android.support.FILE_PROVIDER_PATHS"
  444.         android:resource="@xml/file_paths" />
  445. </provider><provider
  446.     android:name="androidx.core.content.FileProvider"
  447.     android:authorities="${applicationId}.fileprovider"
  448.     android:exported="false"
  449.     android:grantUriPermissions="true">
  450.     <meta-data
  451.         android:name="android.support.FILE_PROVIDER_PATHS"
  452.         android:resource="@xml/file_paths" />
  453. </provider><provider
  454.     android:name="androidx.core.content.FileProvider"
  455.     android:authorities="${applicationId}.fileprovider"
  456.     android:exported="false"
  457.     android:grantUriPermissions="true">
  458.     <meta-data
  459.         android:name="android.support.FILE_PROVIDER_PATHS"
  460.         android:resource="@xml/file_paths" />
  461. </provider><provider
  462.     android:name="androidx.core.content.FileProvider"
  463.     android:authorities="${applicationId}.fileprovider"
  464.     android:exported="false"
  465.     android:grantUriPermissions="true">
  466.     <meta-data
  467.         android:name="android.support.FILE_PROVIDER_PATHS"
  468.         android:resource="@xml/file_paths" />
  469. </provider>'User-Agent': _generateRandomUserAgent(),
  470. <provider
  471.     android:name="androidx.core.content.FileProvider"
  472.     android:authorities="${applicationId}.fileprovider"
  473.     android:exported="false"
  474.     android:grantUriPermissions="true">
  475.     <meta-data
  476.         android:name="android.support.FILE_PROVIDER_PATHS"
  477.         android:resource="@xml/file_paths" />
  478. </provider><provider
  479.     android:name="androidx.core.content.FileProvider"
  480.     android:authorities="${applicationId}.fileprovider"
  481.     android:exported="false"
  482.     android:grantUriPermissions="true">
  483.     <meta-data
  484.         android:name="android.support.FILE_PROVIDER_PATHS"
  485.         android:resource="@xml/file_paths" />
  486. </provider><provider
  487.     android:name="androidx.core.content.FileProvider"
  488.     android:authorities="${applicationId}.fileprovider"
  489.     android:exported="false"
  490.     android:grantUriPermissions="true">
  491.     <meta-data
  492.         android:name="android.support.FILE_PROVIDER_PATHS"
  493.         android:resource="@xml/file_paths" />
  494. </provider>  },
  495. <provider
  496.     android:name="androidx.core.content.FileProvider"
  497.     android:authorities="${applicationId}.fileprovider"
  498.     android:exported="false"
  499.     android:grantUriPermissions="true">
  500.     <meta-data
  501.         android:name="android.support.FILE_PROVIDER_PATHS"
  502.         android:resource="@xml/file_paths" />
  503. </provider><provider
  504.     android:name="androidx.core.content.FileProvider"
  505.     android:authorities="${applicationId}.fileprovider"
  506.     android:exported="false"
  507.     android:grantUriPermissions="true">
  508.     <meta-data
  509.         android:name="android.support.FILE_PROVIDER_PATHS"
  510.         android:resource="@xml/file_paths" />
  511. </provider><provider
  512.     android:name="androidx.core.content.FileProvider"
  513.     android:authorities="${applicationId}.fileprovider"
  514.     android:exported="false"
  515.     android:grantUriPermissions="true">
  516.     <meta-data
  517.         android:name="android.support.FILE_PROVIDER_PATHS"
  518.         android:resource="@xml/file_paths" />
  519. </provider>),
  520. <provider
  521.     android:name="androidx.core.content.FileProvider"
  522.     android:authorities="${applicationId}.fileprovider"
  523.     android:exported="false"
  524.     android:grantUriPermissions="true">
  525.     <meta-data
  526.         android:name="android.support.FILE_PROVIDER_PATHS"
  527.         android:resource="@xml/file_paths" />
  528. </provider><provider
  529.     android:name="androidx.core.content.FileProvider"
  530.     android:authorities="${applicationId}.fileprovider"
  531.     android:exported="false"
  532.     android:grantUriPermissions="true">
  533.     <meta-data
  534.         android:name="android.support.FILE_PROVIDER_PATHS"
  535.         android:resource="@xml/file_paths" />
  536. </provider>  );
  537. <provider
  538.     android:name="androidx.core.content.FileProvider"
  539.     android:authorities="${applicationId}.fileprovider"
  540.     android:exported="false"
  541.     android:grantUriPermissions="true">
  542.     <meta-data
  543.         android:name="android.support.FILE_PROVIDER_PATHS"
  544.         android:resource="@xml/file_paths" />
  545. </provider><provider
  546.     android:name="androidx.core.content.FileProvider"
  547.     android:authorities="${applicationId}.fileprovider"
  548.     android:exported="false"
  549.     android:grantUriPermissions="true">
  550.     <meta-data
  551.         android:name="android.support.FILE_PROVIDER_PATHS"
  552.         android:resource="@xml/file_paths" />
  553. </provider>  if (resp.statusCode == 200) {
  554. <provider
  555.     android:name="androidx.core.content.FileProvider"
  556.     android:authorities="${applicationId}.fileprovider"
  557.     android:exported="false"
  558.     android:grantUriPermissions="true">
  559.     <meta-data
  560.         android:name="android.support.FILE_PROVIDER_PATHS"
  561.         android:resource="@xml/file_paths" />
  562. </provider><provider
  563.     android:name="androidx.core.content.FileProvider"
  564.     android:authorities="${applicationId}.fileprovider"
  565.     android:exported="false"
  566.     android:grantUriPermissions="true">
  567.     <meta-data
  568.         android:name="android.support.FILE_PROVIDER_PATHS"
  569.         android:resource="@xml/file_paths" />
  570. </provider><provider
  571.     android:name="androidx.core.content.FileProvider"
  572.     android:authorities="${applicationId}.fileprovider"
  573.     android:exported="false"
  574.     android:grantUriPermissions="true">
  575.     <meta-data
  576.         android:name="android.support.FILE_PROVIDER_PATHS"
  577.         android:resource="@xml/file_paths" />
  578. </provider>logI('UpdateService', 'GitHub API请求成功');
  579. <provider
  580.     android:name="androidx.core.content.FileProvider"
  581.     android:authorities="${applicationId}.fileprovider"
  582.     android:exported="false"
  583.     android:grantUriPermissions="true">
  584.     <meta-data
  585.         android:name="android.support.FILE_PROVIDER_PATHS"
  586.         android:resource="@xml/file_paths" />
  587. </provider><provider
  588.     android:name="androidx.core.content.FileProvider"
  589.     android:authorities="${applicationId}.fileprovider"
  590.     android:exported="false"
  591.     android:grantUriPermissions="true">
  592.     <meta-data
  593.         android:name="android.support.FILE_PROVIDER_PATHS"
  594.         android:resource="@xml/file_paths" />
  595. </provider><provider
  596.     android:name="androidx.core.content.FileProvider"
  597.     android:authorities="${applicationId}.fileprovider"
  598.     android:exported="false"
  599.     android:grantUriPermissions="true">
  600.     <meta-data
  601.         android:name="android.support.FILE_PROVIDER_PATHS"
  602.         android:resource="@xml/file_paths" />
  603. </provider>break;
  604. <provider
  605.     android:name="androidx.core.content.FileProvider"
  606.     android:authorities="${applicationId}.fileprovider"
  607.     android:exported="false"
  608.     android:grantUriPermissions="true">
  609.     <meta-data
  610.         android:name="android.support.FILE_PROVIDER_PATHS"
  611.         android:resource="@xml/file_paths" />
  612. </provider><provider
  613.     android:name="androidx.core.content.FileProvider"
  614.     android:authorities="${applicationId}.fileprovider"
  615.     android:exported="false"
  616.     android:grantUriPermissions="true">
  617.     <meta-data
  618.         android:name="android.support.FILE_PROVIDER_PATHS"
  619.         android:resource="@xml/file_paths" />
  620. </provider>  } else {
  621. <provider
  622.     android:name="androidx.core.content.FileProvider"
  623.     android:authorities="${applicationId}.fileprovider"
  624.     android:exported="false"
  625.     android:grantUriPermissions="true">
  626.     <meta-data
  627.         android:name="android.support.FILE_PROVIDER_PATHS"
  628.         android:resource="@xml/file_paths" />
  629. </provider><provider
  630.     android:name="androidx.core.content.FileProvider"
  631.     android:authorities="${applicationId}.fileprovider"
  632.     android:exported="false"
  633.     android:grantUriPermissions="true">
  634.     <meta-data
  635.         android:name="android.support.FILE_PROVIDER_PATHS"
  636.         android:resource="@xml/file_paths" />
  637. </provider><provider
  638.     android:name="androidx.core.content.FileProvider"
  639.     android:authorities="${applicationId}.fileprovider"
  640.     android:exported="false"
  641.     android:grantUriPermissions="true">
  642.     <meta-data
  643.         android:name="android.support.FILE_PROVIDER_PATHS"
  644.         android:resource="@xml/file_paths" />
  645. </provider>logW('UpdateService', '第$attempts次请求返回错误状态码: ${resp.statusCode}');
  646. <provider
  647.     android:name="androidx.core.content.FileProvider"
  648.     android:authorities="${applicationId}.fileprovider"
  649.     android:exported="false"
  650.     android:grantUriPermissions="true">
  651.     <meta-data
  652.         android:name="android.support.FILE_PROVIDER_PATHS"
  653.         android:resource="@xml/file_paths" />
  654. </provider><provider
  655.     android:name="androidx.core.content.FileProvider"
  656.     android:authorities="${applicationId}.fileprovider"
  657.     android:exported="false"
  658.     android:grantUriPermissions="true">
  659.     <meta-data
  660.         android:name="android.support.FILE_PROVIDER_PATHS"
  661.         android:resource="@xml/file_paths" />
  662. </provider><provider
  663.     android:name="androidx.core.content.FileProvider"
  664.     android:authorities="${applicationId}.fileprovider"
  665.     android:exported="false"
  666.     android:grantUriPermissions="true">
  667.     <meta-data
  668.         android:name="android.support.FILE_PROVIDER_PATHS"
  669.         android:resource="@xml/file_paths" />
  670. </provider>if (attempts == maxAttempts) break;
  671. <provider
  672.     android:name="androidx.core.content.FileProvider"
  673.     android:authorities="${applicationId}.fileprovider"
  674.     android:exported="false"
  675.     android:grantUriPermissions="true">
  676.     <meta-data
  677.         android:name="android.support.FILE_PROVIDER_PATHS"
  678.         android:resource="@xml/file_paths" />
  679. </provider><provider
  680.     android:name="androidx.core.content.FileProvider"
  681.     android:authorities="${applicationId}.fileprovider"
  682.     android:exported="false"
  683.     android:grantUriPermissions="true">
  684.     <meta-data
  685.         android:name="android.support.FILE_PROVIDER_PATHS"
  686.         android:resource="@xml/file_paths" />
  687. </provider><provider
  688.     android:name="androidx.core.content.FileProvider"
  689.     android:authorities="${applicationId}.fileprovider"
  690.     android:exported="false"
  691.     android:grantUriPermissions="true">
  692.     <meta-data
  693.         android:name="android.support.FILE_PROVIDER_PATHS"
  694.         android:resource="@xml/file_paths" />
  695. </provider>await Future.delayed(const Duration(seconds: 1));
  696. <provider
  697.     android:name="androidx.core.content.FileProvider"
  698.     android:authorities="${applicationId}.fileprovider"
  699.     android:exported="false"
  700.     android:grantUriPermissions="true">
  701.     <meta-data
  702.         android:name="android.support.FILE_PROVIDER_PATHS"
  703.         android:resource="@xml/file_paths" />
  704. </provider><provider
  705.     android:name="androidx.core.content.FileProvider"
  706.     android:authorities="${applicationId}.fileprovider"
  707.     android:exported="false"
  708.     android:grantUriPermissions="true">
  709.     <meta-data
  710.         android:name="android.support.FILE_PROVIDER_PATHS"
  711.         android:resource="@xml/file_paths" />
  712. </provider>  }
  713. <provider
  714.     android:name="androidx.core.content.FileProvider"
  715.     android:authorities="${applicationId}.fileprovider"
  716.     android:exported="false"
  717.     android:grantUriPermissions="true">
  718.     <meta-data
  719.         android:name="android.support.FILE_PROVIDER_PATHS"
  720.         android:resource="@xml/file_paths" />
  721. </provider><provider
  722.     android:name="androidx.core.content.FileProvider"
  723.     android:authorities="${applicationId}.fileprovider"
  724.     android:exported="false"
  725.     android:grantUriPermissions="true">
  726.     <meta-data
  727.         android:name="android.support.FILE_PROVIDER_PATHS"
  728.         android:resource="@xml/file_paths" />
  729. </provider>} catch (e) {
  730. <provider
  731.     android:name="androidx.core.content.FileProvider"
  732.     android:authorities="${applicationId}.fileprovider"
  733.     android:exported="false"
  734.     android:grantUriPermissions="true">
  735.     <meta-data
  736.         android:name="android.support.FILE_PROVIDER_PATHS"
  737.         android:resource="@xml/file_paths" />
  738. </provider><provider
  739.     android:name="androidx.core.content.FileProvider"
  740.     android:authorities="${applicationId}.fileprovider"
  741.     android:exported="false"
  742.     android:grantUriPermissions="true">
  743.     <meta-data
  744.         android:name="android.support.FILE_PROVIDER_PATHS"
  745.         android:resource="@xml/file_paths" />
  746. </provider>  logE('UpdateService', '第$attempts次请求失败', e);
  747. <provider
  748.     android:name="androidx.core.content.FileProvider"
  749.     android:authorities="${applicationId}.fileprovider"
  750.     android:exported="false"
  751.     android:grantUriPermissions="true">
  752.     <meta-data
  753.         android:name="android.support.FILE_PROVIDER_PATHS"
  754.         android:resource="@xml/file_paths" />
  755. </provider><provider
  756.     android:name="androidx.core.content.FileProvider"
  757.     android:authorities="${applicationId}.fileprovider"
  758.     android:exported="false"
  759.     android:grantUriPermissions="true">
  760.     <meta-data
  761.         android:name="android.support.FILE_PROVIDER_PATHS"
  762.         android:resource="@xml/file_paths" />
  763. </provider>  if (attempts == maxAttempts) rethrow;
  764. <provider
  765.     android:name="androidx.core.content.FileProvider"
  766.     android:authorities="${applicationId}.fileprovider"
  767.     android:exported="false"
  768.     android:grantUriPermissions="true">
  769.     <meta-data
  770.         android:name="android.support.FILE_PROVIDER_PATHS"
  771.         android:resource="@xml/file_paths" />
  772. </provider><provider
  773.     android:name="androidx.core.content.FileProvider"
  774.     android:authorities="${applicationId}.fileprovider"
  775.     android:exported="false"
  776.     android:grantUriPermissions="true">
  777.     <meta-data
  778.         android:name="android.support.FILE_PROVIDER_PATHS"
  779.         android:resource="@xml/file_paths" />
  780. </provider>  await Future.delayed(Duration(seconds: 1 << attempts)); // 指数退避
  781. <provider
  782.     android:name="androidx.core.content.FileProvider"
  783.     android:authorities="${applicationId}.fileprovider"
  784.     android:exported="false"
  785.     android:grantUriPermissions="true">
  786.     <meta-data
  787.         android:name="android.support.FILE_PROVIDER_PATHS"
  788.         android:resource="@xml/file_paths" />
  789. </provider><provider
  790.     android:name="androidx.core.content.FileProvider"
  791.     android:authorities="${applicationId}.fileprovider"
  792.     android:exported="false"
  793.     android:grantUriPermissions="true">
  794.     <meta-data
  795.         android:name="android.support.FILE_PROVIDER_PATHS"
  796.         android:resource="@xml/file_paths" />
  797. </provider>}
  798. <provider
  799.     android:name="androidx.core.content.FileProvider"
  800.     android:authorities="${applicationId}.fileprovider"
  801.     android:exported="false"
  802.     android:grantUriPermissions="true">
  803.     <meta-data
  804.         android:name="android.support.FILE_PROVIDER_PATHS"
  805.         android:resource="@xml/file_paths" />
  806. </provider>  }
  807. <provider
  808.     android:name="androidx.core.content.FileProvider"
  809.     android:authorities="${applicationId}.fileprovider"
  810.     android:exported="false"
  811.     android:grantUriPermissions="true">
  812.     <meta-data
  813.         android:name="android.support.FILE_PROVIDER_PATHS"
  814.         android:resource="@xml/file_paths" />
  815. </provider>  if (resp?.statusCode != 200) {
  816. <provider
  817.     android:name="androidx.core.content.FileProvider"
  818.     android:authorities="${applicationId}.fileprovider"
  819.     android:exported="false"
  820.     android:grantUriPermissions="true">
  821.     <meta-data
  822.         android:name="android.support.FILE_PROVIDER_PATHS"
  823.         android:resource="@xml/file_paths" />
  824. </provider><provider
  825.     android:name="androidx.core.content.FileProvider"
  826.     android:authorities="${applicationId}.fileprovider"
  827.     android:exported="false"
  828.     android:grantUriPermissions="true">
  829.     <meta-data
  830.         android:name="android.support.FILE_PROVIDER_PATHS"
  831.         android:resource="@xml/file_paths" />
  832. </provider>return UpdateResult(
  833. <provider
  834.     android:name="androidx.core.content.FileProvider"
  835.     android:authorities="${applicationId}.fileprovider"
  836.     android:exported="false"
  837.     android:grantUriPermissions="true">
  838.     <meta-data
  839.         android:name="android.support.FILE_PROVIDER_PATHS"
  840.         android:resource="@xml/file_paths" />
  841. </provider><provider
  842.     android:name="androidx.core.content.FileProvider"
  843.     android:authorities="${applicationId}.fileprovider"
  844.     android:exported="false"
  845.     android:grantUriPermissions="true">
  846.     <meta-data
  847.         android:name="android.support.FILE_PROVIDER_PATHS"
  848.         android:resource="@xml/file_paths" />
  849. </provider>  hasUpdate: false,
  850. <provider
  851.     android:name="androidx.core.content.FileProvider"
  852.     android:authorities="${applicationId}.fileprovider"
  853.     android:exported="false"
  854.     android:grantUriPermissions="true">
  855.     <meta-data
  856.         android:name="android.support.FILE_PROVIDER_PATHS"
  857.         android:resource="@xml/file_paths" />
  858. </provider><provider
  859.     android:name="androidx.core.content.FileProvider"
  860.     android:authorities="${applicationId}.fileprovider"
  861.     android:exported="false"
  862.     android:grantUriPermissions="true">
  863.     <meta-data
  864.         android:name="android.support.FILE_PROVIDER_PATHS"
  865.         android:resource="@xml/file_paths" />
  866. </provider>  message: '检查更新失败: HTTP ${resp?.statusCode}',
  867. <provider
  868.     android:name="androidx.core.content.FileProvider"
  869.     android:authorities="${applicationId}.fileprovider"
  870.     android:exported="false"
  871.     android:grantUriPermissions="true">
  872.     <meta-data
  873.         android:name="android.support.FILE_PROVIDER_PATHS"
  874.         android:resource="@xml/file_paths" />
  875. </provider><provider
  876.     android:name="androidx.core.content.FileProvider"
  877.     android:authorities="${applicationId}.fileprovider"
  878.     android:exported="false"
  879.     android:grantUriPermissions="true">
  880.     <meta-data
  881.         android:name="android.support.FILE_PROVIDER_PATHS"
  882.         android:resource="@xml/file_paths" />
  883. </provider>);
  884. <provider
  885.     android:name="androidx.core.content.FileProvider"
  886.     android:authorities="${applicationId}.fileprovider"
  887.     android:exported="false"
  888.     android:grantUriPermissions="true">
  889.     <meta-data
  890.         android:name="android.support.FILE_PROVIDER_PATHS"
  891.         android:resource="@xml/file_paths" />
  892. </provider>  }
  893. <provider
  894.     android:name="androidx.core.content.FileProvider"
  895.     android:authorities="${applicationId}.fileprovider"
  896.     android:exported="false"
  897.     android:grantUriPermissions="true">
  898.     <meta-data
  899.         android:name="android.support.FILE_PROVIDER_PATHS"
  900.         android:resource="@xml/file_paths" />
  901. </provider>  final releaseData = resp!.data;
  902. <provider
  903.     android:name="androidx.core.content.FileProvider"
  904.     android:authorities="${applicationId}.fileprovider"
  905.     android:exported="false"
  906.     android:grantUriPermissions="true">
  907.     <meta-data
  908.         android:name="android.support.FILE_PROVIDER_PATHS"
  909.         android:resource="@xml/file_paths" />
  910. </provider>  final latestVersion = _normalizeVersion(releaseData['tag_name']);
  911. <provider
  912.     android:name="androidx.core.content.FileProvider"
  913.     android:authorities="${applicationId}.fileprovider"
  914.     android:exported="false"
  915.     android:grantUriPermissions="true">
  916.     <meta-data
  917.         android:name="android.support.FILE_PROVIDER_PATHS"
  918.         android:resource="@xml/file_paths" />
  919. </provider>  final releaseNotes = releaseData['body'] ?? '';
  920. <provider
  921.     android:name="androidx.core.content.FileProvider"
  922.     android:authorities="${applicationId}.fileprovider"
  923.     android:exported="false"
  924.     android:grantUriPermissions="true">
  925.     <meta-data
  926.         android:name="android.support.FILE_PROVIDER_PATHS"
  927.         android:resource="@xml/file_paths" />
  928. </provider>  final publishedAt = DateTime.parse(releaseData['published_at']);
  929. <provider
  930.     android:name="androidx.core.content.FileProvider"
  931.     android:authorities="${applicationId}.fileprovider"
  932.     android:exported="false"
  933.     android:grantUriPermissions="true">
  934.     <meta-data
  935.         android:name="android.support.FILE_PROVIDER_PATHS"
  936.         android:resource="@xml/file_paths" />
  937. </provider>  logI('UpdateService', '最新版本: $latestVersion');
  938. <provider
  939.     android:name="androidx.core.content.FileProvider"
  940.     android:authorities="${applicationId}.fileprovider"
  941.     android:exported="false"
  942.     android:grantUriPermissions="true">
  943.     <meta-data
  944.         android:name="android.support.FILE_PROVIDER_PATHS"
  945.         android:resource="@xml/file_paths" />
  946. </provider>  // 版本比较
  947. <provider
  948.     android:name="androidx.core.content.FileProvider"
  949.     android:authorities="${applicationId}.fileprovider"
  950.     android:exported="false"
  951.     android:grantUriPermissions="true">
  952.     <meta-data
  953.         android:name="android.support.FILE_PROVIDER_PATHS"
  954.         android:resource="@xml/file_paths" />
  955. </provider>  if (_compareVersions(latestVersion, currentVersion) <= 0) {
  956. <provider
  957.     android:name="androidx.core.content.FileProvider"
  958.     android:authorities="${applicationId}.fileprovider"
  959.     android:exported="false"
  960.     android:grantUriPermissions="true">
  961.     <meta-data
  962.         android:name="android.support.FILE_PROVIDER_PATHS"
  963.         android:resource="@xml/file_paths" />
  964. </provider><provider
  965.     android:name="androidx.core.content.FileProvider"
  966.     android:authorities="${applicationId}.fileprovider"
  967.     android:exported="false"
  968.     android:grantUriPermissions="true">
  969.     <meta-data
  970.         android:name="android.support.FILE_PROVIDER_PATHS"
  971.         android:resource="@xml/file_paths" />
  972. </provider>logI('UpdateService', '已是最新版本');
  973. <provider
  974.     android:name="androidx.core.content.FileProvider"
  975.     android:authorities="${applicationId}.fileprovider"
  976.     android:exported="false"
  977.     android:grantUriPermissions="true">
  978.     <meta-data
  979.         android:name="android.support.FILE_PROVIDER_PATHS"
  980.         android:resource="@xml/file_paths" />
  981. </provider><provider
  982.     android:name="androidx.core.content.FileProvider"
  983.     android:authorities="${applicationId}.fileprovider"
  984.     android:exported="false"
  985.     android:grantUriPermissions="true">
  986.     <meta-data
  987.         android:name="android.support.FILE_PROVIDER_PATHS"
  988.         android:resource="@xml/file_paths" />
  989. </provider>return UpdateResult(hasUpdate: false, message: '已是最新版本');
  990. <provider
  991.     android:name="androidx.core.content.FileProvider"
  992.     android:authorities="${applicationId}.fileprovider"
  993.     android:exported="false"
  994.     android:grantUriPermissions="true">
  995.     <meta-data
  996.         android:name="android.support.FILE_PROVIDER_PATHS"
  997.         android:resource="@xml/file_paths" />
  998. </provider>  }
  999. <provider
  1000.     android:name="androidx.core.content.FileProvider"
  1001.     android:authorities="${applicationId}.fileprovider"
  1002.     android:exported="false"
  1003.     android:grantUriPermissions="true">
  1004.     <meta-data
  1005.         android:name="android.support.FILE_PROVIDER_PATHS"
  1006.         android:resource="@xml/file_paths" />
  1007. </provider>  // 查找APK下载链接
  1008. <provider
  1009.     android:name="androidx.core.content.FileProvider"
  1010.     android:authorities="${applicationId}.fileprovider"
  1011.     android:exported="false"
  1012.     android:grantUriPermissions="true">
  1013.     <meta-data
  1014.         android:name="android.support.FILE_PROVIDER_PATHS"
  1015.         android:resource="@xml/file_paths" />
  1016. </provider>  final assets = releaseData['assets'] as List;
  1017. <provider
  1018.     android:name="androidx.core.content.FileProvider"
  1019.     android:authorities="${applicationId}.fileprovider"
  1020.     android:exported="false"
  1021.     android:grantUriPermissions="true">
  1022.     <meta-data
  1023.         android:name="android.support.FILE_PROVIDER_PATHS"
  1024.         android:resource="@xml/file_paths" />
  1025. </provider>  String? downloadUrl;
  1026. <provider
  1027.     android:name="androidx.core.content.FileProvider"
  1028.     android:authorities="${applicationId}.fileprovider"
  1029.     android:exported="false"
  1030.     android:grantUriPermissions="true">
  1031.     <meta-data
  1032.         android:name="android.support.FILE_PROVIDER_PATHS"
  1033.         android:resource="@xml/file_paths" />
  1034. </provider>  for (final asset in assets) {
  1035. <provider
  1036.     android:name="androidx.core.content.FileProvider"
  1037.     android:authorities="${applicationId}.fileprovider"
  1038.     android:exported="false"
  1039.     android:grantUriPermissions="true">
  1040.     <meta-data
  1041.         android:name="android.support.FILE_PROVIDER_PATHS"
  1042.         android:resource="@xml/file_paths" />
  1043. </provider><provider
  1044.     android:name="androidx.core.content.FileProvider"
  1045.     android:authorities="${applicationId}.fileprovider"
  1046.     android:exported="false"
  1047.     android:grantUriPermissions="true">
  1048.     <meta-data
  1049.         android:name="android.support.FILE_PROVIDER_PATHS"
  1050.         android:resource="@xml/file_paths" />
  1051. </provider>final name = asset['name'] as String;
  1052. <provider
  1053.     android:name="androidx.core.content.FileProvider"
  1054.     android:authorities="${applicationId}.fileprovider"
  1055.     android:exported="false"
  1056.     android:grantUriPermissions="true">
  1057.     <meta-data
  1058.         android:name="android.support.FILE_PROVIDER_PATHS"
  1059.         android:resource="@xml/file_paths" />
  1060. </provider><provider
  1061.     android:name="androidx.core.content.FileProvider"
  1062.     android:authorities="${applicationId}.fileprovider"
  1063.     android:exported="false"
  1064.     android:grantUriPermissions="true">
  1065.     <meta-data
  1066.         android:name="android.support.FILE_PROVIDER_PATHS"
  1067.         android:resource="@xml/file_paths" />
  1068. </provider>if (name.toLowerCase().endsWith('.apk') &&
  1069. <provider
  1070.     android:name="androidx.core.content.FileProvider"
  1071.     android:authorities="${applicationId}.fileprovider"
  1072.     android:exported="false"
  1073.     android:grantUriPermissions="true">
  1074.     <meta-data
  1075.         android:name="android.support.FILE_PROVIDER_PATHS"
  1076.         android:resource="@xml/file_paths" />
  1077. </provider><provider
  1078.     android:name="androidx.core.content.FileProvider"
  1079.     android:authorities="${applicationId}.fileprovider"
  1080.     android:exported="false"
  1081.     android:grantUriPermissions="true">
  1082.     <meta-data
  1083.         android:name="android.support.FILE_PROVIDER_PATHS"
  1084.         android:resource="@xml/file_paths" />
  1085. </provider><provider
  1086.     android:name="androidx.core.content.FileProvider"
  1087.     android:authorities="${applicationId}.fileprovider"
  1088.     android:exported="false"
  1089.     android:grantUriPermissions="true">
  1090.     <meta-data
  1091.         android:name="android.support.FILE_PROVIDER_PATHS"
  1092.         android:resource="@xml/file_paths" />
  1093. </provider>(name.contains('prod') || name.contains('release'))) {
  1094. <provider
  1095.     android:name="androidx.core.content.FileProvider"
  1096.     android:authorities="${applicationId}.fileprovider"
  1097.     android:exported="false"
  1098.     android:grantUriPermissions="true">
  1099.     <meta-data
  1100.         android:name="android.support.FILE_PROVIDER_PATHS"
  1101.         android:resource="@xml/file_paths" />
  1102. </provider><provider
  1103.     android:name="androidx.core.content.FileProvider"
  1104.     android:authorities="${applicationId}.fileprovider"
  1105.     android:exported="false"
  1106.     android:grantUriPermissions="true">
  1107.     <meta-data
  1108.         android:name="android.support.FILE_PROVIDER_PATHS"
  1109.         android:resource="@xml/file_paths" />
  1110. </provider>  downloadUrl = asset['browser_download_url'];
  1111. <provider
  1112.     android:name="androidx.core.content.FileProvider"
  1113.     android:authorities="${applicationId}.fileprovider"
  1114.     android:exported="false"
  1115.     android:grantUriPermissions="true">
  1116.     <meta-data
  1117.         android:name="android.support.FILE_PROVIDER_PATHS"
  1118.         android:resource="@xml/file_paths" />
  1119. </provider><provider
  1120.     android:name="androidx.core.content.FileProvider"
  1121.     android:authorities="${applicationId}.fileprovider"
  1122.     android:exported="false"
  1123.     android:grantUriPermissions="true">
  1124.     <meta-data
  1125.         android:name="android.support.FILE_PROVIDER_PATHS"
  1126.         android:resource="@xml/file_paths" />
  1127. </provider>  break;
  1128. <provider
  1129.     android:name="androidx.core.content.FileProvider"
  1130.     android:authorities="${applicationId}.fileprovider"
  1131.     android:exported="false"
  1132.     android:grantUriPermissions="true">
  1133.     <meta-data
  1134.         android:name="android.support.FILE_PROVIDER_PATHS"
  1135.         android:resource="@xml/file_paths" />
  1136. </provider><provider
  1137.     android:name="androidx.core.content.FileProvider"
  1138.     android:authorities="${applicationId}.fileprovider"
  1139.     android:exported="false"
  1140.     android:grantUriPermissions="true">
  1141.     <meta-data
  1142.         android:name="android.support.FILE_PROVIDER_PATHS"
  1143.         android:resource="@xml/file_paths" />
  1144. </provider>}
  1145. <provider
  1146.     android:name="androidx.core.content.FileProvider"
  1147.     android:authorities="${applicationId}.fileprovider"
  1148.     android:exported="false"
  1149.     android:grantUriPermissions="true">
  1150.     <meta-data
  1151.         android:name="android.support.FILE_PROVIDER_PATHS"
  1152.         android:resource="@xml/file_paths" />
  1153. </provider>  }
  1154. <provider
  1155.     android:name="androidx.core.content.FileProvider"
  1156.     android:authorities="${applicationId}.fileprovider"
  1157.     android:exported="false"
  1158.     android:grantUriPermissions="true">
  1159.     <meta-data
  1160.         android:name="android.support.FILE_PROVIDER_PATHS"
  1161.         android:resource="@xml/file_paths" />
  1162. </provider>  if (downloadUrl == null) {
  1163. <provider
  1164.     android:name="androidx.core.content.FileProvider"
  1165.     android:authorities="${applicationId}.fileprovider"
  1166.     android:exported="false"
  1167.     android:grantUriPermissions="true">
  1168.     <meta-data
  1169.         android:name="android.support.FILE_PROVIDER_PATHS"
  1170.         android:resource="@xml/file_paths" />
  1171. </provider><provider
  1172.     android:name="androidx.core.content.FileProvider"
  1173.     android:authorities="${applicationId}.fileprovider"
  1174.     android:exported="false"
  1175.     android:grantUriPermissions="true">
  1176.     <meta-data
  1177.         android:name="android.support.FILE_PROVIDER_PATHS"
  1178.         android:resource="@xml/file_paths" />
  1179. </provider>return UpdateResult(
  1180. <provider
  1181.     android:name="androidx.core.content.FileProvider"
  1182.     android:authorities="${applicationId}.fileprovider"
  1183.     android:exported="false"
  1184.     android:grantUriPermissions="true">
  1185.     <meta-data
  1186.         android:name="android.support.FILE_PROVIDER_PATHS"
  1187.         android:resource="@xml/file_paths" />
  1188. </provider><provider
  1189.     android:name="androidx.core.content.FileProvider"
  1190.     android:authorities="${applicationId}.fileprovider"
  1191.     android:exported="false"
  1192.     android:grantUriPermissions="true">
  1193.     <meta-data
  1194.         android:name="android.support.FILE_PROVIDER_PATHS"
  1195.         android:resource="@xml/file_paths" />
  1196. </provider>  hasUpdate: false,
  1197. <provider
  1198.     android:name="androidx.core.content.FileProvider"
  1199.     android:authorities="${applicationId}.fileprovider"
  1200.     android:exported="false"
  1201.     android:grantUriPermissions="true">
  1202.     <meta-data
  1203.         android:name="android.support.FILE_PROVIDER_PATHS"
  1204.         android:resource="@xml/file_paths" />
  1205. </provider><provider
  1206.     android:name="androidx.core.content.FileProvider"
  1207.     android:authorities="${applicationId}.fileprovider"
  1208.     android:exported="false"
  1209.     android:grantUriPermissions="true">
  1210.     <meta-data
  1211.         android:name="android.support.FILE_PROVIDER_PATHS"
  1212.         android:resource="@xml/file_paths" />
  1213. </provider>  message: '未找到APK下载链接',
  1214. <provider
  1215.     android:name="androidx.core.content.FileProvider"
  1216.     android:authorities="${applicationId}.fileprovider"
  1217.     android:exported="false"
  1218.     android:grantUriPermissions="true">
  1219.     <meta-data
  1220.         android:name="android.support.FILE_PROVIDER_PATHS"
  1221.         android:resource="@xml/file_paths" />
  1222. </provider><provider
  1223.     android:name="androidx.core.content.FileProvider"
  1224.     android:authorities="${applicationId}.fileprovider"
  1225.     android:exported="false"
  1226.     android:grantUriPermissions="true">
  1227.     <meta-data
  1228.         android:name="android.support.FILE_PROVIDER_PATHS"
  1229.         android:resource="@xml/file_paths" />
  1230. </provider>);
  1231. <provider
  1232.     android:name="androidx.core.content.FileProvider"
  1233.     android:authorities="${applicationId}.fileprovider"
  1234.     android:exported="false"
  1235.     android:grantUriPermissions="true">
  1236.     <meta-data
  1237.         android:name="android.support.FILE_PROVIDER_PATHS"
  1238.         android:resource="@xml/file_paths" />
  1239. </provider>  }
  1240. <provider
  1241.     android:name="androidx.core.content.FileProvider"
  1242.     android:authorities="${applicationId}.fileprovider"
  1243.     android:exported="false"
  1244.     android:grantUriPermissions="true">
  1245.     <meta-data
  1246.         android:name="android.support.FILE_PROVIDER_PATHS"
  1247.         android:resource="@xml/file_paths" />
  1248. </provider>  logI('UpdateService', '发现新版本: $latestVersion');
  1249. <provider
  1250.     android:name="androidx.core.content.FileProvider"
  1251.     android:authorities="${applicationId}.fileprovider"
  1252.     android:exported="false"
  1253.     android:grantUriPermissions="true">
  1254.     <meta-data
  1255.         android:name="android.support.FILE_PROVIDER_PATHS"
  1256.         android:resource="@xml/file_paths" />
  1257. </provider>  return UpdateResult(
  1258. <provider
  1259.     android:name="androidx.core.content.FileProvider"
  1260.     android:authorities="${applicationId}.fileprovider"
  1261.     android:exported="false"
  1262.     android:grantUriPermissions="true">
  1263.     <meta-data
  1264.         android:name="android.support.FILE_PROVIDER_PATHS"
  1265.         android:resource="@xml/file_paths" />
  1266. </provider><provider
  1267.     android:name="androidx.core.content.FileProvider"
  1268.     android:authorities="${applicationId}.fileprovider"
  1269.     android:exported="false"
  1270.     android:grantUriPermissions="true">
  1271.     <meta-data
  1272.         android:name="android.support.FILE_PROVIDER_PATHS"
  1273.         android:resource="@xml/file_paths" />
  1274. </provider>hasUpdate: true,
  1275. <provider
  1276.     android:name="androidx.core.content.FileProvider"
  1277.     android:authorities="${applicationId}.fileprovider"
  1278.     android:exported="false"
  1279.     android:grantUriPermissions="true">
  1280.     <meta-data
  1281.         android:name="android.support.FILE_PROVIDER_PATHS"
  1282.         android:resource="@xml/file_paths" />
  1283. </provider><provider
  1284.     android:name="androidx.core.content.FileProvider"
  1285.     android:authorities="${applicationId}.fileprovider"
  1286.     android:exported="false"
  1287.     android:grantUriPermissions="true">
  1288.     <meta-data
  1289.         android:name="android.support.FILE_PROVIDER_PATHS"
  1290.         android:resource="@xml/file_paths" />
  1291. </provider>version: latestVersion,
  1292. <provider
  1293.     android:name="androidx.core.content.FileProvider"
  1294.     android:authorities="${applicationId}.fileprovider"
  1295.     android:exported="false"
  1296.     android:grantUriPermissions="true">
  1297.     <meta-data
  1298.         android:name="android.support.FILE_PROVIDER_PATHS"
  1299.         android:resource="@xml/file_paths" />
  1300. </provider><provider
  1301.     android:name="androidx.core.content.FileProvider"
  1302.     android:authorities="${applicationId}.fileprovider"
  1303.     android:exported="false"
  1304.     android:grantUriPermissions="true">
  1305.     <meta-data
  1306.         android:name="android.support.FILE_PROVIDER_PATHS"
  1307.         android:resource="@xml/file_paths" />
  1308. </provider>downloadUrl: downloadUrl,
  1309. <provider
  1310.     android:name="androidx.core.content.FileProvider"
  1311.     android:authorities="${applicationId}.fileprovider"
  1312.     android:exported="false"
  1313.     android:grantUriPermissions="true">
  1314.     <meta-data
  1315.         android:name="android.support.FILE_PROVIDER_PATHS"
  1316.         android:resource="@xml/file_paths" />
  1317. </provider><provider
  1318.     android:name="androidx.core.content.FileProvider"
  1319.     android:authorities="${applicationId}.fileprovider"
  1320.     android:exported="false"
  1321.     android:grantUriPermissions="true">
  1322.     <meta-data
  1323.         android:name="android.support.FILE_PROVIDER_PATHS"
  1324.         android:resource="@xml/file_paths" />
  1325. </provider>releaseNotes: releaseNotes,
  1326. <provider
  1327.     android:name="androidx.core.content.FileProvider"
  1328.     android:authorities="${applicationId}.fileprovider"
  1329.     android:exported="false"
  1330.     android:grantUriPermissions="true">
  1331.     <meta-data
  1332.         android:name="android.support.FILE_PROVIDER_PATHS"
  1333.         android:resource="@xml/file_paths" />
  1334. </provider><provider
  1335.     android:name="androidx.core.content.FileProvider"
  1336.     android:authorities="${applicationId}.fileprovider"
  1337.     android:exported="false"
  1338.     android:grantUriPermissions="true">
  1339.     <meta-data
  1340.         android:name="android.support.FILE_PROVIDER_PATHS"
  1341.         android:resource="@xml/file_paths" />
  1342. </provider>publishedAt: publishedAt,
  1343. <provider
  1344.     android:name="androidx.core.content.FileProvider"
  1345.     android:authorities="${applicationId}.fileprovider"
  1346.     android:exported="false"
  1347.     android:grantUriPermissions="true">
  1348.     <meta-data
  1349.         android:name="android.support.FILE_PROVIDER_PATHS"
  1350.         android:resource="@xml/file_paths" />
  1351. </provider><provider
  1352.     android:name="androidx.core.content.FileProvider"
  1353.     android:authorities="${applicationId}.fileprovider"
  1354.     android:exported="false"
  1355.     android:grantUriPermissions="true">
  1356.     <meta-data
  1357.         android:name="android.support.FILE_PROVIDER_PATHS"
  1358.         android:resource="@xml/file_paths" />
  1359. </provider>message: '发现新版本 $latestVersion',
  1360. <provider
  1361.     android:name="androidx.core.content.FileProvider"
  1362.     android:authorities="${applicationId}.fileprovider"
  1363.     android:exported="false"
  1364.     android:grantUriPermissions="true">
  1365.     <meta-data
  1366.         android:name="android.support.FILE_PROVIDER_PATHS"
  1367.         android:resource="@xml/file_paths" />
  1368. </provider>  );
  1369. <provider
  1370.     android:name="androidx.core.content.FileProvider"
  1371.     android:authorities="${applicationId}.fileprovider"
  1372.     android:exported="false"
  1373.     android:grantUriPermissions="true">
  1374.     <meta-data
  1375.         android:name="android.support.FILE_PROVIDER_PATHS"
  1376.         android:resource="@xml/file_paths" />
  1377. </provider>} catch (e) {
  1378. <provider
  1379.     android:name="androidx.core.content.FileProvider"
  1380.     android:authorities="${applicationId}.fileprovider"
  1381.     android:exported="false"
  1382.     android:grantUriPermissions="true">
  1383.     <meta-data
  1384.         android:name="android.support.FILE_PROVIDER_PATHS"
  1385.         android:resource="@xml/file_paths" />
  1386. </provider>  logE('UpdateService', '检查更新异常', e);
  1387. <provider
  1388.     android:name="androidx.core.content.FileProvider"
  1389.     android:authorities="${applicationId}.fileprovider"
  1390.     android:exported="false"
  1391.     android:grantUriPermissions="true">
  1392.     <meta-data
  1393.         android:name="android.support.FILE_PROVIDER_PATHS"
  1394.         android:resource="@xml/file_paths" />
  1395. </provider>  return UpdateResult(
  1396. <provider
  1397.     android:name="androidx.core.content.FileProvider"
  1398.     android:authorities="${applicationId}.fileprovider"
  1399.     android:exported="false"
  1400.     android:grantUriPermissions="true">
  1401.     <meta-data
  1402.         android:name="android.support.FILE_PROVIDER_PATHS"
  1403.         android:resource="@xml/file_paths" />
  1404. </provider><provider
  1405.     android:name="androidx.core.content.FileProvider"
  1406.     android:authorities="${applicationId}.fileprovider"
  1407.     android:exported="false"
  1408.     android:grantUriPermissions="true">
  1409.     <meta-data
  1410.         android:name="android.support.FILE_PROVIDER_PATHS"
  1411.         android:resource="@xml/file_paths" />
  1412. </provider>hasUpdate: false,
  1413. <provider
  1414.     android:name="androidx.core.content.FileProvider"
  1415.     android:authorities="${applicationId}.fileprovider"
  1416.     android:exported="false"
  1417.     android:grantUriPermissions="true">
  1418.     <meta-data
  1419.         android:name="android.support.FILE_PROVIDER_PATHS"
  1420.         android:resource="@xml/file_paths" />
  1421. </provider><provider
  1422.     android:name="androidx.core.content.FileProvider"
  1423.     android:authorities="${applicationId}.fileprovider"
  1424.     android:exported="false"
  1425.     android:grantUriPermissions="true">
  1426.     <meta-data
  1427.         android:name="android.support.FILE_PROVIDER_PATHS"
  1428.         android:resource="@xml/file_paths" />
  1429. </provider>message: '检查更新失败: ${e.toString()}',
  1430. <provider
  1431.     android:name="androidx.core.content.FileProvider"
  1432.     android:authorities="${applicationId}.fileprovider"
  1433.     android:exported="false"
  1434.     android:grantUriPermissions="true">
  1435.     <meta-data
  1436.         android:name="android.support.FILE_PROVIDER_PATHS"
  1437.         android:resource="@xml/file_paths" />
  1438. </provider>  );
  1439. <provider
  1440.     android:name="androidx.core.content.FileProvider"
  1441.     android:authorities="${applicationId}.fileprovider"
  1442.     android:exported="false"
  1443.     android:grantUriPermissions="true">
  1444.     <meta-data
  1445.         android:name="android.support.FILE_PROVIDER_PATHS"
  1446.         android:resource="@xml/file_paths" />
  1447. </provider>}
  1448.   }
  1449.   /// 检查缓存的APK
  1450.   static Future<UpdateResult?> _checkCachedApk(String currentVersion) async {
  1451. <provider
  1452.     android:name="androidx.core.content.FileProvider"
  1453.     android:authorities="${applicationId}.fileprovider"
  1454.     android:exported="false"
  1455.     android:grantUriPermissions="true">
  1456.     <meta-data
  1457.         android:name="android.support.FILE_PROVIDER_PATHS"
  1458.         android:resource="@xml/file_paths" />
  1459. </provider>try {
  1460. <provider
  1461.     android:name="androidx.core.content.FileProvider"
  1462.     android:authorities="${applicationId}.fileprovider"
  1463.     android:exported="false"
  1464.     android:grantUriPermissions="true">
  1465.     <meta-data
  1466.         android:name="android.support.FILE_PROVIDER_PATHS"
  1467.         android:resource="@xml/file_paths" />
  1468. </provider>  final prefs = await SharedPreferences.getInstance();
  1469. <provider
  1470.     android:name="androidx.core.content.FileProvider"
  1471.     android:authorities="${applicationId}.fileprovider"
  1472.     android:exported="false"
  1473.     android:grantUriPermissions="true">
  1474.     <meta-data
  1475.         android:name="android.support.FILE_PROVIDER_PATHS"
  1476.         android:resource="@xml/file_paths" />
  1477. </provider>  final cachedApkPath = prefs.getString(_cachedApkPathKey);
  1478. <provider
  1479.     android:name="androidx.core.content.FileProvider"
  1480.     android:authorities="${applicationId}.fileprovider"
  1481.     android:exported="false"
  1482.     android:grantUriPermissions="true">
  1483.     <meta-data
  1484.         android:name="android.support.FILE_PROVIDER_PATHS"
  1485.         android:resource="@xml/file_paths" />
  1486. </provider>  final cachedApkVersion = prefs.getString(_cachedApkVersionKey);
  1487. <provider
  1488.     android:name="androidx.core.content.FileProvider"
  1489.     android:authorities="${applicationId}.fileprovider"
  1490.     android:exported="false"
  1491.     android:grantUriPermissions="true">
  1492.     <meta-data
  1493.         android:name="android.support.FILE_PROVIDER_PATHS"
  1494.         android:resource="@xml/file_paths" />
  1495. </provider>  if (cachedApkPath != null && cachedApkVersion != null) {
  1496. <provider
  1497.     android:name="androidx.core.content.FileProvider"
  1498.     android:authorities="${applicationId}.fileprovider"
  1499.     android:exported="false"
  1500.     android:grantUriPermissions="true">
  1501.     <meta-data
  1502.         android:name="android.support.FILE_PROVIDER_PATHS"
  1503.         android:resource="@xml/file_paths" />
  1504. </provider><provider
  1505.     android:name="androidx.core.content.FileProvider"
  1506.     android:authorities="${applicationId}.fileprovider"
  1507.     android:exported="false"
  1508.     android:grantUriPermissions="true">
  1509.     <meta-data
  1510.         android:name="android.support.FILE_PROVIDER_PATHS"
  1511.         android:resource="@xml/file_paths" />
  1512. </provider>final file = File(cachedApkPath);
  1513. <provider
  1514.     android:name="androidx.core.content.FileProvider"
  1515.     android:authorities="${applicationId}.fileprovider"
  1516.     android:exported="false"
  1517.     android:grantUriPermissions="true">
  1518.     <meta-data
  1519.         android:name="android.support.FILE_PROVIDER_PATHS"
  1520.         android:resource="@xml/file_paths" />
  1521. </provider><provider
  1522.     android:name="androidx.core.content.FileProvider"
  1523.     android:authorities="${applicationId}.fileprovider"
  1524.     android:exported="false"
  1525.     android:grantUriPermissions="true">
  1526.     <meta-data
  1527.         android:name="android.support.FILE_PROVIDER_PATHS"
  1528.         android:resource="@xml/file_paths" />
  1529. </provider>if (await file.exists()) {
  1530. <provider
  1531.     android:name="androidx.core.content.FileProvider"
  1532.     android:authorities="${applicationId}.fileprovider"
  1533.     android:exported="false"
  1534.     android:grantUriPermissions="true">
  1535.     <meta-data
  1536.         android:name="android.support.FILE_PROVIDER_PATHS"
  1537.         android:resource="@xml/file_paths" />
  1538. </provider><provider
  1539.     android:name="androidx.core.content.FileProvider"
  1540.     android:authorities="${applicationId}.fileprovider"
  1541.     android:exported="false"
  1542.     android:grantUriPermissions="true">
  1543.     <meta-data
  1544.         android:name="android.support.FILE_PROVIDER_PATHS"
  1545.         android:resource="@xml/file_paths" />
  1546. </provider>  // 检查缓存版本是否比当前版本新
  1547. <provider
  1548.     android:name="androidx.core.content.FileProvider"
  1549.     android:authorities="${applicationId}.fileprovider"
  1550.     android:exported="false"
  1551.     android:grantUriPermissions="true">
  1552.     <meta-data
  1553.         android:name="android.support.FILE_PROVIDER_PATHS"
  1554.         android:resource="@xml/file_paths" />
  1555. </provider><provider
  1556.     android:name="androidx.core.content.FileProvider"
  1557.     android:authorities="${applicationId}.fileprovider"
  1558.     android:exported="false"
  1559.     android:grantUriPermissions="true">
  1560.     <meta-data
  1561.         android:name="android.support.FILE_PROVIDER_PATHS"
  1562.         android:resource="@xml/file_paths" />
  1563. </provider>  if (_compareVersions(cachedApkVersion, currentVersion) > 0) {
  1564. <provider
  1565.     android:name="androidx.core.content.FileProvider"
  1566.     android:authorities="${applicationId}.fileprovider"
  1567.     android:exported="false"
  1568.     android:grantUriPermissions="true">
  1569.     <meta-data
  1570.         android:name="android.support.FILE_PROVIDER_PATHS"
  1571.         android:resource="@xml/file_paths" />
  1572. </provider><provider
  1573.     android:name="androidx.core.content.FileProvider"
  1574.     android:authorities="${applicationId}.fileprovider"
  1575.     android:exported="false"
  1576.     android:grantUriPermissions="true">
  1577.     <meta-data
  1578.         android:name="android.support.FILE_PROVIDER_PATHS"
  1579.         android:resource="@xml/file_paths" />
  1580. </provider><provider
  1581.     android:name="androidx.core.content.FileProvider"
  1582.     android:authorities="${applicationId}.fileprovider"
  1583.     android:exported="false"
  1584.     android:grantUriPermissions="true">
  1585.     <meta-data
  1586.         android:name="android.support.FILE_PROVIDER_PATHS"
  1587.         android:resource="@xml/file_paths" />
  1588. </provider>logI('UpdateService', '找到缓存的新版本APK: $cachedApkVersion');
  1589. <provider
  1590.     android:name="androidx.core.content.FileProvider"
  1591.     android:authorities="${applicationId}.fileprovider"
  1592.     android:exported="false"
  1593.     android:grantUriPermissions="true">
  1594.     <meta-data
  1595.         android:name="android.support.FILE_PROVIDER_PATHS"
  1596.         android:resource="@xml/file_paths" />
  1597. </provider><provider
  1598.     android:name="androidx.core.content.FileProvider"
  1599.     android:authorities="${applicationId}.fileprovider"
  1600.     android:exported="false"
  1601.     android:grantUriPermissions="true">
  1602.     <meta-data
  1603.         android:name="android.support.FILE_PROVIDER_PATHS"
  1604.         android:resource="@xml/file_paths" />
  1605. </provider><provider
  1606.     android:name="androidx.core.content.FileProvider"
  1607.     android:authorities="${applicationId}.fileprovider"
  1608.     android:exported="false"
  1609.     android:grantUriPermissions="true">
  1610.     <meta-data
  1611.         android:name="android.support.FILE_PROVIDER_PATHS"
  1612.         android:resource="@xml/file_paths" />
  1613. </provider>return UpdateResult.cachedUpdate(
  1614. <provider
  1615.     android:name="androidx.core.content.FileProvider"
  1616.     android:authorities="${applicationId}.fileprovider"
  1617.     android:exported="false"
  1618.     android:grantUriPermissions="true">
  1619.     <meta-data
  1620.         android:name="android.support.FILE_PROVIDER_PATHS"
  1621.         android:resource="@xml/file_paths" />
  1622. </provider><provider
  1623.     android:name="androidx.core.content.FileProvider"
  1624.     android:authorities="${applicationId}.fileprovider"
  1625.     android:exported="false"
  1626.     android:grantUriPermissions="true">
  1627.     <meta-data
  1628.         android:name="android.support.FILE_PROVIDER_PATHS"
  1629.         android:resource="@xml/file_paths" />
  1630. </provider><provider
  1631.     android:name="androidx.core.content.FileProvider"
  1632.     android:authorities="${applicationId}.fileprovider"
  1633.     android:exported="false"
  1634.     android:grantUriPermissions="true">
  1635.     <meta-data
  1636.         android:name="android.support.FILE_PROVIDER_PATHS"
  1637.         android:resource="@xml/file_paths" />
  1638. </provider>  version: cachedApkVersion,
  1639. <provider
  1640.     android:name="androidx.core.content.FileProvider"
  1641.     android:authorities="${applicationId}.fileprovider"
  1642.     android:exported="false"
  1643.     android:grantUriPermissions="true">
  1644.     <meta-data
  1645.         android:name="android.support.FILE_PROVIDER_PATHS"
  1646.         android:resource="@xml/file_paths" />
  1647. </provider><provider
  1648.     android:name="androidx.core.content.FileProvider"
  1649.     android:authorities="${applicationId}.fileprovider"
  1650.     android:exported="false"
  1651.     android:grantUriPermissions="true">
  1652.     <meta-data
  1653.         android:name="android.support.FILE_PROVIDER_PATHS"
  1654.         android:resource="@xml/file_paths" />
  1655. </provider><provider
  1656.     android:name="androidx.core.content.FileProvider"
  1657.     android:authorities="${applicationId}.fileprovider"
  1658.     android:exported="false"
  1659.     android:grantUriPermissions="true">
  1660.     <meta-data
  1661.         android:name="android.support.FILE_PROVIDER_PATHS"
  1662.         android:resource="@xml/file_paths" />
  1663. </provider>  filePath: cachedApkPath,
  1664. <provider
  1665.     android:name="androidx.core.content.FileProvider"
  1666.     android:authorities="${applicationId}.fileprovider"
  1667.     android:exported="false"
  1668.     android:grantUriPermissions="true">
  1669.     <meta-data
  1670.         android:name="android.support.FILE_PROVIDER_PATHS"
  1671.         android:resource="@xml/file_paths" />
  1672. </provider><provider
  1673.     android:name="androidx.core.content.FileProvider"
  1674.     android:authorities="${applicationId}.fileprovider"
  1675.     android:exported="false"
  1676.     android:grantUriPermissions="true">
  1677.     <meta-data
  1678.         android:name="android.support.FILE_PROVIDER_PATHS"
  1679.         android:resource="@xml/file_paths" />
  1680. </provider><provider
  1681.     android:name="androidx.core.content.FileProvider"
  1682.     android:authorities="${applicationId}.fileprovider"
  1683.     android:exported="false"
  1684.     android:grantUriPermissions="true">
  1685.     <meta-data
  1686.         android:name="android.support.FILE_PROVIDER_PATHS"
  1687.         android:resource="@xml/file_paths" />
  1688. </provider>);
  1689. <provider
  1690.     android:name="androidx.core.content.FileProvider"
  1691.     android:authorities="${applicationId}.fileprovider"
  1692.     android:exported="false"
  1693.     android:grantUriPermissions="true">
  1694.     <meta-data
  1695.         android:name="android.support.FILE_PROVIDER_PATHS"
  1696.         android:resource="@xml/file_paths" />
  1697. </provider><provider
  1698.     android:name="androidx.core.content.FileProvider"
  1699.     android:authorities="${applicationId}.fileprovider"
  1700.     android:exported="false"
  1701.     android:grantUriPermissions="true">
  1702.     <meta-data
  1703.         android:name="android.support.FILE_PROVIDER_PATHS"
  1704.         android:resource="@xml/file_paths" />
  1705. </provider>  }
  1706. <provider
  1707.     android:name="androidx.core.content.FileProvider"
  1708.     android:authorities="${applicationId}.fileprovider"
  1709.     android:exported="false"
  1710.     android:grantUriPermissions="true">
  1711.     <meta-data
  1712.         android:name="android.support.FILE_PROVIDER_PATHS"
  1713.         android:resource="@xml/file_paths" />
  1714. </provider><provider
  1715.     android:name="androidx.core.content.FileProvider"
  1716.     android:authorities="${applicationId}.fileprovider"
  1717.     android:exported="false"
  1718.     android:grantUriPermissions="true">
  1719.     <meta-data
  1720.         android:name="android.support.FILE_PROVIDER_PATHS"
  1721.         android:resource="@xml/file_paths" />
  1722. </provider>} else {
  1723. <provider
  1724.     android:name="androidx.core.content.FileProvider"
  1725.     android:authorities="${applicationId}.fileprovider"
  1726.     android:exported="false"
  1727.     android:grantUriPermissions="true">
  1728.     <meta-data
  1729.         android:name="android.support.FILE_PROVIDER_PATHS"
  1730.         android:resource="@xml/file_paths" />
  1731. </provider><provider
  1732.     android:name="androidx.core.content.FileProvider"
  1733.     android:authorities="${applicationId}.fileprovider"
  1734.     android:exported="false"
  1735.     android:grantUriPermissions="true">
  1736.     <meta-data
  1737.         android:name="android.support.FILE_PROVIDER_PATHS"
  1738.         android:resource="@xml/file_paths" />
  1739. </provider>  // 清理无效的缓存记录
  1740. <provider
  1741.     android:name="androidx.core.content.FileProvider"
  1742.     android:authorities="${applicationId}.fileprovider"
  1743.     android:exported="false"
  1744.     android:grantUriPermissions="true">
  1745.     <meta-data
  1746.         android:name="android.support.FILE_PROVIDER_PATHS"
  1747.         android:resource="@xml/file_paths" />
  1748. </provider><provider
  1749.     android:name="androidx.core.content.FileProvider"
  1750.     android:authorities="${applicationId}.fileprovider"
  1751.     android:exported="false"
  1752.     android:grantUriPermissions="true">
  1753.     <meta-data
  1754.         android:name="android.support.FILE_PROVIDER_PATHS"
  1755.         android:resource="@xml/file_paths" />
  1756. </provider>  await prefs.remove(_cachedApkPathKey);
  1757. <provider
  1758.     android:name="androidx.core.content.FileProvider"
  1759.     android:authorities="${applicationId}.fileprovider"
  1760.     android:exported="false"
  1761.     android:grantUriPermissions="true">
  1762.     <meta-data
  1763.         android:name="android.support.FILE_PROVIDER_PATHS"
  1764.         android:resource="@xml/file_paths" />
  1765. </provider><provider
  1766.     android:name="androidx.core.content.FileProvider"
  1767.     android:authorities="${applicationId}.fileprovider"
  1768.     android:exported="false"
  1769.     android:grantUriPermissions="true">
  1770.     <meta-data
  1771.         android:name="android.support.FILE_PROVIDER_PATHS"
  1772.         android:resource="@xml/file_paths" />
  1773. </provider>  await prefs.remove(_cachedApkVersionKey);
  1774. <provider
  1775.     android:name="androidx.core.content.FileProvider"
  1776.     android:authorities="${applicationId}.fileprovider"
  1777.     android:exported="false"
  1778.     android:grantUriPermissions="true">
  1779.     <meta-data
  1780.         android:name="android.support.FILE_PROVIDER_PATHS"
  1781.         android:resource="@xml/file_paths" />
  1782. </provider><provider
  1783.     android:name="androidx.core.content.FileProvider"
  1784.     android:authorities="${applicationId}.fileprovider"
  1785.     android:exported="false"
  1786.     android:grantUriPermissions="true">
  1787.     <meta-data
  1788.         android:name="android.support.FILE_PROVIDER_PATHS"
  1789.         android:resource="@xml/file_paths" />
  1790. </provider>}
  1791. <provider
  1792.     android:name="androidx.core.content.FileProvider"
  1793.     android:authorities="${applicationId}.fileprovider"
  1794.     android:exported="false"
  1795.     android:grantUriPermissions="true">
  1796.     <meta-data
  1797.         android:name="android.support.FILE_PROVIDER_PATHS"
  1798.         android:resource="@xml/file_paths" />
  1799. </provider>  }
  1800. <provider
  1801.     android:name="androidx.core.content.FileProvider"
  1802.     android:authorities="${applicationId}.fileprovider"
  1803.     android:exported="false"
  1804.     android:grantUriPermissions="true">
  1805.     <meta-data
  1806.         android:name="android.support.FILE_PROVIDER_PATHS"
  1807.         android:resource="@xml/file_paths" />
  1808. </provider>} catch (e) {
  1809. <provider
  1810.     android:name="androidx.core.content.FileProvider"
  1811.     android:authorities="${applicationId}.fileprovider"
  1812.     android:exported="false"
  1813.     android:grantUriPermissions="true">
  1814.     <meta-data
  1815.         android:name="android.support.FILE_PROVIDER_PATHS"
  1816.         android:resource="@xml/file_paths" />
  1817. </provider>  logE('UpdateService', '检查缓存APK失败', e);
  1818. <provider
  1819.     android:name="androidx.core.content.FileProvider"
  1820.     android:authorities="${applicationId}.fileprovider"
  1821.     android:exported="false"
  1822.     android:grantUriPermissions="true">
  1823.     <meta-data
  1824.         android:name="android.support.FILE_PROVIDER_PATHS"
  1825.         android:resource="@xml/file_paths" />
  1826. </provider>}
  1827. <provider
  1828.     android:name="androidx.core.content.FileProvider"
  1829.     android:authorities="${applicationId}.fileprovider"
  1830.     android:exported="false"
  1831.     android:grantUriPermissions="true">
  1832.     <meta-data
  1833.         android:name="android.support.FILE_PROVIDER_PATHS"
  1834.         android:resource="@xml/file_paths" />
  1835. </provider>return null;
  1836.   }
  1837.   /// 版本号比较
  1838.   static int _compareVersions(String v1, String v2) {
  1839. <provider
  1840.     android:name="androidx.core.content.FileProvider"
  1841.     android:authorities="${applicationId}.fileprovider"
  1842.     android:exported="false"
  1843.     android:grantUriPermissions="true">
  1844.     <meta-data
  1845.         android:name="android.support.FILE_PROVIDER_PATHS"
  1846.         android:resource="@xml/file_paths" />
  1847. </provider>final parts1 = v1.split('.').map(int.parse).toList();
  1848. <provider
  1849.     android:name="androidx.core.content.FileProvider"
  1850.     android:authorities="${applicationId}.fileprovider"
  1851.     android:exported="false"
  1852.     android:grantUriPermissions="true">
  1853.     <meta-data
  1854.         android:name="android.support.FILE_PROVIDER_PATHS"
  1855.         android:resource="@xml/file_paths" />
  1856. </provider>final parts2 = v2.split('.').map(int.parse).toList();
  1857. <provider
  1858.     android:name="androidx.core.content.FileProvider"
  1859.     android:authorities="${applicationId}.fileprovider"
  1860.     android:exported="false"
  1861.     android:grantUriPermissions="true">
  1862.     <meta-data
  1863.         android:name="android.support.FILE_PROVIDER_PATHS"
  1864.         android:resource="@xml/file_paths" />
  1865. </provider>final maxLength = math.max(parts1.length, parts2.length);
  1866. <provider
  1867.     android:name="androidx.core.content.FileProvider"
  1868.     android:authorities="${applicationId}.fileprovider"
  1869.     android:exported="false"
  1870.     android:grantUriPermissions="true">
  1871.     <meta-data
  1872.         android:name="android.support.FILE_PROVIDER_PATHS"
  1873.         android:resource="@xml/file_paths" />
  1874. </provider>// 补齐长度
  1875. <provider
  1876.     android:name="androidx.core.content.FileProvider"
  1877.     android:authorities="${applicationId}.fileprovider"
  1878.     android:exported="false"
  1879.     android:grantUriPermissions="true">
  1880.     <meta-data
  1881.         android:name="android.support.FILE_PROVIDER_PATHS"
  1882.         android:resource="@xml/file_paths" />
  1883. </provider>while (parts1.length < maxLength) parts1.add(0);
  1884. <provider
  1885.     android:name="androidx.core.content.FileProvider"
  1886.     android:authorities="${applicationId}.fileprovider"
  1887.     android:exported="false"
  1888.     android:grantUriPermissions="true">
  1889.     <meta-data
  1890.         android:name="android.support.FILE_PROVIDER_PATHS"
  1891.         android:resource="@xml/file_paths" />
  1892. </provider>while (parts2.length < maxLength) parts2.add(0);
  1893. <provider
  1894.     android:name="androidx.core.content.FileProvider"
  1895.     android:authorities="${applicationId}.fileprovider"
  1896.     android:exported="false"
  1897.     android:grantUriPermissions="true">
  1898.     <meta-data
  1899.         android:name="android.support.FILE_PROVIDER_PATHS"
  1900.         android:resource="@xml/file_paths" />
  1901. </provider>for (int i = 0; i < maxLength; i++) {
  1902. <provider
  1903.     android:name="androidx.core.content.FileProvider"
  1904.     android:authorities="${applicationId}.fileprovider"
  1905.     android:exported="false"
  1906.     android:grantUriPermissions="true">
  1907.     <meta-data
  1908.         android:name="android.support.FILE_PROVIDER_PATHS"
  1909.         android:resource="@xml/file_paths" />
  1910. </provider>  if (parts1[i] > parts2[i]) return 1;
  1911. <provider
  1912.     android:name="androidx.core.content.FileProvider"
  1913.     android:authorities="${applicationId}.fileprovider"
  1914.     android:exported="false"
  1915.     android:grantUriPermissions="true">
  1916.     <meta-data
  1917.         android:name="android.support.FILE_PROVIDER_PATHS"
  1918.         android:resource="@xml/file_paths" />
  1919. </provider>  if (parts1[i] < parts2[i]) return -1;
  1920. <provider
  1921.     android:name="androidx.core.content.FileProvider"
  1922.     android:authorities="${applicationId}.fileprovider"
  1923.     android:exported="false"
  1924.     android:grantUriPermissions="true">
  1925.     <meta-data
  1926.         android:name="android.support.FILE_PROVIDER_PATHS"
  1927.         android:resource="@xml/file_paths" />
  1928. </provider>}
  1929. <provider
  1930.     android:name="androidx.core.content.FileProvider"
  1931.     android:authorities="${applicationId}.fileprovider"
  1932.     android:exported="false"
  1933.     android:grantUriPermissions="true">
  1934.     <meta-data
  1935.         android:name="android.support.FILE_PROVIDER_PATHS"
  1936.         android:resource="@xml/file_paths" />
  1937. </provider>return 0;
  1938.   }
  1939.   /// 规范化版本号
  1940.   static String _normalizeVersion(String version) {
  1941. <provider
  1942.     android:name="androidx.core.content.FileProvider"
  1943.     android:authorities="${applicationId}.fileprovider"
  1944.     android:exported="false"
  1945.     android:grantUriPermissions="true">
  1946.     <meta-data
  1947.         android:name="android.support.FILE_PROVIDER_PATHS"
  1948.         android:resource="@xml/file_paths" />
  1949. </provider>// 移除v前缀和构建后缀
  1950. <provider
  1951.     android:name="androidx.core.content.FileProvider"
  1952.     android:authorities="${applicationId}.fileprovider"
  1953.     android:exported="false"
  1954.     android:grantUriPermissions="true">
  1955.     <meta-data
  1956.         android:name="android.support.FILE_PROVIDER_PATHS"
  1957.         android:resource="@xml/file_paths" />
  1958. </provider>String normalized = version.replaceAll(RegExp(r'^v'), '');
  1959. <provider
  1960.     android:name="androidx.core.content.FileProvider"
  1961.     android:authorities="${applicationId}.fileprovider"
  1962.     android:exported="false"
  1963.     android:grantUriPermissions="true">
  1964.     <meta-data
  1965.         android:name="android.support.FILE_PROVIDER_PATHS"
  1966.         android:resource="@xml/file_paths" />
  1967. </provider>normalized = normalized.replaceAll(RegExp(r'-.*$'), '');
  1968. <provider
  1969.     android:name="androidx.core.content.FileProvider"
  1970.     android:authorities="${applicationId}.fileprovider"
  1971.     android:exported="false"
  1972.     android:grantUriPermissions="true">
  1973.     <meta-data
  1974.         android:name="android.support.FILE_PROVIDER_PATHS"
  1975.         android:resource="@xml/file_paths" />
  1976. </provider>return normalized;
  1977.   }
  1978. }
复制代码
APK下载实现
  1. /// 下载APK文件
  2. static Future<UpdateResult> _downloadApk(
  3.   BuildContext context,
  4.   String url,
  5.   String fileName, {
  6.   Function(double progress, String status)? onProgress,
  7. }) async {
  8.   try {
  9. <provider
  10.     android:name="androidx.core.content.FileProvider"
  11.     android:authorities="${applicationId}.fileprovider"
  12.     android:exported="false"
  13.     android:grantUriPermissions="true">
  14.     <meta-data
  15.         android:name="android.support.FILE_PROVIDER_PATHS"
  16.         android:resource="@xml/file_paths" />
  17. </provider>// 获取下载目录
  18. <provider
  19.     android:name="androidx.core.content.FileProvider"
  20.     android:authorities="${applicationId}.fileprovider"
  21.     android:exported="false"
  22.     android:grantUriPermissions="true">
  23.     <meta-data
  24.         android:name="android.support.FILE_PROVIDER_PATHS"
  25.         android:resource="@xml/file_paths" />
  26. </provider>Directory? downloadDir;
  27. <provider
  28.     android:name="androidx.core.content.FileProvider"
  29.     android:authorities="${applicationId}.fileprovider"
  30.     android:exported="false"
  31.     android:grantUriPermissions="true">
  32.     <meta-data
  33.         android:name="android.support.FILE_PROVIDER_PATHS"
  34.         android:resource="@xml/file_paths" />
  35. </provider>if (Platform.isAndroid) {
  36. <provider
  37.     android:name="androidx.core.content.FileProvider"
  38.     android:authorities="${applicationId}.fileprovider"
  39.     android:exported="false"
  40.     android:grantUriPermissions="true">
  41.     <meta-data
  42.         android:name="android.support.FILE_PROVIDER_PATHS"
  43.         android:resource="@xml/file_paths" />
  44. </provider>  downloadDir = await getExternalStorageDirectory();
  45. <provider
  46.     android:name="androidx.core.content.FileProvider"
  47.     android:authorities="${applicationId}.fileprovider"
  48.     android:exported="false"
  49.     android:grantUriPermissions="true">
  50.     <meta-data
  51.         android:name="android.support.FILE_PROVIDER_PATHS"
  52.         android:resource="@xml/file_paths" />
  53. </provider>}
  54. <provider
  55.     android:name="androidx.core.content.FileProvider"
  56.     android:authorities="${applicationId}.fileprovider"
  57.     android:exported="false"
  58.     android:grantUriPermissions="true">
  59.     <meta-data
  60.         android:name="android.support.FILE_PROVIDER_PATHS"
  61.         android:resource="@xml/file_paths" />
  62. </provider>downloadDir ??= await getApplicationDocumentsDirectory();
  63. <provider
  64.     android:name="androidx.core.content.FileProvider"
  65.     android:authorities="${applicationId}.fileprovider"
  66.     android:exported="false"
  67.     android:grantUriPermissions="true">
  68.     <meta-data
  69.         android:name="android.support.FILE_PROVIDER_PATHS"
  70.         android:resource="@xml/file_paths" />
  71. </provider>final filePath = '${downloadDir.path}/BeeCount_$fileName.apk';
  72. <provider
  73.     android:name="androidx.core.content.FileProvider"
  74.     android:authorities="${applicationId}.fileprovider"
  75.     android:exported="false"
  76.     android:grantUriPermissions="true">
  77.     <meta-data
  78.         android:name="android.support.FILE_PROVIDER_PATHS"
  79.         android:resource="@xml/file_paths" />
  80. </provider>logI('UpdateService', '下载路径: $filePath');
  81. <provider
  82.     android:name="androidx.core.content.FileProvider"
  83.     android:authorities="${applicationId}.fileprovider"
  84.     android:exported="false"
  85.     android:grantUriPermissions="true">
  86.     <meta-data
  87.         android:name="android.support.FILE_PROVIDER_PATHS"
  88.         android:resource="@xml/file_paths" />
  89. </provider>// 删除已存在的文件
  90. <provider
  91.     android:name="androidx.core.content.FileProvider"
  92.     android:authorities="${applicationId}.fileprovider"
  93.     android:exported="false"
  94.     android:grantUriPermissions="true">
  95.     <meta-data
  96.         android:name="android.support.FILE_PROVIDER_PATHS"
  97.         android:resource="@xml/file_paths" />
  98. </provider>final file = File(filePath);
  99. <provider
  100.     android:name="androidx.core.content.FileProvider"
  101.     android:authorities="${applicationId}.fileprovider"
  102.     android:exported="false"
  103.     android:grantUriPermissions="true">
  104.     <meta-data
  105.         android:name="android.support.FILE_PROVIDER_PATHS"
  106.         android:resource="@xml/file_paths" />
  107. </provider>if (await file.exists()) {
  108. <provider
  109.     android:name="androidx.core.content.FileProvider"
  110.     android:authorities="${applicationId}.fileprovider"
  111.     android:exported="false"
  112.     android:grantUriPermissions="true">
  113.     <meta-data
  114.         android:name="android.support.FILE_PROVIDER_PATHS"
  115.         android:resource="@xml/file_paths" />
  116. </provider>  logI('UpdateService', '删除已存在的同版本文件: $filePath');
  117. <provider
  118.     android:name="androidx.core.content.FileProvider"
  119.     android:authorities="${applicationId}.fileprovider"
  120.     android:exported="false"
  121.     android:grantUriPermissions="true">
  122.     <meta-data
  123.         android:name="android.support.FILE_PROVIDER_PATHS"
  124.         android:resource="@xml/file_paths" />
  125. </provider>  await file.delete();
  126. <provider
  127.     android:name="androidx.core.content.FileProvider"
  128.     android:authorities="${applicationId}.fileprovider"
  129.     android:exported="false"
  130.     android:grantUriPermissions="true">
  131.     <meta-data
  132.         android:name="android.support.FILE_PROVIDER_PATHS"
  133.         android:resource="@xml/file_paths" />
  134. </provider>}
  135. <provider
  136.     android:name="androidx.core.content.FileProvider"
  137.     android:authorities="${applicationId}.fileprovider"
  138.     android:exported="false"
  139.     android:grantUriPermissions="true">
  140.     <meta-data
  141.         android:name="android.support.FILE_PROVIDER_PATHS"
  142.         android:resource="@xml/file_paths" />
  143. </provider>// 显示下载进度对话框和通知
  144. <provider
  145.     android:name="androidx.core.content.FileProvider"
  146.     android:authorities="${applicationId}.fileprovider"
  147.     android:exported="false"
  148.     android:grantUriPermissions="true">
  149.     <meta-data
  150.         android:name="android.support.FILE_PROVIDER_PATHS"
  151.         android:resource="@xml/file_paths" />
  152. </provider>double progress = 0.0;
  153. <provider
  154.     android:name="androidx.core.content.FileProvider"
  155.     android:authorities="${applicationId}.fileprovider"
  156.     android:exported="false"
  157.     android:grantUriPermissions="true">
  158.     <meta-data
  159.         android:name="android.support.FILE_PROVIDER_PATHS"
  160.         android:resource="@xml/file_paths" />
  161. </provider>bool cancelled = false;
  162. <provider
  163.     android:name="androidx.core.content.FileProvider"
  164.     android:authorities="${applicationId}.fileprovider"
  165.     android:exported="false"
  166.     android:grantUriPermissions="true">
  167.     <meta-data
  168.         android:name="android.support.FILE_PROVIDER_PATHS"
  169.         android:resource="@xml/file_paths" />
  170. </provider>late StateSetter dialogSetState;
  171. <provider
  172.     android:name="androidx.core.content.FileProvider"
  173.     android:authorities="${applicationId}.fileprovider"
  174.     android:exported="false"
  175.     android:grantUriPermissions="true">
  176.     <meta-data
  177.         android:name="android.support.FILE_PROVIDER_PATHS"
  178.         android:resource="@xml/file_paths" />
  179. </provider>final cancelToken = CancelToken();
  180. <provider
  181.     android:name="androidx.core.content.FileProvider"
  182.     android:authorities="${applicationId}.fileprovider"
  183.     android:exported="false"
  184.     android:grantUriPermissions="true">
  185.     <meta-data
  186.         android:name="android.support.FILE_PROVIDER_PATHS"
  187.         android:resource="@xml/file_paths" />
  188. </provider>// 显示初始通知
  189. <provider
  190.     android:name="androidx.core.content.FileProvider"
  191.     android:authorities="${applicationId}.fileprovider"
  192.     android:exported="false"
  193.     android:grantUriPermissions="true">
  194.     <meta-data
  195.         android:name="android.support.FILE_PROVIDER_PATHS"
  196.         android:resource="@xml/file_paths" />
  197. </provider>await _showProgressNotification(0, indeterminate: false);
  198. <provider
  199.     android:name="androidx.core.content.FileProvider"
  200.     android:authorities="${applicationId}.fileprovider"
  201.     android:exported="false"
  202.     android:grantUriPermissions="true">
  203.     <meta-data
  204.         android:name="android.support.FILE_PROVIDER_PATHS"
  205.         android:resource="@xml/file_paths" />
  206. </provider>if (context.mounted) {
  207. <provider
  208.     android:name="androidx.core.content.FileProvider"
  209.     android:authorities="${applicationId}.fileprovider"
  210.     android:exported="false"
  211.     android:grantUriPermissions="true">
  212.     <meta-data
  213.         android:name="android.support.FILE_PROVIDER_PATHS"
  214.         android:resource="@xml/file_paths" />
  215. </provider>  showDialog(
  216. <provider
  217.     android:name="androidx.core.content.FileProvider"
  218.     android:authorities="${applicationId}.fileprovider"
  219.     android:exported="false"
  220.     android:grantUriPermissions="true">
  221.     <meta-data
  222.         android:name="android.support.FILE_PROVIDER_PATHS"
  223.         android:resource="@xml/file_paths" />
  224. </provider><provider
  225.     android:name="androidx.core.content.FileProvider"
  226.     android:authorities="${applicationId}.fileprovider"
  227.     android:exported="false"
  228.     android:grantUriPermissions="true">
  229.     <meta-data
  230.         android:name="android.support.FILE_PROVIDER_PATHS"
  231.         android:resource="@xml/file_paths" />
  232. </provider>context: context,
  233. <provider
  234.     android:name="androidx.core.content.FileProvider"
  235.     android:authorities="${applicationId}.fileprovider"
  236.     android:exported="false"
  237.     android:grantUriPermissions="true">
  238.     <meta-data
  239.         android:name="android.support.FILE_PROVIDER_PATHS"
  240.         android:resource="@xml/file_paths" />
  241. </provider><provider
  242.     android:name="androidx.core.content.FileProvider"
  243.     android:authorities="${applicationId}.fileprovider"
  244.     android:exported="false"
  245.     android:grantUriPermissions="true">
  246.     <meta-data
  247.         android:name="android.support.FILE_PROVIDER_PATHS"
  248.         android:resource="@xml/file_paths" />
  249. </provider>barrierDismissible: false,
  250. <provider
  251.     android:name="androidx.core.content.FileProvider"
  252.     android:authorities="${applicationId}.fileprovider"
  253.     android:exported="false"
  254.     android:grantUriPermissions="true">
  255.     <meta-data
  256.         android:name="android.support.FILE_PROVIDER_PATHS"
  257.         android:resource="@xml/file_paths" />
  258. </provider><provider
  259.     android:name="androidx.core.content.FileProvider"
  260.     android:authorities="${applicationId}.fileprovider"
  261.     android:exported="false"
  262.     android:grantUriPermissions="true">
  263.     <meta-data
  264.         android:name="android.support.FILE_PROVIDER_PATHS"
  265.         android:resource="@xml/file_paths" />
  266. </provider>builder: (context) => StatefulBuilder(
  267. <provider
  268.     android:name="androidx.core.content.FileProvider"
  269.     android:authorities="${applicationId}.fileprovider"
  270.     android:exported="false"
  271.     android:grantUriPermissions="true">
  272.     <meta-data
  273.         android:name="android.support.FILE_PROVIDER_PATHS"
  274.         android:resource="@xml/file_paths" />
  275. </provider><provider
  276.     android:name="androidx.core.content.FileProvider"
  277.     android:authorities="${applicationId}.fileprovider"
  278.     android:exported="false"
  279.     android:grantUriPermissions="true">
  280.     <meta-data
  281.         android:name="android.support.FILE_PROVIDER_PATHS"
  282.         android:resource="@xml/file_paths" />
  283. </provider>  builder: (context, setState) {
  284. <provider
  285.     android:name="androidx.core.content.FileProvider"
  286.     android:authorities="${applicationId}.fileprovider"
  287.     android:exported="false"
  288.     android:grantUriPermissions="true">
  289.     <meta-data
  290.         android:name="android.support.FILE_PROVIDER_PATHS"
  291.         android:resource="@xml/file_paths" />
  292. </provider><provider
  293.     android:name="androidx.core.content.FileProvider"
  294.     android:authorities="${applicationId}.fileprovider"
  295.     android:exported="false"
  296.     android:grantUriPermissions="true">
  297.     <meta-data
  298.         android:name="android.support.FILE_PROVIDER_PATHS"
  299.         android:resource="@xml/file_paths" />
  300. </provider><provider
  301.     android:name="androidx.core.content.FileProvider"
  302.     android:authorities="${applicationId}.fileprovider"
  303.     android:exported="false"
  304.     android:grantUriPermissions="true">
  305.     <meta-data
  306.         android:name="android.support.FILE_PROVIDER_PATHS"
  307.         android:resource="@xml/file_paths" />
  308. </provider>dialogSetState = setState;
  309. <provider
  310.     android:name="androidx.core.content.FileProvider"
  311.     android:authorities="${applicationId}.fileprovider"
  312.     android:exported="false"
  313.     android:grantUriPermissions="true">
  314.     <meta-data
  315.         android:name="android.support.FILE_PROVIDER_PATHS"
  316.         android:resource="@xml/file_paths" />
  317. </provider><provider
  318.     android:name="androidx.core.content.FileProvider"
  319.     android:authorities="${applicationId}.fileprovider"
  320.     android:exported="false"
  321.     android:grantUriPermissions="true">
  322.     <meta-data
  323.         android:name="android.support.FILE_PROVIDER_PATHS"
  324.         android:resource="@xml/file_paths" />
  325. </provider><provider
  326.     android:name="androidx.core.content.FileProvider"
  327.     android:authorities="${applicationId}.fileprovider"
  328.     android:exported="false"
  329.     android:grantUriPermissions="true">
  330.     <meta-data
  331.         android:name="android.support.FILE_PROVIDER_PATHS"
  332.         android:resource="@xml/file_paths" />
  333. </provider>return AlertDialog(
  334. <provider
  335.     android:name="androidx.core.content.FileProvider"
  336.     android:authorities="${applicationId}.fileprovider"
  337.     android:exported="false"
  338.     android:grantUriPermissions="true">
  339.     <meta-data
  340.         android:name="android.support.FILE_PROVIDER_PATHS"
  341.         android:resource="@xml/file_paths" />
  342. </provider><provider
  343.     android:name="androidx.core.content.FileProvider"
  344.     android:authorities="${applicationId}.fileprovider"
  345.     android:exported="false"
  346.     android:grantUriPermissions="true">
  347.     <meta-data
  348.         android:name="android.support.FILE_PROVIDER_PATHS"
  349.         android:resource="@xml/file_paths" />
  350. </provider><provider
  351.     android:name="androidx.core.content.FileProvider"
  352.     android:authorities="${applicationId}.fileprovider"
  353.     android:exported="false"
  354.     android:grantUriPermissions="true">
  355.     <meta-data
  356.         android:name="android.support.FILE_PROVIDER_PATHS"
  357.         android:resource="@xml/file_paths" />
  358. </provider>  title: const Text('下载更新'),
  359. <provider
  360.     android:name="androidx.core.content.FileProvider"
  361.     android:authorities="${applicationId}.fileprovider"
  362.     android:exported="false"
  363.     android:grantUriPermissions="true">
  364.     <meta-data
  365.         android:name="android.support.FILE_PROVIDER_PATHS"
  366.         android:resource="@xml/file_paths" />
  367. </provider><provider
  368.     android:name="androidx.core.content.FileProvider"
  369.     android:authorities="${applicationId}.fileprovider"
  370.     android:exported="false"
  371.     android:grantUriPermissions="true">
  372.     <meta-data
  373.         android:name="android.support.FILE_PROVIDER_PATHS"
  374.         android:resource="@xml/file_paths" />
  375. </provider><provider
  376.     android:name="androidx.core.content.FileProvider"
  377.     android:authorities="${applicationId}.fileprovider"
  378.     android:exported="false"
  379.     android:grantUriPermissions="true">
  380.     <meta-data
  381.         android:name="android.support.FILE_PROVIDER_PATHS"
  382.         android:resource="@xml/file_paths" />
  383. </provider>  content: Column(
  384. <provider
  385.     android:name="androidx.core.content.FileProvider"
  386.     android:authorities="${applicationId}.fileprovider"
  387.     android:exported="false"
  388.     android:grantUriPermissions="true">
  389.     <meta-data
  390.         android:name="android.support.FILE_PROVIDER_PATHS"
  391.         android:resource="@xml/file_paths" />
  392. </provider><provider
  393.     android:name="androidx.core.content.FileProvider"
  394.     android:authorities="${applicationId}.fileprovider"
  395.     android:exported="false"
  396.     android:grantUriPermissions="true">
  397.     <meta-data
  398.         android:name="android.support.FILE_PROVIDER_PATHS"
  399.         android:resource="@xml/file_paths" />
  400. </provider><provider
  401.     android:name="androidx.core.content.FileProvider"
  402.     android:authorities="${applicationId}.fileprovider"
  403.     android:exported="false"
  404.     android:grantUriPermissions="true">
  405.     <meta-data
  406.         android:name="android.support.FILE_PROVIDER_PATHS"
  407.         android:resource="@xml/file_paths" />
  408. </provider><provider
  409.     android:name="androidx.core.content.FileProvider"
  410.     android:authorities="${applicationId}.fileprovider"
  411.     android:exported="false"
  412.     android:grantUriPermissions="true">
  413.     <meta-data
  414.         android:name="android.support.FILE_PROVIDER_PATHS"
  415.         android:resource="@xml/file_paths" />
  416. </provider>mainAxisSize: MainAxisSize.min,
  417. <provider
  418.     android:name="androidx.core.content.FileProvider"
  419.     android:authorities="${applicationId}.fileprovider"
  420.     android:exported="false"
  421.     android:grantUriPermissions="true">
  422.     <meta-data
  423.         android:name="android.support.FILE_PROVIDER_PATHS"
  424.         android:resource="@xml/file_paths" />
  425. </provider><provider
  426.     android:name="androidx.core.content.FileProvider"
  427.     android:authorities="${applicationId}.fileprovider"
  428.     android:exported="false"
  429.     android:grantUriPermissions="true">
  430.     <meta-data
  431.         android:name="android.support.FILE_PROVIDER_PATHS"
  432.         android:resource="@xml/file_paths" />
  433. </provider><provider
  434.     android:name="androidx.core.content.FileProvider"
  435.     android:authorities="${applicationId}.fileprovider"
  436.     android:exported="false"
  437.     android:grantUriPermissions="true">
  438.     <meta-data
  439.         android:name="android.support.FILE_PROVIDER_PATHS"
  440.         android:resource="@xml/file_paths" />
  441. </provider><provider
  442.     android:name="androidx.core.content.FileProvider"
  443.     android:authorities="${applicationId}.fileprovider"
  444.     android:exported="false"
  445.     android:grantUriPermissions="true">
  446.     <meta-data
  447.         android:name="android.support.FILE_PROVIDER_PATHS"
  448.         android:resource="@xml/file_paths" />
  449. </provider>children: [
  450. <provider
  451.     android:name="androidx.core.content.FileProvider"
  452.     android:authorities="${applicationId}.fileprovider"
  453.     android:exported="false"
  454.     android:grantUriPermissions="true">
  455.     <meta-data
  456.         android:name="android.support.FILE_PROVIDER_PATHS"
  457.         android:resource="@xml/file_paths" />
  458. </provider><provider
  459.     android:name="androidx.core.content.FileProvider"
  460.     android:authorities="${applicationId}.fileprovider"
  461.     android:exported="false"
  462.     android:grantUriPermissions="true">
  463.     <meta-data
  464.         android:name="android.support.FILE_PROVIDER_PATHS"
  465.         android:resource="@xml/file_paths" />
  466. </provider><provider
  467.     android:name="androidx.core.content.FileProvider"
  468.     android:authorities="${applicationId}.fileprovider"
  469.     android:exported="false"
  470.     android:grantUriPermissions="true">
  471.     <meta-data
  472.         android:name="android.support.FILE_PROVIDER_PATHS"
  473.         android:resource="@xml/file_paths" />
  474. </provider><provider
  475.     android:name="androidx.core.content.FileProvider"
  476.     android:authorities="${applicationId}.fileprovider"
  477.     android:exported="false"
  478.     android:grantUriPermissions="true">
  479.     <meta-data
  480.         android:name="android.support.FILE_PROVIDER_PATHS"
  481.         android:resource="@xml/file_paths" />
  482. </provider>  Text('下载中: ${(progress * 100).toStringAsFixed(1)}%'),
  483. <provider
  484.     android:name="androidx.core.content.FileProvider"
  485.     android:authorities="${applicationId}.fileprovider"
  486.     android:exported="false"
  487.     android:grantUriPermissions="true">
  488.     <meta-data
  489.         android:name="android.support.FILE_PROVIDER_PATHS"
  490.         android:resource="@xml/file_paths" />
  491. </provider><provider
  492.     android:name="androidx.core.content.FileProvider"
  493.     android:authorities="${applicationId}.fileprovider"
  494.     android:exported="false"
  495.     android:grantUriPermissions="true">
  496.     <meta-data
  497.         android:name="android.support.FILE_PROVIDER_PATHS"
  498.         android:resource="@xml/file_paths" />
  499. </provider><provider
  500.     android:name="androidx.core.content.FileProvider"
  501.     android:authorities="${applicationId}.fileprovider"
  502.     android:exported="false"
  503.     android:grantUriPermissions="true">
  504.     <meta-data
  505.         android:name="android.support.FILE_PROVIDER_PATHS"
  506.         android:resource="@xml/file_paths" />
  507. </provider><provider
  508.     android:name="androidx.core.content.FileProvider"
  509.     android:authorities="${applicationId}.fileprovider"
  510.     android:exported="false"
  511.     android:grantUriPermissions="true">
  512.     <meta-data
  513.         android:name="android.support.FILE_PROVIDER_PATHS"
  514.         android:resource="@xml/file_paths" />
  515. </provider>  const SizedBox(height: 16),
  516. <provider
  517.     android:name="androidx.core.content.FileProvider"
  518.     android:authorities="${applicationId}.fileprovider"
  519.     android:exported="false"
  520.     android:grantUriPermissions="true">
  521.     <meta-data
  522.         android:name="android.support.FILE_PROVIDER_PATHS"
  523.         android:resource="@xml/file_paths" />
  524. </provider><provider
  525.     android:name="androidx.core.content.FileProvider"
  526.     android:authorities="${applicationId}.fileprovider"
  527.     android:exported="false"
  528.     android:grantUriPermissions="true">
  529.     <meta-data
  530.         android:name="android.support.FILE_PROVIDER_PATHS"
  531.         android:resource="@xml/file_paths" />
  532. </provider><provider
  533.     android:name="androidx.core.content.FileProvider"
  534.     android:authorities="${applicationId}.fileprovider"
  535.     android:exported="false"
  536.     android:grantUriPermissions="true">
  537.     <meta-data
  538.         android:name="android.support.FILE_PROVIDER_PATHS"
  539.         android:resource="@xml/file_paths" />
  540. </provider><provider
  541.     android:name="androidx.core.content.FileProvider"
  542.     android:authorities="${applicationId}.fileprovider"
  543.     android:exported="false"
  544.     android:grantUriPermissions="true">
  545.     <meta-data
  546.         android:name="android.support.FILE_PROVIDER_PATHS"
  547.         android:resource="@xml/file_paths" />
  548. </provider>  LinearProgressIndicator(value: progress),
  549. <provider
  550.     android:name="androidx.core.content.FileProvider"
  551.     android:authorities="${applicationId}.fileprovider"
  552.     android:exported="false"
  553.     android:grantUriPermissions="true">
  554.     <meta-data
  555.         android:name="android.support.FILE_PROVIDER_PATHS"
  556.         android:resource="@xml/file_paths" />
  557. </provider><provider
  558.     android:name="androidx.core.content.FileProvider"
  559.     android:authorities="${applicationId}.fileprovider"
  560.     android:exported="false"
  561.     android:grantUriPermissions="true">
  562.     <meta-data
  563.         android:name="android.support.FILE_PROVIDER_PATHS"
  564.         android:resource="@xml/file_paths" />
  565. </provider><provider
  566.     android:name="androidx.core.content.FileProvider"
  567.     android:authorities="${applicationId}.fileprovider"
  568.     android:exported="false"
  569.     android:grantUriPermissions="true">
  570.     <meta-data
  571.         android:name="android.support.FILE_PROVIDER_PATHS"
  572.         android:resource="@xml/file_paths" />
  573. </provider><provider
  574.     android:name="androidx.core.content.FileProvider"
  575.     android:authorities="${applicationId}.fileprovider"
  576.     android:exported="false"
  577.     android:grantUriPermissions="true">
  578.     <meta-data
  579.         android:name="android.support.FILE_PROVIDER_PATHS"
  580.         android:resource="@xml/file_paths" />
  581. </provider>  const SizedBox(height: 16),
  582. <provider
  583.     android:name="androidx.core.content.FileProvider"
  584.     android:authorities="${applicationId}.fileprovider"
  585.     android:exported="false"
  586.     android:grantUriPermissions="true">
  587.     <meta-data
  588.         android:name="android.support.FILE_PROVIDER_PATHS"
  589.         android:resource="@xml/file_paths" />
  590. </provider><provider
  591.     android:name="androidx.core.content.FileProvider"
  592.     android:authorities="${applicationId}.fileprovider"
  593.     android:exported="false"
  594.     android:grantUriPermissions="true">
  595.     <meta-data
  596.         android:name="android.support.FILE_PROVIDER_PATHS"
  597.         android:resource="@xml/file_paths" />
  598. </provider><provider
  599.     android:name="androidx.core.content.FileProvider"
  600.     android:authorities="${applicationId}.fileprovider"
  601.     android:exported="false"
  602.     android:grantUriPermissions="true">
  603.     <meta-data
  604.         android:name="android.support.FILE_PROVIDER_PATHS"
  605.         android:resource="@xml/file_paths" />
  606. </provider><provider
  607.     android:name="androidx.core.content.FileProvider"
  608.     android:authorities="${applicationId}.fileprovider"
  609.     android:exported="false"
  610.     android:grantUriPermissions="true">
  611.     <meta-data
  612.         android:name="android.support.FILE_PROVIDER_PATHS"
  613.         android:resource="@xml/file_paths" />
  614. </provider>  Row(
  615. <provider
  616.     android:name="androidx.core.content.FileProvider"
  617.     android:authorities="${applicationId}.fileprovider"
  618.     android:exported="false"
  619.     android:grantUriPermissions="true">
  620.     <meta-data
  621.         android:name="android.support.FILE_PROVIDER_PATHS"
  622.         android:resource="@xml/file_paths" />
  623. </provider><provider
  624.     android:name="androidx.core.content.FileProvider"
  625.     android:authorities="${applicationId}.fileprovider"
  626.     android:exported="false"
  627.     android:grantUriPermissions="true">
  628.     <meta-data
  629.         android:name="android.support.FILE_PROVIDER_PATHS"
  630.         android:resource="@xml/file_paths" />
  631. </provider><provider
  632.     android:name="androidx.core.content.FileProvider"
  633.     android:authorities="${applicationId}.fileprovider"
  634.     android:exported="false"
  635.     android:grantUriPermissions="true">
  636.     <meta-data
  637.         android:name="android.support.FILE_PROVIDER_PATHS"
  638.         android:resource="@xml/file_paths" />
  639. </provider><provider
  640.     android:name="androidx.core.content.FileProvider"
  641.     android:authorities="${applicationId}.fileprovider"
  642.     android:exported="false"
  643.     android:grantUriPermissions="true">
  644.     <meta-data
  645.         android:name="android.support.FILE_PROVIDER_PATHS"
  646.         android:resource="@xml/file_paths" />
  647. </provider><provider
  648.     android:name="androidx.core.content.FileProvider"
  649.     android:authorities="${applicationId}.fileprovider"
  650.     android:exported="false"
  651.     android:grantUriPermissions="true">
  652.     <meta-data
  653.         android:name="android.support.FILE_PROVIDER_PATHS"
  654.         android:resource="@xml/file_paths" />
  655. </provider>mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  656. <provider
  657.     android:name="androidx.core.content.FileProvider"
  658.     android:authorities="${applicationId}.fileprovider"
  659.     android:exported="false"
  660.     android:grantUriPermissions="true">
  661.     <meta-data
  662.         android:name="android.support.FILE_PROVIDER_PATHS"
  663.         android:resource="@xml/file_paths" />
  664. </provider><provider
  665.     android:name="androidx.core.content.FileProvider"
  666.     android:authorities="${applicationId}.fileprovider"
  667.     android:exported="false"
  668.     android:grantUriPermissions="true">
  669.     <meta-data
  670.         android:name="android.support.FILE_PROVIDER_PATHS"
  671.         android:resource="@xml/file_paths" />
  672. </provider><provider
  673.     android:name="androidx.core.content.FileProvider"
  674.     android:authorities="${applicationId}.fileprovider"
  675.     android:exported="false"
  676.     android:grantUriPermissions="true">
  677.     <meta-data
  678.         android:name="android.support.FILE_PROVIDER_PATHS"
  679.         android:resource="@xml/file_paths" />
  680. </provider><provider
  681.     android:name="androidx.core.content.FileProvider"
  682.     android:authorities="${applicationId}.fileprovider"
  683.     android:exported="false"
  684.     android:grantUriPermissions="true">
  685.     <meta-data
  686.         android:name="android.support.FILE_PROVIDER_PATHS"
  687.         android:resource="@xml/file_paths" />
  688. </provider><provider
  689.     android:name="androidx.core.content.FileProvider"
  690.     android:authorities="${applicationId}.fileprovider"
  691.     android:exported="false"
  692.     android:grantUriPermissions="true">
  693.     <meta-data
  694.         android:name="android.support.FILE_PROVIDER_PATHS"
  695.         android:resource="@xml/file_paths" />
  696. </provider>children: [
  697. <provider
  698.     android:name="androidx.core.content.FileProvider"
  699.     android:authorities="${applicationId}.fileprovider"
  700.     android:exported="false"
  701.     android:grantUriPermissions="true">
  702.     <meta-data
  703.         android:name="android.support.FILE_PROVIDER_PATHS"
  704.         android:resource="@xml/file_paths" />
  705. </provider><provider
  706.     android:name="androidx.core.content.FileProvider"
  707.     android:authorities="${applicationId}.fileprovider"
  708.     android:exported="false"
  709.     android:grantUriPermissions="true">
  710.     <meta-data
  711.         android:name="android.support.FILE_PROVIDER_PATHS"
  712.         android:resource="@xml/file_paths" />
  713. </provider><provider
  714.     android:name="androidx.core.content.FileProvider"
  715.     android:authorities="${applicationId}.fileprovider"
  716.     android:exported="false"
  717.     android:grantUriPermissions="true">
  718.     <meta-data
  719.         android:name="android.support.FILE_PROVIDER_PATHS"
  720.         android:resource="@xml/file_paths" />
  721. </provider><provider
  722.     android:name="androidx.core.content.FileProvider"
  723.     android:authorities="${applicationId}.fileprovider"
  724.     android:exported="false"
  725.     android:grantUriPermissions="true">
  726.     <meta-data
  727.         android:name="android.support.FILE_PROVIDER_PATHS"
  728.         android:resource="@xml/file_paths" />
  729. </provider><provider
  730.     android:name="androidx.core.content.FileProvider"
  731.     android:authorities="${applicationId}.fileprovider"
  732.     android:exported="false"
  733.     android:grantUriPermissions="true">
  734.     <meta-data
  735.         android:name="android.support.FILE_PROVIDER_PATHS"
  736.         android:resource="@xml/file_paths" />
  737. </provider>  TextButton(
  738. <?xml version="1.0" encoding="utf-8"?>
  739. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  740. <provider
  741.     android:name="androidx.core.content.FileProvider"
  742.     android:authorities="${applicationId}.fileprovider"
  743.     android:exported="false"
  744.     android:grantUriPermissions="true">
  745.     <meta-data
  746.         android:name="android.support.FILE_PROVIDER_PATHS"
  747.         android:resource="@xml/file_paths" />
  748. </provider>
  749. <provider
  750.     android:name="androidx.core.content.FileProvider"
  751.     android:authorities="${applicationId}.fileprovider"
  752.     android:exported="false"
  753.     android:grantUriPermissions="true">
  754.     <meta-data
  755.         android:name="android.support.FILE_PROVIDER_PATHS"
  756.         android:resource="@xml/file_paths" />
  757. </provider><cache-path name="apk_cache" path="apk/" />
  758. <provider
  759.     android:name="androidx.core.content.FileProvider"
  760.     android:authorities="${applicationId}.fileprovider"
  761.     android:exported="false"
  762.     android:grantUriPermissions="true">
  763.     <meta-data
  764.         android:name="android.support.FILE_PROVIDER_PATHS"
  765.         android:resource="@xml/file_paths" />
  766. </provider>
  767. <provider
  768.     android:name="androidx.core.content.FileProvider"
  769.     android:authorities="${applicationId}.fileprovider"
  770.     android:exported="false"
  771.     android:grantUriPermissions="true">
  772.     <meta-data
  773.         android:name="android.support.FILE_PROVIDER_PATHS"
  774.         android:resource="@xml/file_paths" />
  775. </provider><cache-path name="all_cache" path="." />
  776. <provider
  777.     android:name="androidx.core.content.FileProvider"
  778.     android:authorities="${applicationId}.fileprovider"
  779.     android:exported="false"
  780.     android:grantUriPermissions="true">
  781.     <meta-data
  782.         android:name="android.support.FILE_PROVIDER_PATHS"
  783.         android:resource="@xml/file_paths" />
  784. </provider>
  785. <provider
  786.     android:name="androidx.core.content.FileProvider"
  787.     android:authorities="${applicationId}.fileprovider"
  788.     android:exported="false"
  789.     android:grantUriPermissions="true">
  790.     <meta-data
  791.         android:name="android.support.FILE_PROVIDER_PATHS"
  792.         android:resource="@xml/file_paths" />
  793. </provider><external-files-path name="external_app_files" path="." />
  794. </paths>onPressed: () {
  795. <?xml version="1.0" encoding="utf-8"?>
  796. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  797. <provider
  798.     android:name="androidx.core.content.FileProvider"
  799.     android:authorities="${applicationId}.fileprovider"
  800.     android:exported="false"
  801.     android:grantUriPermissions="true">
  802.     <meta-data
  803.         android:name="android.support.FILE_PROVIDER_PATHS"
  804.         android:resource="@xml/file_paths" />
  805. </provider>
  806. <provider
  807.     android:name="androidx.core.content.FileProvider"
  808.     android:authorities="${applicationId}.fileprovider"
  809.     android:exported="false"
  810.     android:grantUriPermissions="true">
  811.     <meta-data
  812.         android:name="android.support.FILE_PROVIDER_PATHS"
  813.         android:resource="@xml/file_paths" />
  814. </provider><cache-path name="apk_cache" path="apk/" />
  815. <provider
  816.     android:name="androidx.core.content.FileProvider"
  817.     android:authorities="${applicationId}.fileprovider"
  818.     android:exported="false"
  819.     android:grantUriPermissions="true">
  820.     <meta-data
  821.         android:name="android.support.FILE_PROVIDER_PATHS"
  822.         android:resource="@xml/file_paths" />
  823. </provider>
  824. <provider
  825.     android:name="androidx.core.content.FileProvider"
  826.     android:authorities="${applicationId}.fileprovider"
  827.     android:exported="false"
  828.     android:grantUriPermissions="true">
  829.     <meta-data
  830.         android:name="android.support.FILE_PROVIDER_PATHS"
  831.         android:resource="@xml/file_paths" />
  832. </provider><cache-path name="all_cache" path="." />
  833. <provider
  834.     android:name="androidx.core.content.FileProvider"
  835.     android:authorities="${applicationId}.fileprovider"
  836.     android:exported="false"
  837.     android:grantUriPermissions="true">
  838.     <meta-data
  839.         android:name="android.support.FILE_PROVIDER_PATHS"
  840.         android:resource="@xml/file_paths" />
  841. </provider>
  842. <provider
  843.     android:name="androidx.core.content.FileProvider"
  844.     android:authorities="${applicationId}.fileprovider"
  845.     android:exported="false"
  846.     android:grantUriPermissions="true">
  847.     <meta-data
  848.         android:name="android.support.FILE_PROVIDER_PATHS"
  849.         android:resource="@xml/file_paths" />
  850. </provider><external-files-path name="external_app_files" path="." />
  851. </paths>  cancelled = true;
  852. <?xml version="1.0" encoding="utf-8"?>
  853. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  854. <provider
  855.     android:name="androidx.core.content.FileProvider"
  856.     android:authorities="${applicationId}.fileprovider"
  857.     android:exported="false"
  858.     android:grantUriPermissions="true">
  859.     <meta-data
  860.         android:name="android.support.FILE_PROVIDER_PATHS"
  861.         android:resource="@xml/file_paths" />
  862. </provider>
  863. <provider
  864.     android:name="androidx.core.content.FileProvider"
  865.     android:authorities="${applicationId}.fileprovider"
  866.     android:exported="false"
  867.     android:grantUriPermissions="true">
  868.     <meta-data
  869.         android:name="android.support.FILE_PROVIDER_PATHS"
  870.         android:resource="@xml/file_paths" />
  871. </provider><cache-path name="apk_cache" path="apk/" />
  872. <provider
  873.     android:name="androidx.core.content.FileProvider"
  874.     android:authorities="${applicationId}.fileprovider"
  875.     android:exported="false"
  876.     android:grantUriPermissions="true">
  877.     <meta-data
  878.         android:name="android.support.FILE_PROVIDER_PATHS"
  879.         android:resource="@xml/file_paths" />
  880. </provider>
  881. <provider
  882.     android:name="androidx.core.content.FileProvider"
  883.     android:authorities="${applicationId}.fileprovider"
  884.     android:exported="false"
  885.     android:grantUriPermissions="true">
  886.     <meta-data
  887.         android:name="android.support.FILE_PROVIDER_PATHS"
  888.         android:resource="@xml/file_paths" />
  889. </provider><cache-path name="all_cache" path="." />
  890. <provider
  891.     android:name="androidx.core.content.FileProvider"
  892.     android:authorities="${applicationId}.fileprovider"
  893.     android:exported="false"
  894.     android:grantUriPermissions="true">
  895.     <meta-data
  896.         android:name="android.support.FILE_PROVIDER_PATHS"
  897.         android:resource="@xml/file_paths" />
  898. </provider>
  899. <provider
  900.     android:name="androidx.core.content.FileProvider"
  901.     android:authorities="${applicationId}.fileprovider"
  902.     android:exported="false"
  903.     android:grantUriPermissions="true">
  904.     <meta-data
  905.         android:name="android.support.FILE_PROVIDER_PATHS"
  906.         android:resource="@xml/file_paths" />
  907. </provider><external-files-path name="external_app_files" path="." />
  908. </paths>  cancelToken.cancel('用户取消下载');
  909. <?xml version="1.0" encoding="utf-8"?>
  910. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  911. <provider
  912.     android:name="androidx.core.content.FileProvider"
  913.     android:authorities="${applicationId}.fileprovider"
  914.     android:exported="false"
  915.     android:grantUriPermissions="true">
  916.     <meta-data
  917.         android:name="android.support.FILE_PROVIDER_PATHS"
  918.         android:resource="@xml/file_paths" />
  919. </provider>
  920. <provider
  921.     android:name="androidx.core.content.FileProvider"
  922.     android:authorities="${applicationId}.fileprovider"
  923.     android:exported="false"
  924.     android:grantUriPermissions="true">
  925.     <meta-data
  926.         android:name="android.support.FILE_PROVIDER_PATHS"
  927.         android:resource="@xml/file_paths" />
  928. </provider><cache-path name="apk_cache" path="apk/" />
  929. <provider
  930.     android:name="androidx.core.content.FileProvider"
  931.     android:authorities="${applicationId}.fileprovider"
  932.     android:exported="false"
  933.     android:grantUriPermissions="true">
  934.     <meta-data
  935.         android:name="android.support.FILE_PROVIDER_PATHS"
  936.         android:resource="@xml/file_paths" />
  937. </provider>
  938. <provider
  939.     android:name="androidx.core.content.FileProvider"
  940.     android:authorities="${applicationId}.fileprovider"
  941.     android:exported="false"
  942.     android:grantUriPermissions="true">
  943.     <meta-data
  944.         android:name="android.support.FILE_PROVIDER_PATHS"
  945.         android:resource="@xml/file_paths" />
  946. </provider><cache-path name="all_cache" path="." />
  947. <provider
  948.     android:name="androidx.core.content.FileProvider"
  949.     android:authorities="${applicationId}.fileprovider"
  950.     android:exported="false"
  951.     android:grantUriPermissions="true">
  952.     <meta-data
  953.         android:name="android.support.FILE_PROVIDER_PATHS"
  954.         android:resource="@xml/file_paths" />
  955. </provider>
  956. <provider
  957.     android:name="androidx.core.content.FileProvider"
  958.     android:authorities="${applicationId}.fileprovider"
  959.     android:exported="false"
  960.     android:grantUriPermissions="true">
  961.     <meta-data
  962.         android:name="android.support.FILE_PROVIDER_PATHS"
  963.         android:resource="@xml/file_paths" />
  964. </provider><external-files-path name="external_app_files" path="." />
  965. </paths>  Navigator.of(context).pop();
  966. <?xml version="1.0" encoding="utf-8"?>
  967. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  968. <provider
  969.     android:name="androidx.core.content.FileProvider"
  970.     android:authorities="${applicationId}.fileprovider"
  971.     android:exported="false"
  972.     android:grantUriPermissions="true">
  973.     <meta-data
  974.         android:name="android.support.FILE_PROVIDER_PATHS"
  975.         android:resource="@xml/file_paths" />
  976. </provider>
  977. <provider
  978.     android:name="androidx.core.content.FileProvider"
  979.     android:authorities="${applicationId}.fileprovider"
  980.     android:exported="false"
  981.     android:grantUriPermissions="true">
  982.     <meta-data
  983.         android:name="android.support.FILE_PROVIDER_PATHS"
  984.         android:resource="@xml/file_paths" />
  985. </provider><cache-path name="apk_cache" path="apk/" />
  986. <provider
  987.     android:name="androidx.core.content.FileProvider"
  988.     android:authorities="${applicationId}.fileprovider"
  989.     android:exported="false"
  990.     android:grantUriPermissions="true">
  991.     <meta-data
  992.         android:name="android.support.FILE_PROVIDER_PATHS"
  993.         android:resource="@xml/file_paths" />
  994. </provider>
  995. <provider
  996.     android:name="androidx.core.content.FileProvider"
  997.     android:authorities="${applicationId}.fileprovider"
  998.     android:exported="false"
  999.     android:grantUriPermissions="true">
  1000.     <meta-data
  1001.         android:name="android.support.FILE_PROVIDER_PATHS"
  1002.         android:resource="@xml/file_paths" />
  1003. </provider><cache-path name="all_cache" path="." />
  1004. <provider
  1005.     android:name="androidx.core.content.FileProvider"
  1006.     android:authorities="${applicationId}.fileprovider"
  1007.     android:exported="false"
  1008.     android:grantUriPermissions="true">
  1009.     <meta-data
  1010.         android:name="android.support.FILE_PROVIDER_PATHS"
  1011.         android:resource="@xml/file_paths" />
  1012. </provider>
  1013. <provider
  1014.     android:name="androidx.core.content.FileProvider"
  1015.     android:authorities="${applicationId}.fileprovider"
  1016.     android:exported="false"
  1017.     android:grantUriPermissions="true">
  1018.     <meta-data
  1019.         android:name="android.support.FILE_PROVIDER_PATHS"
  1020.         android:resource="@xml/file_paths" />
  1021. </provider><external-files-path name="external_app_files" path="." />
  1022. </paths>},
  1023. <?xml version="1.0" encoding="utf-8"?>
  1024. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  1025. <provider
  1026.     android:name="androidx.core.content.FileProvider"
  1027.     android:authorities="${applicationId}.fileprovider"
  1028.     android:exported="false"
  1029.     android:grantUriPermissions="true">
  1030.     <meta-data
  1031.         android:name="android.support.FILE_PROVIDER_PATHS"
  1032.         android:resource="@xml/file_paths" />
  1033. </provider>
  1034. <provider
  1035.     android:name="androidx.core.content.FileProvider"
  1036.     android:authorities="${applicationId}.fileprovider"
  1037.     android:exported="false"
  1038.     android:grantUriPermissions="true">
  1039.     <meta-data
  1040.         android:name="android.support.FILE_PROVIDER_PATHS"
  1041.         android:resource="@xml/file_paths" />
  1042. </provider><cache-path name="apk_cache" path="apk/" />
  1043. <provider
  1044.     android:name="androidx.core.content.FileProvider"
  1045.     android:authorities="${applicationId}.fileprovider"
  1046.     android:exported="false"
  1047.     android:grantUriPermissions="true">
  1048.     <meta-data
  1049.         android:name="android.support.FILE_PROVIDER_PATHS"
  1050.         android:resource="@xml/file_paths" />
  1051. </provider>
  1052. <provider
  1053.     android:name="androidx.core.content.FileProvider"
  1054.     android:authorities="${applicationId}.fileprovider"
  1055.     android:exported="false"
  1056.     android:grantUriPermissions="true">
  1057.     <meta-data
  1058.         android:name="android.support.FILE_PROVIDER_PATHS"
  1059.         android:resource="@xml/file_paths" />
  1060. </provider><cache-path name="all_cache" path="." />
  1061. <provider
  1062.     android:name="androidx.core.content.FileProvider"
  1063.     android:authorities="${applicationId}.fileprovider"
  1064.     android:exported="false"
  1065.     android:grantUriPermissions="true">
  1066.     <meta-data
  1067.         android:name="android.support.FILE_PROVIDER_PATHS"
  1068.         android:resource="@xml/file_paths" />
  1069. </provider>
  1070. <provider
  1071.     android:name="androidx.core.content.FileProvider"
  1072.     android:authorities="${applicationId}.fileprovider"
  1073.     android:exported="false"
  1074.     android:grantUriPermissions="true">
  1075.     <meta-data
  1076.         android:name="android.support.FILE_PROVIDER_PATHS"
  1077.         android:resource="@xml/file_paths" />
  1078. </provider><external-files-path name="external_app_files" path="." />
  1079. </paths>child: const Text('取消'),
  1080. <provider
  1081.     android:name="androidx.core.content.FileProvider"
  1082.     android:authorities="${applicationId}.fileprovider"
  1083.     android:exported="false"
  1084.     android:grantUriPermissions="true">
  1085.     <meta-data
  1086.         android:name="android.support.FILE_PROVIDER_PATHS"
  1087.         android:resource="@xml/file_paths" />
  1088. </provider><provider
  1089.     android:name="androidx.core.content.FileProvider"
  1090.     android:authorities="${applicationId}.fileprovider"
  1091.     android:exported="false"
  1092.     android:grantUriPermissions="true">
  1093.     <meta-data
  1094.         android:name="android.support.FILE_PROVIDER_PATHS"
  1095.         android:resource="@xml/file_paths" />
  1096. </provider><provider
  1097.     android:name="androidx.core.content.FileProvider"
  1098.     android:authorities="${applicationId}.fileprovider"
  1099.     android:exported="false"
  1100.     android:grantUriPermissions="true">
  1101.     <meta-data
  1102.         android:name="android.support.FILE_PROVIDER_PATHS"
  1103.         android:resource="@xml/file_paths" />
  1104. </provider><provider
  1105.     android:name="androidx.core.content.FileProvider"
  1106.     android:authorities="${applicationId}.fileprovider"
  1107.     android:exported="false"
  1108.     android:grantUriPermissions="true">
  1109.     <meta-data
  1110.         android:name="android.support.FILE_PROVIDER_PATHS"
  1111.         android:resource="@xml/file_paths" />
  1112. </provider><provider
  1113.     android:name="androidx.core.content.FileProvider"
  1114.     android:authorities="${applicationId}.fileprovider"
  1115.     android:exported="false"
  1116.     android:grantUriPermissions="true">
  1117.     <meta-data
  1118.         android:name="android.support.FILE_PROVIDER_PATHS"
  1119.         android:resource="@xml/file_paths" />
  1120. </provider>  ),
  1121. <provider
  1122.     android:name="androidx.core.content.FileProvider"
  1123.     android:authorities="${applicationId}.fileprovider"
  1124.     android:exported="false"
  1125.     android:grantUriPermissions="true">
  1126.     <meta-data
  1127.         android:name="android.support.FILE_PROVIDER_PATHS"
  1128.         android:resource="@xml/file_paths" />
  1129. </provider><provider
  1130.     android:name="androidx.core.content.FileProvider"
  1131.     android:authorities="${applicationId}.fileprovider"
  1132.     android:exported="false"
  1133.     android:grantUriPermissions="true">
  1134.     <meta-data
  1135.         android:name="android.support.FILE_PROVIDER_PATHS"
  1136.         android:resource="@xml/file_paths" />
  1137. </provider><provider
  1138.     android:name="androidx.core.content.FileProvider"
  1139.     android:authorities="${applicationId}.fileprovider"
  1140.     android:exported="false"
  1141.     android:grantUriPermissions="true">
  1142.     <meta-data
  1143.         android:name="android.support.FILE_PROVIDER_PATHS"
  1144.         android:resource="@xml/file_paths" />
  1145. </provider><provider
  1146.     android:name="androidx.core.content.FileProvider"
  1147.     android:authorities="${applicationId}.fileprovider"
  1148.     android:exported="false"
  1149.     android:grantUriPermissions="true">
  1150.     <meta-data
  1151.         android:name="android.support.FILE_PROVIDER_PATHS"
  1152.         android:resource="@xml/file_paths" />
  1153. </provider><provider
  1154.     android:name="androidx.core.content.FileProvider"
  1155.     android:authorities="${applicationId}.fileprovider"
  1156.     android:exported="false"
  1157.     android:grantUriPermissions="true">
  1158.     <meta-data
  1159.         android:name="android.support.FILE_PROVIDER_PATHS"
  1160.         android:resource="@xml/file_paths" />
  1161. </provider>  TextButton(
  1162. <?xml version="1.0" encoding="utf-8"?>
  1163. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  1164. <provider
  1165.     android:name="androidx.core.content.FileProvider"
  1166.     android:authorities="${applicationId}.fileprovider"
  1167.     android:exported="false"
  1168.     android:grantUriPermissions="true">
  1169.     <meta-data
  1170.         android:name="android.support.FILE_PROVIDER_PATHS"
  1171.         android:resource="@xml/file_paths" />
  1172. </provider>
  1173. <provider
  1174.     android:name="androidx.core.content.FileProvider"
  1175.     android:authorities="${applicationId}.fileprovider"
  1176.     android:exported="false"
  1177.     android:grantUriPermissions="true">
  1178.     <meta-data
  1179.         android:name="android.support.FILE_PROVIDER_PATHS"
  1180.         android:resource="@xml/file_paths" />
  1181. </provider><cache-path name="apk_cache" path="apk/" />
  1182. <provider
  1183.     android:name="androidx.core.content.FileProvider"
  1184.     android:authorities="${applicationId}.fileprovider"
  1185.     android:exported="false"
  1186.     android:grantUriPermissions="true">
  1187.     <meta-data
  1188.         android:name="android.support.FILE_PROVIDER_PATHS"
  1189.         android:resource="@xml/file_paths" />
  1190. </provider>
  1191. <provider
  1192.     android:name="androidx.core.content.FileProvider"
  1193.     android:authorities="${applicationId}.fileprovider"
  1194.     android:exported="false"
  1195.     android:grantUriPermissions="true">
  1196.     <meta-data
  1197.         android:name="android.support.FILE_PROVIDER_PATHS"
  1198.         android:resource="@xml/file_paths" />
  1199. </provider><cache-path name="all_cache" path="." />
  1200. <provider
  1201.     android:name="androidx.core.content.FileProvider"
  1202.     android:authorities="${applicationId}.fileprovider"
  1203.     android:exported="false"
  1204.     android:grantUriPermissions="true">
  1205.     <meta-data
  1206.         android:name="android.support.FILE_PROVIDER_PATHS"
  1207.         android:resource="@xml/file_paths" />
  1208. </provider>
  1209. <provider
  1210.     android:name="androidx.core.content.FileProvider"
  1211.     android:authorities="${applicationId}.fileprovider"
  1212.     android:exported="false"
  1213.     android:grantUriPermissions="true">
  1214.     <meta-data
  1215.         android:name="android.support.FILE_PROVIDER_PATHS"
  1216.         android:resource="@xml/file_paths" />
  1217. </provider><external-files-path name="external_app_files" path="." />
  1218. </paths>onPressed: () {
  1219. <?xml version="1.0" encoding="utf-8"?>
  1220. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  1221. <provider
  1222.     android:name="androidx.core.content.FileProvider"
  1223.     android:authorities="${applicationId}.fileprovider"
  1224.     android:exported="false"
  1225.     android:grantUriPermissions="true">
  1226.     <meta-data
  1227.         android:name="android.support.FILE_PROVIDER_PATHS"
  1228.         android:resource="@xml/file_paths" />
  1229. </provider>
  1230. <provider
  1231.     android:name="androidx.core.content.FileProvider"
  1232.     android:authorities="${applicationId}.fileprovider"
  1233.     android:exported="false"
  1234.     android:grantUriPermissions="true">
  1235.     <meta-data
  1236.         android:name="android.support.FILE_PROVIDER_PATHS"
  1237.         android:resource="@xml/file_paths" />
  1238. </provider><cache-path name="apk_cache" path="apk/" />
  1239. <provider
  1240.     android:name="androidx.core.content.FileProvider"
  1241.     android:authorities="${applicationId}.fileprovider"
  1242.     android:exported="false"
  1243.     android:grantUriPermissions="true">
  1244.     <meta-data
  1245.         android:name="android.support.FILE_PROVIDER_PATHS"
  1246.         android:resource="@xml/file_paths" />
  1247. </provider>
  1248. <provider
  1249.     android:name="androidx.core.content.FileProvider"
  1250.     android:authorities="${applicationId}.fileprovider"
  1251.     android:exported="false"
  1252.     android:grantUriPermissions="true">
  1253.     <meta-data
  1254.         android:name="android.support.FILE_PROVIDER_PATHS"
  1255.         android:resource="@xml/file_paths" />
  1256. </provider><cache-path name="all_cache" path="." />
  1257. <provider
  1258.     android:name="androidx.core.content.FileProvider"
  1259.     android:authorities="${applicationId}.fileprovider"
  1260.     android:exported="false"
  1261.     android:grantUriPermissions="true">
  1262.     <meta-data
  1263.         android:name="android.support.FILE_PROVIDER_PATHS"
  1264.         android:resource="@xml/file_paths" />
  1265. </provider>
  1266. <provider
  1267.     android:name="androidx.core.content.FileProvider"
  1268.     android:authorities="${applicationId}.fileprovider"
  1269.     android:exported="false"
  1270.     android:grantUriPermissions="true">
  1271.     <meta-data
  1272.         android:name="android.support.FILE_PROVIDER_PATHS"
  1273.         android:resource="@xml/file_paths" />
  1274. </provider><external-files-path name="external_app_files" path="." />
  1275. </paths>  Navigator.of(context).pop();
  1276. <?xml version="1.0" encoding="utf-8"?>
  1277. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  1278. <provider
  1279.     android:name="androidx.core.content.FileProvider"
  1280.     android:authorities="${applicationId}.fileprovider"
  1281.     android:exported="false"
  1282.     android:grantUriPermissions="true">
  1283.     <meta-data
  1284.         android:name="android.support.FILE_PROVIDER_PATHS"
  1285.         android:resource="@xml/file_paths" />
  1286. </provider>
  1287. <provider
  1288.     android:name="androidx.core.content.FileProvider"
  1289.     android:authorities="${applicationId}.fileprovider"
  1290.     android:exported="false"
  1291.     android:grantUriPermissions="true">
  1292.     <meta-data
  1293.         android:name="android.support.FILE_PROVIDER_PATHS"
  1294.         android:resource="@xml/file_paths" />
  1295. </provider><cache-path name="apk_cache" path="apk/" />
  1296. <provider
  1297.     android:name="androidx.core.content.FileProvider"
  1298.     android:authorities="${applicationId}.fileprovider"
  1299.     android:exported="false"
  1300.     android:grantUriPermissions="true">
  1301.     <meta-data
  1302.         android:name="android.support.FILE_PROVIDER_PATHS"
  1303.         android:resource="@xml/file_paths" />
  1304. </provider>
  1305. <provider
  1306.     android:name="androidx.core.content.FileProvider"
  1307.     android:authorities="${applicationId}.fileprovider"
  1308.     android:exported="false"
  1309.     android:grantUriPermissions="true">
  1310.     <meta-data
  1311.         android:name="android.support.FILE_PROVIDER_PATHS"
  1312.         android:resource="@xml/file_paths" />
  1313. </provider><cache-path name="all_cache" path="." />
  1314. <provider
  1315.     android:name="androidx.core.content.FileProvider"
  1316.     android:authorities="${applicationId}.fileprovider"
  1317.     android:exported="false"
  1318.     android:grantUriPermissions="true">
  1319.     <meta-data
  1320.         android:name="android.support.FILE_PROVIDER_PATHS"
  1321.         android:resource="@xml/file_paths" />
  1322. </provider>
  1323. <provider
  1324.     android:name="androidx.core.content.FileProvider"
  1325.     android:authorities="${applicationId}.fileprovider"
  1326.     android:exported="false"
  1327.     android:grantUriPermissions="true">
  1328.     <meta-data
  1329.         android:name="android.support.FILE_PROVIDER_PATHS"
  1330.         android:resource="@xml/file_paths" />
  1331. </provider><external-files-path name="external_app_files" path="." />
  1332. </paths>},
  1333. <?xml version="1.0" encoding="utf-8"?>
  1334. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  1335. <provider
  1336.     android:name="androidx.core.content.FileProvider"
  1337.     android:authorities="${applicationId}.fileprovider"
  1338.     android:exported="false"
  1339.     android:grantUriPermissions="true">
  1340.     <meta-data
  1341.         android:name="android.support.FILE_PROVIDER_PATHS"
  1342.         android:resource="@xml/file_paths" />
  1343. </provider>
  1344. <provider
  1345.     android:name="androidx.core.content.FileProvider"
  1346.     android:authorities="${applicationId}.fileprovider"
  1347.     android:exported="false"
  1348.     android:grantUriPermissions="true">
  1349.     <meta-data
  1350.         android:name="android.support.FILE_PROVIDER_PATHS"
  1351.         android:resource="@xml/file_paths" />
  1352. </provider><cache-path name="apk_cache" path="apk/" />
  1353. <provider
  1354.     android:name="androidx.core.content.FileProvider"
  1355.     android:authorities="${applicationId}.fileprovider"
  1356.     android:exported="false"
  1357.     android:grantUriPermissions="true">
  1358.     <meta-data
  1359.         android:name="android.support.FILE_PROVIDER_PATHS"
  1360.         android:resource="@xml/file_paths" />
  1361. </provider>
  1362. <provider
  1363.     android:name="androidx.core.content.FileProvider"
  1364.     android:authorities="${applicationId}.fileprovider"
  1365.     android:exported="false"
  1366.     android:grantUriPermissions="true">
  1367.     <meta-data
  1368.         android:name="android.support.FILE_PROVIDER_PATHS"
  1369.         android:resource="@xml/file_paths" />
  1370. </provider><cache-path name="all_cache" path="." />
  1371. <provider
  1372.     android:name="androidx.core.content.FileProvider"
  1373.     android:authorities="${applicationId}.fileprovider"
  1374.     android:exported="false"
  1375.     android:grantUriPermissions="true">
  1376.     <meta-data
  1377.         android:name="android.support.FILE_PROVIDER_PATHS"
  1378.         android:resource="@xml/file_paths" />
  1379. </provider>
  1380. <provider
  1381.     android:name="androidx.core.content.FileProvider"
  1382.     android:authorities="${applicationId}.fileprovider"
  1383.     android:exported="false"
  1384.     android:grantUriPermissions="true">
  1385.     <meta-data
  1386.         android:name="android.support.FILE_PROVIDER_PATHS"
  1387.         android:resource="@xml/file_paths" />
  1388. </provider><external-files-path name="external_app_files" path="." />
  1389. </paths>child: const Text('后台下载'),
  1390. <provider
  1391.     android:name="androidx.core.content.FileProvider"
  1392.     android:authorities="${applicationId}.fileprovider"
  1393.     android:exported="false"
  1394.     android:grantUriPermissions="true">
  1395.     <meta-data
  1396.         android:name="android.support.FILE_PROVIDER_PATHS"
  1397.         android:resource="@xml/file_paths" />
  1398. </provider><provider
  1399.     android:name="androidx.core.content.FileProvider"
  1400.     android:authorities="${applicationId}.fileprovider"
  1401.     android:exported="false"
  1402.     android:grantUriPermissions="true">
  1403.     <meta-data
  1404.         android:name="android.support.FILE_PROVIDER_PATHS"
  1405.         android:resource="@xml/file_paths" />
  1406. </provider><provider
  1407.     android:name="androidx.core.content.FileProvider"
  1408.     android:authorities="${applicationId}.fileprovider"
  1409.     android:exported="false"
  1410.     android:grantUriPermissions="true">
  1411.     <meta-data
  1412.         android:name="android.support.FILE_PROVIDER_PATHS"
  1413.         android:resource="@xml/file_paths" />
  1414. </provider><provider
  1415.     android:name="androidx.core.content.FileProvider"
  1416.     android:authorities="${applicationId}.fileprovider"
  1417.     android:exported="false"
  1418.     android:grantUriPermissions="true">
  1419.     <meta-data
  1420.         android:name="android.support.FILE_PROVIDER_PATHS"
  1421.         android:resource="@xml/file_paths" />
  1422. </provider><provider
  1423.     android:name="androidx.core.content.FileProvider"
  1424.     android:authorities="${applicationId}.fileprovider"
  1425.     android:exported="false"
  1426.     android:grantUriPermissions="true">
  1427.     <meta-data
  1428.         android:name="android.support.FILE_PROVIDER_PATHS"
  1429.         android:resource="@xml/file_paths" />
  1430. </provider>  ),
  1431. <provider
  1432.     android:name="androidx.core.content.FileProvider"
  1433.     android:authorities="${applicationId}.fileprovider"
  1434.     android:exported="false"
  1435.     android:grantUriPermissions="true">
  1436.     <meta-data
  1437.         android:name="android.support.FILE_PROVIDER_PATHS"
  1438.         android:resource="@xml/file_paths" />
  1439. </provider><provider
  1440.     android:name="androidx.core.content.FileProvider"
  1441.     android:authorities="${applicationId}.fileprovider"
  1442.     android:exported="false"
  1443.     android:grantUriPermissions="true">
  1444.     <meta-data
  1445.         android:name="android.support.FILE_PROVIDER_PATHS"
  1446.         android:resource="@xml/file_paths" />
  1447. </provider><provider
  1448.     android:name="androidx.core.content.FileProvider"
  1449.     android:authorities="${applicationId}.fileprovider"
  1450.     android:exported="false"
  1451.     android:grantUriPermissions="true">
  1452.     <meta-data
  1453.         android:name="android.support.FILE_PROVIDER_PATHS"
  1454.         android:resource="@xml/file_paths" />
  1455. </provider><provider
  1456.     android:name="androidx.core.content.FileProvider"
  1457.     android:authorities="${applicationId}.fileprovider"
  1458.     android:exported="false"
  1459.     android:grantUriPermissions="true">
  1460.     <meta-data
  1461.         android:name="android.support.FILE_PROVIDER_PATHS"
  1462.         android:resource="@xml/file_paths" />
  1463. </provider><provider
  1464.     android:name="androidx.core.content.FileProvider"
  1465.     android:authorities="${applicationId}.fileprovider"
  1466.     android:exported="false"
  1467.     android:grantUriPermissions="true">
  1468.     <meta-data
  1469.         android:name="android.support.FILE_PROVIDER_PATHS"
  1470.         android:resource="@xml/file_paths" />
  1471. </provider>],
  1472. <provider
  1473.     android:name="androidx.core.content.FileProvider"
  1474.     android:authorities="${applicationId}.fileprovider"
  1475.     android:exported="false"
  1476.     android:grantUriPermissions="true">
  1477.     <meta-data
  1478.         android:name="android.support.FILE_PROVIDER_PATHS"
  1479.         android:resource="@xml/file_paths" />
  1480. </provider><provider
  1481.     android:name="androidx.core.content.FileProvider"
  1482.     android:authorities="${applicationId}.fileprovider"
  1483.     android:exported="false"
  1484.     android:grantUriPermissions="true">
  1485.     <meta-data
  1486.         android:name="android.support.FILE_PROVIDER_PATHS"
  1487.         android:resource="@xml/file_paths" />
  1488. </provider><provider
  1489.     android:name="androidx.core.content.FileProvider"
  1490.     android:authorities="${applicationId}.fileprovider"
  1491.     android:exported="false"
  1492.     android:grantUriPermissions="true">
  1493.     <meta-data
  1494.         android:name="android.support.FILE_PROVIDER_PATHS"
  1495.         android:resource="@xml/file_paths" />
  1496. </provider><provider
  1497.     android:name="androidx.core.content.FileProvider"
  1498.     android:authorities="${applicationId}.fileprovider"
  1499.     android:exported="false"
  1500.     android:grantUriPermissions="true">
  1501.     <meta-data
  1502.         android:name="android.support.FILE_PROVIDER_PATHS"
  1503.         android:resource="@xml/file_paths" />
  1504. </provider>  ),
  1505. <provider
  1506.     android:name="androidx.core.content.FileProvider"
  1507.     android:authorities="${applicationId}.fileprovider"
  1508.     android:exported="false"
  1509.     android:grantUriPermissions="true">
  1510.     <meta-data
  1511.         android:name="android.support.FILE_PROVIDER_PATHS"
  1512.         android:resource="@xml/file_paths" />
  1513. </provider><provider
  1514.     android:name="androidx.core.content.FileProvider"
  1515.     android:authorities="${applicationId}.fileprovider"
  1516.     android:exported="false"
  1517.     android:grantUriPermissions="true">
  1518.     <meta-data
  1519.         android:name="android.support.FILE_PROVIDER_PATHS"
  1520.         android:resource="@xml/file_paths" />
  1521. </provider><provider
  1522.     android:name="androidx.core.content.FileProvider"
  1523.     android:authorities="${applicationId}.fileprovider"
  1524.     android:exported="false"
  1525.     android:grantUriPermissions="true">
  1526.     <meta-data
  1527.         android:name="android.support.FILE_PROVIDER_PATHS"
  1528.         android:resource="@xml/file_paths" />
  1529. </provider><provider
  1530.     android:name="androidx.core.content.FileProvider"
  1531.     android:authorities="${applicationId}.fileprovider"
  1532.     android:exported="false"
  1533.     android:grantUriPermissions="true">
  1534.     <meta-data
  1535.         android:name="android.support.FILE_PROVIDER_PATHS"
  1536.         android:resource="@xml/file_paths" />
  1537. </provider>],
  1538. <provider
  1539.     android:name="androidx.core.content.FileProvider"
  1540.     android:authorities="${applicationId}.fileprovider"
  1541.     android:exported="false"
  1542.     android:grantUriPermissions="true">
  1543.     <meta-data
  1544.         android:name="android.support.FILE_PROVIDER_PATHS"
  1545.         android:resource="@xml/file_paths" />
  1546. </provider><provider
  1547.     android:name="androidx.core.content.FileProvider"
  1548.     android:authorities="${applicationId}.fileprovider"
  1549.     android:exported="false"
  1550.     android:grantUriPermissions="true">
  1551.     <meta-data
  1552.         android:name="android.support.FILE_PROVIDER_PATHS"
  1553.         android:resource="@xml/file_paths" />
  1554. </provider><provider
  1555.     android:name="androidx.core.content.FileProvider"
  1556.     android:authorities="${applicationId}.fileprovider"
  1557.     android:exported="false"
  1558.     android:grantUriPermissions="true">
  1559.     <meta-data
  1560.         android:name="android.support.FILE_PROVIDER_PATHS"
  1561.         android:resource="@xml/file_paths" />
  1562. </provider>  ),
  1563. <provider
  1564.     android:name="androidx.core.content.FileProvider"
  1565.     android:authorities="${applicationId}.fileprovider"
  1566.     android:exported="false"
  1567.     android:grantUriPermissions="true">
  1568.     <meta-data
  1569.         android:name="android.support.FILE_PROVIDER_PATHS"
  1570.         android:resource="@xml/file_paths" />
  1571. </provider><provider
  1572.     android:name="androidx.core.content.FileProvider"
  1573.     android:authorities="${applicationId}.fileprovider"
  1574.     android:exported="false"
  1575.     android:grantUriPermissions="true">
  1576.     <meta-data
  1577.         android:name="android.support.FILE_PROVIDER_PATHS"
  1578.         android:resource="@xml/file_paths" />
  1579. </provider><provider
  1580.     android:name="androidx.core.content.FileProvider"
  1581.     android:authorities="${applicationId}.fileprovider"
  1582.     android:exported="false"
  1583.     android:grantUriPermissions="true">
  1584.     <meta-data
  1585.         android:name="android.support.FILE_PROVIDER_PATHS"
  1586.         android:resource="@xml/file_paths" />
  1587. </provider>);
  1588. <provider
  1589.     android:name="androidx.core.content.FileProvider"
  1590.     android:authorities="${applicationId}.fileprovider"
  1591.     android:exported="false"
  1592.     android:grantUriPermissions="true">
  1593.     <meta-data
  1594.         android:name="android.support.FILE_PROVIDER_PATHS"
  1595.         android:resource="@xml/file_paths" />
  1596. </provider><provider
  1597.     android:name="androidx.core.content.FileProvider"
  1598.     android:authorities="${applicationId}.fileprovider"
  1599.     android:exported="false"
  1600.     android:grantUriPermissions="true">
  1601.     <meta-data
  1602.         android:name="android.support.FILE_PROVIDER_PATHS"
  1603.         android:resource="@xml/file_paths" />
  1604. </provider>  },
  1605. <provider
  1606.     android:name="androidx.core.content.FileProvider"
  1607.     android:authorities="${applicationId}.fileprovider"
  1608.     android:exported="false"
  1609.     android:grantUriPermissions="true">
  1610.     <meta-data
  1611.         android:name="android.support.FILE_PROVIDER_PATHS"
  1612.         android:resource="@xml/file_paths" />
  1613. </provider><provider
  1614.     android:name="androidx.core.content.FileProvider"
  1615.     android:authorities="${applicationId}.fileprovider"
  1616.     android:exported="false"
  1617.     android:grantUriPermissions="true">
  1618.     <meta-data
  1619.         android:name="android.support.FILE_PROVIDER_PATHS"
  1620.         android:resource="@xml/file_paths" />
  1621. </provider>),
  1622. <provider
  1623.     android:name="androidx.core.content.FileProvider"
  1624.     android:authorities="${applicationId}.fileprovider"
  1625.     android:exported="false"
  1626.     android:grantUriPermissions="true">
  1627.     <meta-data
  1628.         android:name="android.support.FILE_PROVIDER_PATHS"
  1629.         android:resource="@xml/file_paths" />
  1630. </provider>  );
  1631. <provider
  1632.     android:name="androidx.core.content.FileProvider"
  1633.     android:authorities="${applicationId}.fileprovider"
  1634.     android:exported="false"
  1635.     android:grantUriPermissions="true">
  1636.     <meta-data
  1637.         android:name="android.support.FILE_PROVIDER_PATHS"
  1638.         android:resource="@xml/file_paths" />
  1639. </provider>}
  1640. <provider
  1641.     android:name="androidx.core.content.FileProvider"
  1642.     android:authorities="${applicationId}.fileprovider"
  1643.     android:exported="false"
  1644.     android:grantUriPermissions="true">
  1645.     <meta-data
  1646.         android:name="android.support.FILE_PROVIDER_PATHS"
  1647.         android:resource="@xml/file_paths" />
  1648. </provider>// 开始下载
  1649. <provider
  1650.     android:name="androidx.core.content.FileProvider"
  1651.     android:authorities="${applicationId}.fileprovider"
  1652.     android:exported="false"
  1653.     android:grantUriPermissions="true">
  1654.     <meta-data
  1655.         android:name="android.support.FILE_PROVIDER_PATHS"
  1656.         android:resource="@xml/file_paths" />
  1657. </provider>await _dio.download(
  1658. <provider
  1659.     android:name="androidx.core.content.FileProvider"
  1660.     android:authorities="${applicationId}.fileprovider"
  1661.     android:exported="false"
  1662.     android:grantUriPermissions="true">
  1663.     <meta-data
  1664.         android:name="android.support.FILE_PROVIDER_PATHS"
  1665.         android:resource="@xml/file_paths" />
  1666. </provider>  url,
  1667. <provider
  1668.     android:name="androidx.core.content.FileProvider"
  1669.     android:authorities="${applicationId}.fileprovider"
  1670.     android:exported="false"
  1671.     android:grantUriPermissions="true">
  1672.     <meta-data
  1673.         android:name="android.support.FILE_PROVIDER_PATHS"
  1674.         android:resource="@xml/file_paths" />
  1675. </provider>  filePath,
  1676. <provider
  1677.     android:name="androidx.core.content.FileProvider"
  1678.     android:authorities="${applicationId}.fileprovider"
  1679.     android:exported="false"
  1680.     android:grantUriPermissions="true">
  1681.     <meta-data
  1682.         android:name="android.support.FILE_PROVIDER_PATHS"
  1683.         android:resource="@xml/file_paths" />
  1684. </provider>  options: Options(
  1685. <provider
  1686.     android:name="androidx.core.content.FileProvider"
  1687.     android:authorities="${applicationId}.fileprovider"
  1688.     android:exported="false"
  1689.     android:grantUriPermissions="true">
  1690.     <meta-data
  1691.         android:name="android.support.FILE_PROVIDER_PATHS"
  1692.         android:resource="@xml/file_paths" />
  1693. </provider><provider
  1694.     android:name="androidx.core.content.FileProvider"
  1695.     android:authorities="${applicationId}.fileprovider"
  1696.     android:exported="false"
  1697.     android:grantUriPermissions="true">
  1698.     <meta-data
  1699.         android:name="android.support.FILE_PROVIDER_PATHS"
  1700.         android:resource="@xml/file_paths" />
  1701. </provider>headers: {
  1702. <provider
  1703.     android:name="androidx.core.content.FileProvider"
  1704.     android:authorities="${applicationId}.fileprovider"
  1705.     android:exported="false"
  1706.     android:grantUriPermissions="true">
  1707.     <meta-data
  1708.         android:name="android.support.FILE_PROVIDER_PATHS"
  1709.         android:resource="@xml/file_paths" />
  1710. </provider><provider
  1711.     android:name="androidx.core.content.FileProvider"
  1712.     android:authorities="${applicationId}.fileprovider"
  1713.     android:exported="false"
  1714.     android:grantUriPermissions="true">
  1715.     <meta-data
  1716.         android:name="android.support.FILE_PROVIDER_PATHS"
  1717.         android:resource="@xml/file_paths" />
  1718. </provider>  'User-Agent': _generateRandomUserAgent(),
  1719. <provider
  1720.     android:name="androidx.core.content.FileProvider"
  1721.     android:authorities="${applicationId}.fileprovider"
  1722.     android:exported="false"
  1723.     android:grantUriPermissions="true">
  1724.     <meta-data
  1725.         android:name="android.support.FILE_PROVIDER_PATHS"
  1726.         android:resource="@xml/file_paths" />
  1727. </provider><provider
  1728.     android:name="androidx.core.content.FileProvider"
  1729.     android:authorities="${applicationId}.fileprovider"
  1730.     android:exported="false"
  1731.     android:grantUriPermissions="true">
  1732.     <meta-data
  1733.         android:name="android.support.FILE_PROVIDER_PATHS"
  1734.         android:resource="@xml/file_paths" />
  1735. </provider>},
  1736. <provider
  1737.     android:name="androidx.core.content.FileProvider"
  1738.     android:authorities="${applicationId}.fileprovider"
  1739.     android:exported="false"
  1740.     android:grantUriPermissions="true">
  1741.     <meta-data
  1742.         android:name="android.support.FILE_PROVIDER_PATHS"
  1743.         android:resource="@xml/file_paths" />
  1744. </provider>  ),
  1745. <provider
  1746.     android:name="androidx.core.content.FileProvider"
  1747.     android:authorities="${applicationId}.fileprovider"
  1748.     android:exported="false"
  1749.     android:grantUriPermissions="true">
  1750.     <meta-data
  1751.         android:name="android.support.FILE_PROVIDER_PATHS"
  1752.         android:resource="@xml/file_paths" />
  1753. </provider>  onReceiveProgress: (received, total) {
  1754. <provider
  1755.     android:name="androidx.core.content.FileProvider"
  1756.     android:authorities="${applicationId}.fileprovider"
  1757.     android:exported="false"
  1758.     android:grantUriPermissions="true">
  1759.     <meta-data
  1760.         android:name="android.support.FILE_PROVIDER_PATHS"
  1761.         android:resource="@xml/file_paths" />
  1762. </provider><provider
  1763.     android:name="androidx.core.content.FileProvider"
  1764.     android:authorities="${applicationId}.fileprovider"
  1765.     android:exported="false"
  1766.     android:grantUriPermissions="true">
  1767.     <meta-data
  1768.         android:name="android.support.FILE_PROVIDER_PATHS"
  1769.         android:resource="@xml/file_paths" />
  1770. </provider>if (total > 0 && !cancelled) {
  1771. <provider
  1772.     android:name="androidx.core.content.FileProvider"
  1773.     android:authorities="${applicationId}.fileprovider"
  1774.     android:exported="false"
  1775.     android:grantUriPermissions="true">
  1776.     <meta-data
  1777.         android:name="android.support.FILE_PROVIDER_PATHS"
  1778.         android:resource="@xml/file_paths" />
  1779. </provider><provider
  1780.     android:name="androidx.core.content.FileProvider"
  1781.     android:authorities="${applicationId}.fileprovider"
  1782.     android:exported="false"
  1783.     android:grantUriPermissions="true">
  1784.     <meta-data
  1785.         android:name="android.support.FILE_PROVIDER_PATHS"
  1786.         android:resource="@xml/file_paths" />
  1787. </provider>  final newProgress = received / total;
  1788. <provider
  1789.     android:name="androidx.core.content.FileProvider"
  1790.     android:authorities="${applicationId}.fileprovider"
  1791.     android:exported="false"
  1792.     android:grantUriPermissions="true">
  1793.     <meta-data
  1794.         android:name="android.support.FILE_PROVIDER_PATHS"
  1795.         android:resource="@xml/file_paths" />
  1796. </provider><provider
  1797.     android:name="androidx.core.content.FileProvider"
  1798.     android:authorities="${applicationId}.fileprovider"
  1799.     android:exported="false"
  1800.     android:grantUriPermissions="true">
  1801.     <meta-data
  1802.         android:name="android.support.FILE_PROVIDER_PATHS"
  1803.         android:resource="@xml/file_paths" />
  1804. </provider>  progress = newProgress;
  1805. <provider
  1806.     android:name="androidx.core.content.FileProvider"
  1807.     android:authorities="${applicationId}.fileprovider"
  1808.     android:exported="false"
  1809.     android:grantUriPermissions="true">
  1810.     <meta-data
  1811.         android:name="android.support.FILE_PROVIDER_PATHS"
  1812.         android:resource="@xml/file_paths" />
  1813. </provider><provider
  1814.     android:name="androidx.core.content.FileProvider"
  1815.     android:authorities="${applicationId}.fileprovider"
  1816.     android:exported="false"
  1817.     android:grantUriPermissions="true">
  1818.     <meta-data
  1819.         android:name="android.support.FILE_PROVIDER_PATHS"
  1820.         android:resource="@xml/file_paths" />
  1821. </provider>  final progressPercent = (progress * 100).round();
  1822. <provider
  1823.     android:name="androidx.core.content.FileProvider"
  1824.     android:authorities="${applicationId}.fileprovider"
  1825.     android:exported="false"
  1826.     android:grantUriPermissions="true">
  1827.     <meta-data
  1828.         android:name="android.support.FILE_PROVIDER_PATHS"
  1829.         android:resource="@xml/file_paths" />
  1830. </provider><provider
  1831.     android:name="androidx.core.content.FileProvider"
  1832.     android:authorities="${applicationId}.fileprovider"
  1833.     android:exported="false"
  1834.     android:grantUriPermissions="true">
  1835.     <meta-data
  1836.         android:name="android.support.FILE_PROVIDER_PATHS"
  1837.         android:resource="@xml/file_paths" />
  1838. </provider>  // 调用外部进度回调
  1839. <provider
  1840.     android:name="androidx.core.content.FileProvider"
  1841.     android:authorities="${applicationId}.fileprovider"
  1842.     android:exported="false"
  1843.     android:grantUriPermissions="true">
  1844.     <meta-data
  1845.         android:name="android.support.FILE_PROVIDER_PATHS"
  1846.         android:resource="@xml/file_paths" />
  1847. </provider><provider
  1848.     android:name="androidx.core.content.FileProvider"
  1849.     android:authorities="${applicationId}.fileprovider"
  1850.     android:exported="false"
  1851.     android:grantUriPermissions="true">
  1852.     <meta-data
  1853.         android:name="android.support.FILE_PROVIDER_PATHS"
  1854.         android:resource="@xml/file_paths" />
  1855. </provider>  onProgress?.call(newProgress, '下载中: $progressPercent%');
  1856. <provider
  1857.     android:name="androidx.core.content.FileProvider"
  1858.     android:authorities="${applicationId}.fileprovider"
  1859.     android:exported="false"
  1860.     android:grantUriPermissions="true">
  1861.     <meta-data
  1862.         android:name="android.support.FILE_PROVIDER_PATHS"
  1863.         android:resource="@xml/file_paths" />
  1864. </provider><provider
  1865.     android:name="androidx.core.content.FileProvider"
  1866.     android:authorities="${applicationId}.fileprovider"
  1867.     android:exported="false"
  1868.     android:grantUriPermissions="true">
  1869.     <meta-data
  1870.         android:name="android.support.FILE_PROVIDER_PATHS"
  1871.         android:resource="@xml/file_paths" />
  1872. </provider>  // 更新UI进度
  1873. <provider
  1874.     android:name="androidx.core.content.FileProvider"
  1875.     android:authorities="${applicationId}.fileprovider"
  1876.     android:exported="false"
  1877.     android:grantUriPermissions="true">
  1878.     <meta-data
  1879.         android:name="android.support.FILE_PROVIDER_PATHS"
  1880.         android:resource="@xml/file_paths" />
  1881. </provider><provider
  1882.     android:name="androidx.core.content.FileProvider"
  1883.     android:authorities="${applicationId}.fileprovider"
  1884.     android:exported="false"
  1885.     android:grantUriPermissions="true">
  1886.     <meta-data
  1887.         android:name="android.support.FILE_PROVIDER_PATHS"
  1888.         android:resource="@xml/file_paths" />
  1889. </provider>  try {
  1890. <provider
  1891.     android:name="androidx.core.content.FileProvider"
  1892.     android:authorities="${applicationId}.fileprovider"
  1893.     android:exported="false"
  1894.     android:grantUriPermissions="true">
  1895.     <meta-data
  1896.         android:name="android.support.FILE_PROVIDER_PATHS"
  1897.         android:resource="@xml/file_paths" />
  1898. </provider><provider
  1899.     android:name="androidx.core.content.FileProvider"
  1900.     android:authorities="${applicationId}.fileprovider"
  1901.     android:exported="false"
  1902.     android:grantUriPermissions="true">
  1903.     <meta-data
  1904.         android:name="android.support.FILE_PROVIDER_PATHS"
  1905.         android:resource="@xml/file_paths" />
  1906. </provider><provider
  1907.     android:name="androidx.core.content.FileProvider"
  1908.     android:authorities="${applicationId}.fileprovider"
  1909.     android:exported="false"
  1910.     android:grantUriPermissions="true">
  1911.     <meta-data
  1912.         android:name="android.support.FILE_PROVIDER_PATHS"
  1913.         android:resource="@xml/file_paths" />
  1914. </provider>if (context.mounted) {
  1915. <provider
  1916.     android:name="androidx.core.content.FileProvider"
  1917.     android:authorities="${applicationId}.fileprovider"
  1918.     android:exported="false"
  1919.     android:grantUriPermissions="true">
  1920.     <meta-data
  1921.         android:name="android.support.FILE_PROVIDER_PATHS"
  1922.         android:resource="@xml/file_paths" />
  1923. </provider><provider
  1924.     android:name="androidx.core.content.FileProvider"
  1925.     android:authorities="${applicationId}.fileprovider"
  1926.     android:exported="false"
  1927.     android:grantUriPermissions="true">
  1928.     <meta-data
  1929.         android:name="android.support.FILE_PROVIDER_PATHS"
  1930.         android:resource="@xml/file_paths" />
  1931. </provider><provider
  1932.     android:name="androidx.core.content.FileProvider"
  1933.     android:authorities="${applicationId}.fileprovider"
  1934.     android:exported="false"
  1935.     android:grantUriPermissions="true">
  1936.     <meta-data
  1937.         android:name="android.support.FILE_PROVIDER_PATHS"
  1938.         android:resource="@xml/file_paths" />
  1939. </provider>  dialogSetState(() {});
  1940. <provider
  1941.     android:name="androidx.core.content.FileProvider"
  1942.     android:authorities="${applicationId}.fileprovider"
  1943.     android:exported="false"
  1944.     android:grantUriPermissions="true">
  1945.     <meta-data
  1946.         android:name="android.support.FILE_PROVIDER_PATHS"
  1947.         android:resource="@xml/file_paths" />
  1948. </provider><provider
  1949.     android:name="androidx.core.content.FileProvider"
  1950.     android:authorities="${applicationId}.fileprovider"
  1951.     android:exported="false"
  1952.     android:grantUriPermissions="true">
  1953.     <meta-data
  1954.         android:name="android.support.FILE_PROVIDER_PATHS"
  1955.         android:resource="@xml/file_paths" />
  1956. </provider><provider
  1957.     android:name="androidx.core.content.FileProvider"
  1958.     android:authorities="${applicationId}.fileprovider"
  1959.     android:exported="false"
  1960.     android:grantUriPermissions="true">
  1961.     <meta-data
  1962.         android:name="android.support.FILE_PROVIDER_PATHS"
  1963.         android:resource="@xml/file_paths" />
  1964. </provider>}
  1965. <provider
  1966.     android:name="androidx.core.content.FileProvider"
  1967.     android:authorities="${applicationId}.fileprovider"
  1968.     android:exported="false"
  1969.     android:grantUriPermissions="true">
  1970.     <meta-data
  1971.         android:name="android.support.FILE_PROVIDER_PATHS"
  1972.         android:resource="@xml/file_paths" />
  1973. </provider><provider
  1974.     android:name="androidx.core.content.FileProvider"
  1975.     android:authorities="${applicationId}.fileprovider"
  1976.     android:exported="false"
  1977.     android:grantUriPermissions="true">
  1978.     <meta-data
  1979.         android:name="android.support.FILE_PROVIDER_PATHS"
  1980.         android:resource="@xml/file_paths" />
  1981. </provider>  } catch (e) {
  1982. <provider
  1983.     android:name="androidx.core.content.FileProvider"
  1984.     android:authorities="${applicationId}.fileprovider"
  1985.     android:exported="false"
  1986.     android:grantUriPermissions="true">
  1987.     <meta-data
  1988.         android:name="android.support.FILE_PROVIDER_PATHS"
  1989.         android:resource="@xml/file_paths" />
  1990. </provider><provider
  1991.     android:name="androidx.core.content.FileProvider"
  1992.     android:authorities="${applicationId}.fileprovider"
  1993.     android:exported="false"
  1994.     android:grantUriPermissions="true">
  1995.     <meta-data
  1996.         android:name="android.support.FILE_PROVIDER_PATHS"
  1997.         android:resource="@xml/file_paths" />
  1998. </provider><provider
  1999.     android:name="androidx.core.content.FileProvider"
  2000.     android:authorities="${applicationId}.fileprovider"
  2001.     android:exported="false"
  2002.     android:grantUriPermissions="true">
  2003.     <meta-data
  2004.         android:name="android.support.FILE_PROVIDER_PATHS"
  2005.         android:resource="@xml/file_paths" />
  2006. </provider>// 对话框已关闭,忽略错误
  2007. <provider
  2008.     android:name="androidx.core.content.FileProvider"
  2009.     android:authorities="${applicationId}.fileprovider"
  2010.     android:exported="false"
  2011.     android:grantUriPermissions="true">
  2012.     <meta-data
  2013.         android:name="android.support.FILE_PROVIDER_PATHS"
  2014.         android:resource="@xml/file_paths" />
  2015. </provider><provider
  2016.     android:name="androidx.core.content.FileProvider"
  2017.     android:authorities="${applicationId}.fileprovider"
  2018.     android:exported="false"
  2019.     android:grantUriPermissions="true">
  2020.     <meta-data
  2021.         android:name="android.support.FILE_PROVIDER_PATHS"
  2022.         android:resource="@xml/file_paths" />
  2023. </provider>  }
  2024. <provider
  2025.     android:name="androidx.core.content.FileProvider"
  2026.     android:authorities="${applicationId}.fileprovider"
  2027.     android:exported="false"
  2028.     android:grantUriPermissions="true">
  2029.     <meta-data
  2030.         android:name="android.support.FILE_PROVIDER_PATHS"
  2031.         android:resource="@xml/file_paths" />
  2032. </provider><provider
  2033.     android:name="androidx.core.content.FileProvider"
  2034.     android:authorities="${applicationId}.fileprovider"
  2035.     android:exported="false"
  2036.     android:grantUriPermissions="true">
  2037.     <meta-data
  2038.         android:name="android.support.FILE_PROVIDER_PATHS"
  2039.         android:resource="@xml/file_paths" />
  2040. </provider>  // 更新通知进度
  2041. <provider
  2042.     android:name="androidx.core.content.FileProvider"
  2043.     android:authorities="${applicationId}.fileprovider"
  2044.     android:exported="false"
  2045.     android:grantUriPermissions="true">
  2046.     <meta-data
  2047.         android:name="android.support.FILE_PROVIDER_PATHS"
  2048.         android:resource="@xml/file_paths" />
  2049. </provider><provider
  2050.     android:name="androidx.core.content.FileProvider"
  2051.     android:authorities="${applicationId}.fileprovider"
  2052.     android:exported="false"
  2053.     android:grantUriPermissions="true">
  2054.     <meta-data
  2055.         android:name="android.support.FILE_PROVIDER_PATHS"
  2056.         android:resource="@xml/file_paths" />
  2057. </provider>  _showProgressNotification(progressPercent, indeterminate: false)
  2058. <provider
  2059.     android:name="androidx.core.content.FileProvider"
  2060.     android:authorities="${applicationId}.fileprovider"
  2061.     android:exported="false"
  2062.     android:grantUriPermissions="true">
  2063.     <meta-data
  2064.         android:name="android.support.FILE_PROVIDER_PATHS"
  2065.         android:resource="@xml/file_paths" />
  2066. </provider><provider
  2067.     android:name="androidx.core.content.FileProvider"
  2068.     android:authorities="${applicationId}.fileprovider"
  2069.     android:exported="false"
  2070.     android:grantUriPermissions="true">
  2071.     <meta-data
  2072.         android:name="android.support.FILE_PROVIDER_PATHS"
  2073.         android:resource="@xml/file_paths" />
  2074. </provider><provider
  2075.     android:name="androidx.core.content.FileProvider"
  2076.     android:authorities="${applicationId}.fileprovider"
  2077.     android:exported="false"
  2078.     android:grantUriPermissions="true">
  2079.     <meta-data
  2080.         android:name="android.support.FILE_PROVIDER_PATHS"
  2081.         android:resource="@xml/file_paths" />
  2082. </provider>  .catchError((e) {
  2083. <provider
  2084.     android:name="androidx.core.content.FileProvider"
  2085.     android:authorities="${applicationId}.fileprovider"
  2086.     android:exported="false"
  2087.     android:grantUriPermissions="true">
  2088.     <meta-data
  2089.         android:name="android.support.FILE_PROVIDER_PATHS"
  2090.         android:resource="@xml/file_paths" />
  2091. </provider><provider
  2092.     android:name="androidx.core.content.FileProvider"
  2093.     android:authorities="${applicationId}.fileprovider"
  2094.     android:exported="false"
  2095.     android:grantUriPermissions="true">
  2096.     <meta-data
  2097.         android:name="android.support.FILE_PROVIDER_PATHS"
  2098.         android:resource="@xml/file_paths" />
  2099. </provider><provider
  2100.     android:name="androidx.core.content.FileProvider"
  2101.     android:authorities="${applicationId}.fileprovider"
  2102.     android:exported="false"
  2103.     android:grantUriPermissions="true">
  2104.     <meta-data
  2105.         android:name="android.support.FILE_PROVIDER_PATHS"
  2106.         android:resource="@xml/file_paths" />
  2107. </provider>logE('UpdateService', '更新通知进度失败', e);
  2108. <provider
  2109.     android:name="androidx.core.content.FileProvider"
  2110.     android:authorities="${applicationId}.fileprovider"
  2111.     android:exported="false"
  2112.     android:grantUriPermissions="true">
  2113.     <meta-data
  2114.         android:name="android.support.FILE_PROVIDER_PATHS"
  2115.         android:resource="@xml/file_paths" />
  2116. </provider><provider
  2117.     android:name="androidx.core.content.FileProvider"
  2118.     android:authorities="${applicationId}.fileprovider"
  2119.     android:exported="false"
  2120.     android:grantUriPermissions="true">
  2121.     <meta-data
  2122.         android:name="android.support.FILE_PROVIDER_PATHS"
  2123.         android:resource="@xml/file_paths" />
  2124. </provider>  });
  2125. <provider
  2126.     android:name="androidx.core.content.FileProvider"
  2127.     android:authorities="${applicationId}.fileprovider"
  2128.     android:exported="false"
  2129.     android:grantUriPermissions="true">
  2130.     <meta-data
  2131.         android:name="android.support.FILE_PROVIDER_PATHS"
  2132.         android:resource="@xml/file_paths" />
  2133. </provider><provider
  2134.     android:name="androidx.core.content.FileProvider"
  2135.     android:authorities="${applicationId}.fileprovider"
  2136.     android:exported="false"
  2137.     android:grantUriPermissions="true">
  2138.     <meta-data
  2139.         android:name="android.support.FILE_PROVIDER_PATHS"
  2140.         android:resource="@xml/file_paths" />
  2141. </provider>}
  2142. <provider
  2143.     android:name="androidx.core.content.FileProvider"
  2144.     android:authorities="${applicationId}.fileprovider"
  2145.     android:exported="false"
  2146.     android:grantUriPermissions="true">
  2147.     <meta-data
  2148.         android:name="android.support.FILE_PROVIDER_PATHS"
  2149.         android:resource="@xml/file_paths" />
  2150. </provider>  },
  2151. <provider
  2152.     android:name="androidx.core.content.FileProvider"
  2153.     android:authorities="${applicationId}.fileprovider"
  2154.     android:exported="false"
  2155.     android:grantUriPermissions="true">
  2156.     <meta-data
  2157.         android:name="android.support.FILE_PROVIDER_PATHS"
  2158.         android:resource="@xml/file_paths" />
  2159. </provider>  cancelToken: cancelToken,
  2160. <provider
  2161.     android:name="androidx.core.content.FileProvider"
  2162.     android:authorities="${applicationId}.fileprovider"
  2163.     android:exported="false"
  2164.     android:grantUriPermissions="true">
  2165.     <meta-data
  2166.         android:name="android.support.FILE_PROVIDER_PATHS"
  2167.         android:resource="@xml/file_paths" />
  2168. </provider>);
  2169. <provider
  2170.     android:name="androidx.core.content.FileProvider"
  2171.     android:authorities="${applicationId}.fileprovider"
  2172.     android:exported="false"
  2173.     android:grantUriPermissions="true">
  2174.     <meta-data
  2175.         android:name="android.support.FILE_PROVIDER_PATHS"
  2176.         android:resource="@xml/file_paths" />
  2177. </provider>if (cancelled) {
  2178. <provider
  2179.     android:name="androidx.core.content.FileProvider"
  2180.     android:authorities="${applicationId}.fileprovider"
  2181.     android:exported="false"
  2182.     android:grantUriPermissions="true">
  2183.     <meta-data
  2184.         android:name="android.support.FILE_PROVIDER_PATHS"
  2185.         android:resource="@xml/file_paths" />
  2186. </provider>  logI('UpdateService', '用户取消下载');
  2187. <provider
  2188.     android:name="androidx.core.content.FileProvider"
  2189.     android:authorities="${applicationId}.fileprovider"
  2190.     android:exported="false"
  2191.     android:grantUriPermissions="true">
  2192.     <meta-data
  2193.         android:name="android.support.FILE_PROVIDER_PATHS"
  2194.         android:resource="@xml/file_paths" />
  2195. </provider>  await _cancelDownloadNotification();
  2196. <provider
  2197.     android:name="androidx.core.content.FileProvider"
  2198.     android:authorities="${applicationId}.fileprovider"
  2199.     android:exported="false"
  2200.     android:grantUriPermissions="true">
  2201.     <meta-data
  2202.         android:name="android.support.FILE_PROVIDER_PATHS"
  2203.         android:resource="@xml/file_paths" />
  2204. </provider>  onProgress?.call(0.0, '');
  2205. <provider
  2206.     android:name="androidx.core.content.FileProvider"
  2207.     android:authorities="${applicationId}.fileprovider"
  2208.     android:exported="false"
  2209.     android:grantUriPermissions="true">
  2210.     <meta-data
  2211.         android:name="android.support.FILE_PROVIDER_PATHS"
  2212.         android:resource="@xml/file_paths" />
  2213. </provider>  return UpdateResult.userCancelled();
  2214. <provider
  2215.     android:name="androidx.core.content.FileProvider"
  2216.     android:authorities="${applicationId}.fileprovider"
  2217.     android:exported="false"
  2218.     android:grantUriPermissions="true">
  2219.     <meta-data
  2220.         android:name="android.support.FILE_PROVIDER_PATHS"
  2221.         android:resource="@xml/file_paths" />
  2222. </provider>}
  2223. <provider
  2224.     android:name="androidx.core.content.FileProvider"
  2225.     android:authorities="${applicationId}.fileprovider"
  2226.     android:exported="false"
  2227.     android:grantUriPermissions="true">
  2228.     <meta-data
  2229.         android:name="android.support.FILE_PROVIDER_PATHS"
  2230.         android:resource="@xml/file_paths" />
  2231. </provider>// 下载完成,关闭进度对话框
  2232. <provider
  2233.     android:name="androidx.core.content.FileProvider"
  2234.     android:authorities="${applicationId}.fileprovider"
  2235.     android:exported="false"
  2236.     android:grantUriPermissions="true">
  2237.     <meta-data
  2238.         android:name="android.support.FILE_PROVIDER_PATHS"
  2239.         android:resource="@xml/file_paths" />
  2240. </provider>logI('UpdateService', '下载完成,关闭下载进度对话框');
  2241. <provider
  2242.     android:name="androidx.core.content.FileProvider"
  2243.     android:authorities="${applicationId}.fileprovider"
  2244.     android:exported="false"
  2245.     android:grantUriPermissions="true">
  2246.     <meta-data
  2247.         android:name="android.support.FILE_PROVIDER_PATHS"
  2248.         android:resource="@xml/file_paths" />
  2249. </provider>if (context.mounted) {
  2250. <provider
  2251.     android:name="androidx.core.content.FileProvider"
  2252.     android:authorities="${applicationId}.fileprovider"
  2253.     android:exported="false"
  2254.     android:grantUriPermissions="true">
  2255.     <meta-data
  2256.         android:name="android.support.FILE_PROVIDER_PATHS"
  2257.         android:resource="@xml/file_paths" />
  2258. </provider>  try {
  2259. <provider
  2260.     android:name="androidx.core.content.FileProvider"
  2261.     android:authorities="${applicationId}.fileprovider"
  2262.     android:exported="false"
  2263.     android:grantUriPermissions="true">
  2264.     <meta-data
  2265.         android:name="android.support.FILE_PROVIDER_PATHS"
  2266.         android:resource="@xml/file_paths" />
  2267. </provider><provider
  2268.     android:name="androidx.core.content.FileProvider"
  2269.     android:authorities="${applicationId}.fileprovider"
  2270.     android:exported="false"
  2271.     android:grantUriPermissions="true">
  2272.     <meta-data
  2273.         android:name="android.support.FILE_PROVIDER_PATHS"
  2274.         android:resource="@xml/file_paths" />
  2275. </provider>if (Navigator.of(context).canPop()) {
  2276. <provider
  2277.     android:name="androidx.core.content.FileProvider"
  2278.     android:authorities="${applicationId}.fileprovider"
  2279.     android:exported="false"
  2280.     android:grantUriPermissions="true">
  2281.     <meta-data
  2282.         android:name="android.support.FILE_PROVIDER_PATHS"
  2283.         android:resource="@xml/file_paths" />
  2284. </provider><provider
  2285.     android:name="androidx.core.content.FileProvider"
  2286.     android:authorities="${applicationId}.fileprovider"
  2287.     android:exported="false"
  2288.     android:grantUriPermissions="true">
  2289.     <meta-data
  2290.         android:name="android.support.FILE_PROVIDER_PATHS"
  2291.         android:resource="@xml/file_paths" />
  2292. </provider>  Navigator.of(context).pop();
  2293. <provider
  2294.     android:name="androidx.core.content.FileProvider"
  2295.     android:authorities="${applicationId}.fileprovider"
  2296.     android:exported="false"
  2297.     android:grantUriPermissions="true">
  2298.     <meta-data
  2299.         android:name="android.support.FILE_PROVIDER_PATHS"
  2300.         android:resource="@xml/file_paths" />
  2301. </provider><provider
  2302.     android:name="androidx.core.content.FileProvider"
  2303.     android:authorities="${applicationId}.fileprovider"
  2304.     android:exported="false"
  2305.     android:grantUriPermissions="true">
  2306.     <meta-data
  2307.         android:name="android.support.FILE_PROVIDER_PATHS"
  2308.         android:resource="@xml/file_paths" />
  2309. </provider>  logI('UpdateService', '下载进度对话框已关闭');
  2310. <provider
  2311.     android:name="androidx.core.content.FileProvider"
  2312.     android:authorities="${applicationId}.fileprovider"
  2313.     android:exported="false"
  2314.     android:grantUriPermissions="true">
  2315.     <meta-data
  2316.         android:name="android.support.FILE_PROVIDER_PATHS"
  2317.         android:resource="@xml/file_paths" />
  2318. </provider><provider
  2319.     android:name="androidx.core.content.FileProvider"
  2320.     android:authorities="${applicationId}.fileprovider"
  2321.     android:exported="false"
  2322.     android:grantUriPermissions="true">
  2323.     <meta-data
  2324.         android:name="android.support.FILE_PROVIDER_PATHS"
  2325.         android:resource="@xml/file_paths" />
  2326. </provider>}
  2327. <provider
  2328.     android:name="androidx.core.content.FileProvider"
  2329.     android:authorities="${applicationId}.fileprovider"
  2330.     android:exported="false"
  2331.     android:grantUriPermissions="true">
  2332.     <meta-data
  2333.         android:name="android.support.FILE_PROVIDER_PATHS"
  2334.         android:resource="@xml/file_paths" />
  2335. </provider>  } catch (e) {
  2336. <provider
  2337.     android:name="androidx.core.content.FileProvider"
  2338.     android:authorities="${applicationId}.fileprovider"
  2339.     android:exported="false"
  2340.     android:grantUriPermissions="true">
  2341.     <meta-data
  2342.         android:name="android.support.FILE_PROVIDER_PATHS"
  2343.         android:resource="@xml/file_paths" />
  2344. </provider><provider
  2345.     android:name="androidx.core.content.FileProvider"
  2346.     android:authorities="${applicationId}.fileprovider"
  2347.     android:exported="false"
  2348.     android:grantUriPermissions="true">
  2349.     <meta-data
  2350.         android:name="android.support.FILE_PROVIDER_PATHS"
  2351.         android:resource="@xml/file_paths" />
  2352. </provider>logW('UpdateService', '关闭下载对话框失败: $e');
  2353. <provider
  2354.     android:name="androidx.core.content.FileProvider"
  2355.     android:authorities="${applicationId}.fileprovider"
  2356.     android:exported="false"
  2357.     android:grantUriPermissions="true">
  2358.     <meta-data
  2359.         android:name="android.support.FILE_PROVIDER_PATHS"
  2360.         android:resource="@xml/file_paths" />
  2361. </provider>  }
  2362. <provider
  2363.     android:name="androidx.core.content.FileProvider"
  2364.     android:authorities="${applicationId}.fileprovider"
  2365.     android:exported="false"
  2366.     android:grantUriPermissions="true">
  2367.     <meta-data
  2368.         android:name="android.support.FILE_PROVIDER_PATHS"
  2369.         android:resource="@xml/file_paths" />
  2370. </provider>}
  2371. <provider
  2372.     android:name="androidx.core.content.FileProvider"
  2373.     android:authorities="${applicationId}.fileprovider"
  2374.     android:exported="false"
  2375.     android:grantUriPermissions="true">
  2376.     <meta-data
  2377.         android:name="android.support.FILE_PROVIDER_PATHS"
  2378.         android:resource="@xml/file_paths" />
  2379. </provider>// 等待对话框完全关闭
  2380. <provider
  2381.     android:name="androidx.core.content.FileProvider"
  2382.     android:authorities="${applicationId}.fileprovider"
  2383.     android:exported="false"
  2384.     android:grantUriPermissions="true">
  2385.     <meta-data
  2386.         android:name="android.support.FILE_PROVIDER_PATHS"
  2387.         android:resource="@xml/file_paths" />
  2388. </provider>await Future.delayed(const Duration(milliseconds: 800));
  2389. <provider
  2390.     android:name="androidx.core.content.FileProvider"
  2391.     android:authorities="${applicationId}.fileprovider"
  2392.     android:exported="false"
  2393.     android:grantUriPermissions="true">
  2394.     <meta-data
  2395.         android:name="android.support.FILE_PROVIDER_PATHS"
  2396.         android:resource="@xml/file_paths" />
  2397. </provider>logI('UpdateService', '下载完成: $filePath');
  2398. <provider
  2399.     android:name="androidx.core.content.FileProvider"
  2400.     android:authorities="${applicationId}.fileprovider"
  2401.     android:exported="false"
  2402.     android:grantUriPermissions="true">
  2403.     <meta-data
  2404.         android:name="android.support.FILE_PROVIDER_PATHS"
  2405.         android:resource="@xml/file_paths" />
  2406. </provider>onProgress?.call(0.9, '下载完成');
  2407. <provider
  2408.     android:name="androidx.core.content.FileProvider"
  2409.     android:authorities="${applicationId}.fileprovider"
  2410.     android:exported="false"
  2411.     android:grantUriPermissions="true">
  2412.     <meta-data
  2413.         android:name="android.support.FILE_PROVIDER_PATHS"
  2414.         android:resource="@xml/file_paths" />
  2415. </provider>// 保存APK路径和版本信息到缓存
  2416. <provider
  2417.     android:name="androidx.core.content.FileProvider"
  2418.     android:authorities="${applicationId}.fileprovider"
  2419.     android:exported="false"
  2420.     android:grantUriPermissions="true">
  2421.     <meta-data
  2422.         android:name="android.support.FILE_PROVIDER_PATHS"
  2423.         android:resource="@xml/file_paths" />
  2424. </provider>await _saveApkPath(filePath, fileName);
  2425. <provider
  2426.     android:name="androidx.core.content.FileProvider"
  2427.     android:authorities="${applicationId}.fileprovider"
  2428.     android:exported="false"
  2429.     android:grantUriPermissions="true">
  2430.     <meta-data
  2431.         android:name="android.support.FILE_PROVIDER_PATHS"
  2432.         android:resource="@xml/file_paths" />
  2433. </provider>await _showDownloadCompleteNotification(filePath);
  2434. <provider
  2435.     android:name="androidx.core.content.FileProvider"
  2436.     android:authorities="${applicationId}.fileprovider"
  2437.     android:exported="false"
  2438.     android:grantUriPermissions="true">
  2439.     <meta-data
  2440.         android:name="android.support.FILE_PROVIDER_PATHS"
  2441.         android:resource="@xml/file_paths" />
  2442. </provider>onProgress?.call(1.0, '完成');
  2443. <provider
  2444.     android:name="androidx.core.content.FileProvider"
  2445.     android:authorities="${applicationId}.fileprovider"
  2446.     android:exported="false"
  2447.     android:grantUriPermissions="true">
  2448.     <meta-data
  2449.         android:name="android.support.FILE_PROVIDER_PATHS"
  2450.         android:resource="@xml/file_paths" />
  2451. </provider>return UpdateResult.downloadSuccess(filePath);
  2452.   } catch (e) {
  2453. <provider
  2454.     android:name="androidx.core.content.FileProvider"
  2455.     android:authorities="${applicationId}.fileprovider"
  2456.     android:exported="false"
  2457.     android:grantUriPermissions="true">
  2458.     <meta-data
  2459.         android:name="android.support.FILE_PROVIDER_PATHS"
  2460.         android:resource="@xml/file_paths" />
  2461. </provider>// 检查是否是用户取消导致的异常
  2462. <provider
  2463.     android:name="androidx.core.content.FileProvider"
  2464.     android:authorities="${applicationId}.fileprovider"
  2465.     android:exported="false"
  2466.     android:grantUriPermissions="true">
  2467.     <meta-data
  2468.         android:name="android.support.FILE_PROVIDER_PATHS"
  2469.         android:resource="@xml/file_paths" />
  2470. </provider>if (e is DioException && e.type == DioExceptionType.cancel) {
  2471. <provider
  2472.     android:name="androidx.core.content.FileProvider"
  2473.     android:authorities="${applicationId}.fileprovider"
  2474.     android:exported="false"
  2475.     android:grantUriPermissions="true">
  2476.     <meta-data
  2477.         android:name="android.support.FILE_PROVIDER_PATHS"
  2478.         android:resource="@xml/file_paths" />
  2479. </provider>  logI('UpdateService', '用户取消下载(通过异常捕获)');
  2480. <provider
  2481.     android:name="androidx.core.content.FileProvider"
  2482.     android:authorities="${applicationId}.fileprovider"
  2483.     android:exported="false"
  2484.     android:grantUriPermissions="true">
  2485.     <meta-data
  2486.         android:name="android.support.FILE_PROVIDER_PATHS"
  2487.         android:resource="@xml/file_paths" />
  2488. </provider>  await _cancelDownloadNotification();
  2489. <provider
  2490.     android:name="androidx.core.content.FileProvider"
  2491.     android:authorities="${applicationId}.fileprovider"
  2492.     android:exported="false"
  2493.     android:grantUriPermissions="true">
  2494.     <meta-data
  2495.         android:name="android.support.FILE_PROVIDER_PATHS"
  2496.         android:resource="@xml/file_paths" />
  2497. </provider>  onProgress?.call(0.0, '');
  2498. <provider
  2499.     android:name="androidx.core.content.FileProvider"
  2500.     android:authorities="${applicationId}.fileprovider"
  2501.     android:exported="false"
  2502.     android:grantUriPermissions="true">
  2503.     <meta-data
  2504.         android:name="android.support.FILE_PROVIDER_PATHS"
  2505.         android:resource="@xml/file_paths" />
  2506. </provider>  return UpdateResult.userCancelled();
  2507. <provider
  2508.     android:name="androidx.core.content.FileProvider"
  2509.     android:authorities="${applicationId}.fileprovider"
  2510.     android:exported="false"
  2511.     android:grantUriPermissions="true">
  2512.     <meta-data
  2513.         android:name="android.support.FILE_PROVIDER_PATHS"
  2514.         android:resource="@xml/file_paths" />
  2515. </provider>}
  2516. <provider
  2517.     android:name="androidx.core.content.FileProvider"
  2518.     android:authorities="${applicationId}.fileprovider"
  2519.     android:exported="false"
  2520.     android:grantUriPermissions="true">
  2521.     <meta-data
  2522.         android:name="android.support.FILE_PROVIDER_PATHS"
  2523.         android:resource="@xml/file_paths" />
  2524. </provider>// 真正的下载错误
  2525. <provider
  2526.     android:name="androidx.core.content.FileProvider"
  2527.     android:authorities="${applicationId}.fileprovider"
  2528.     android:exported="false"
  2529.     android:grantUriPermissions="true">
  2530.     <meta-data
  2531.         android:name="android.support.FILE_PROVIDER_PATHS"
  2532.         android:resource="@xml/file_paths" />
  2533. </provider>logE('UpdateService', '下载失败', e);
  2534. <provider
  2535.     android:name="androidx.core.content.FileProvider"
  2536.     android:authorities="${applicationId}.fileprovider"
  2537.     android:exported="false"
  2538.     android:grantUriPermissions="true">
  2539.     <meta-data
  2540.         android:name="android.support.FILE_PROVIDER_PATHS"
  2541.         android:resource="@xml/file_paths" />
  2542. </provider>// 安全关闭下载对话框
  2543. <provider
  2544.     android:name="androidx.core.content.FileProvider"
  2545.     android:authorities="${applicationId}.fileprovider"
  2546.     android:exported="false"
  2547.     android:grantUriPermissions="true">
  2548.     <meta-data
  2549.         android:name="android.support.FILE_PROVIDER_PATHS"
  2550.         android:resource="@xml/file_paths" />
  2551. </provider>if (context.mounted) {
  2552. <provider
  2553.     android:name="androidx.core.content.FileProvider"
  2554.     android:authorities="${applicationId}.fileprovider"
  2555.     android:exported="false"
  2556.     android:grantUriPermissions="true">
  2557.     <meta-data
  2558.         android:name="android.support.FILE_PROVIDER_PATHS"
  2559.         android:resource="@xml/file_paths" />
  2560. </provider>  try {
  2561. <provider
  2562.     android:name="androidx.core.content.FileProvider"
  2563.     android:authorities="${applicationId}.fileprovider"
  2564.     android:exported="false"
  2565.     android:grantUriPermissions="true">
  2566.     <meta-data
  2567.         android:name="android.support.FILE_PROVIDER_PATHS"
  2568.         android:resource="@xml/file_paths" />
  2569. </provider><provider
  2570.     android:name="androidx.core.content.FileProvider"
  2571.     android:authorities="${applicationId}.fileprovider"
  2572.     android:exported="false"
  2573.     android:grantUriPermissions="true">
  2574.     <meta-data
  2575.         android:name="android.support.FILE_PROVIDER_PATHS"
  2576.         android:resource="@xml/file_paths" />
  2577. </provider>if (Navigator.of(context).canPop()) {
  2578. <provider
  2579.     android:name="androidx.core.content.FileProvider"
  2580.     android:authorities="${applicationId}.fileprovider"
  2581.     android:exported="false"
  2582.     android:grantUriPermissions="true">
  2583.     <meta-data
  2584.         android:name="android.support.FILE_PROVIDER_PATHS"
  2585.         android:resource="@xml/file_paths" />
  2586. </provider><provider
  2587.     android:name="androidx.core.content.FileProvider"
  2588.     android:authorities="${applicationId}.fileprovider"
  2589.     android:exported="false"
  2590.     android:grantUriPermissions="true">
  2591.     <meta-data
  2592.         android:name="android.support.FILE_PROVIDER_PATHS"
  2593.         android:resource="@xml/file_paths" />
  2594. </provider>  Navigator.of(context).pop();
  2595. <provider
  2596.     android:name="androidx.core.content.FileProvider"
  2597.     android:authorities="${applicationId}.fileprovider"
  2598.     android:exported="false"
  2599.     android:grantUriPermissions="true">
  2600.     <meta-data
  2601.         android:name="android.support.FILE_PROVIDER_PATHS"
  2602.         android:resource="@xml/file_paths" />
  2603. </provider><provider
  2604.     android:name="androidx.core.content.FileProvider"
  2605.     android:authorities="${applicationId}.fileprovider"
  2606.     android:exported="false"
  2607.     android:grantUriPermissions="true">
  2608.     <meta-data
  2609.         android:name="android.support.FILE_PROVIDER_PATHS"
  2610.         android:resource="@xml/file_paths" />
  2611. </provider>  await Future.delayed(const Duration(milliseconds: 300));
  2612. <provider
  2613.     android:name="androidx.core.content.FileProvider"
  2614.     android:authorities="${applicationId}.fileprovider"
  2615.     android:exported="false"
  2616.     android:grantUriPermissions="true">
  2617.     <meta-data
  2618.         android:name="android.support.FILE_PROVIDER_PATHS"
  2619.         android:resource="@xml/file_paths" />
  2620. </provider><provider
  2621.     android:name="androidx.core.content.FileProvider"
  2622.     android:authorities="${applicationId}.fileprovider"
  2623.     android:exported="false"
  2624.     android:grantUriPermissions="true">
  2625.     <meta-data
  2626.         android:name="android.support.FILE_PROVIDER_PATHS"
  2627.         android:resource="@xml/file_paths" />
  2628. </provider>}
  2629. <provider
  2630.     android:name="androidx.core.content.FileProvider"
  2631.     android:authorities="${applicationId}.fileprovider"
  2632.     android:exported="false"
  2633.     android:grantUriPermissions="true">
  2634.     <meta-data
  2635.         android:name="android.support.FILE_PROVIDER_PATHS"
  2636.         android:resource="@xml/file_paths" />
  2637. </provider>  } catch (navError) {
  2638. <provider
  2639.     android:name="androidx.core.content.FileProvider"
  2640.     android:authorities="${applicationId}.fileprovider"
  2641.     android:exported="false"
  2642.     android:grantUriPermissions="true">
  2643.     <meta-data
  2644.         android:name="android.support.FILE_PROVIDER_PATHS"
  2645.         android:resource="@xml/file_paths" />
  2646. </provider><provider
  2647.     android:name="androidx.core.content.FileProvider"
  2648.     android:authorities="${applicationId}.fileprovider"
  2649.     android:exported="false"
  2650.     android:grantUriPermissions="true">
  2651.     <meta-data
  2652.         android:name="android.support.FILE_PROVIDER_PATHS"
  2653.         android:resource="@xml/file_paths" />
  2654. </provider>logE('UpdateService', '关闭下载对话框失败', navError);
  2655. <provider
  2656.     android:name="androidx.core.content.FileProvider"
  2657.     android:authorities="${applicationId}.fileprovider"
  2658.     android:exported="false"
  2659.     android:grantUriPermissions="true">
  2660.     <meta-data
  2661.         android:name="android.support.FILE_PROVIDER_PATHS"
  2662.         android:resource="@xml/file_paths" />
  2663. </provider>  }
  2664. <provider
  2665.     android:name="androidx.core.content.FileProvider"
  2666.     android:authorities="${applicationId}.fileprovider"
  2667.     android:exported="false"
  2668.     android:grantUriPermissions="true">
  2669.     <meta-data
  2670.         android:name="android.support.FILE_PROVIDER_PATHS"
  2671.         android:resource="@xml/file_paths" />
  2672. </provider>}
  2673. <provider
  2674.     android:name="androidx.core.content.FileProvider"
  2675.     android:authorities="${applicationId}.fileprovider"
  2676.     android:exported="false"
  2677.     android:grantUriPermissions="true">
  2678.     <meta-data
  2679.         android:name="android.support.FILE_PROVIDER_PATHS"
  2680.         android:resource="@xml/file_paths" />
  2681. </provider>await _cancelDownloadNotification();
  2682. <provider
  2683.     android:name="androidx.core.content.FileProvider"
  2684.     android:authorities="${applicationId}.fileprovider"
  2685.     android:exported="false"
  2686.     android:grantUriPermissions="true">
  2687.     <meta-data
  2688.         android:name="android.support.FILE_PROVIDER_PATHS"
  2689.         android:resource="@xml/file_paths" />
  2690. </provider>onProgress?.call(0.0, '');
  2691. <provider
  2692.     android:name="androidx.core.content.FileProvider"
  2693.     android:authorities="${applicationId}.fileprovider"
  2694.     android:exported="false"
  2695.     android:grantUriPermissions="true">
  2696.     <meta-data
  2697.         android:name="android.support.FILE_PROVIDER_PATHS"
  2698.         android:resource="@xml/file_paths" />
  2699. </provider>return UpdateResult.error('下载失败: $e');
  2700.   }
  2701. }
  2702. /// 保存APK路径到缓存
  2703. static Future<void> _saveApkPath(String filePath, String version) async {
  2704.   try {
  2705. <provider
  2706.     android:name="androidx.core.content.FileProvider"
  2707.     android:authorities="${applicationId}.fileprovider"
  2708.     android:exported="false"
  2709.     android:grantUriPermissions="true">
  2710.     <meta-data
  2711.         android:name="android.support.FILE_PROVIDER_PATHS"
  2712.         android:resource="@xml/file_paths" />
  2713. </provider>final prefs = await SharedPreferences.getInstance();
  2714. <provider
  2715.     android:name="androidx.core.content.FileProvider"
  2716.     android:authorities="${applicationId}.fileprovider"
  2717.     android:exported="false"
  2718.     android:grantUriPermissions="true">
  2719.     <meta-data
  2720.         android:name="android.support.FILE_PROVIDER_PATHS"
  2721.         android:resource="@xml/file_paths" />
  2722. </provider>await prefs.setString(_cachedApkPathKey, filePath);
  2723. <provider
  2724.     android:name="androidx.core.content.FileProvider"
  2725.     android:authorities="${applicationId}.fileprovider"
  2726.     android:exported="false"
  2727.     android:grantUriPermissions="true">
  2728.     <meta-data
  2729.         android:name="android.support.FILE_PROVIDER_PATHS"
  2730.         android:resource="@xml/file_paths" />
  2731. </provider>await prefs.setString(_cachedApkVersionKey, version);
  2732. <provider
  2733.     android:name="androidx.core.content.FileProvider"
  2734.     android:authorities="${applicationId}.fileprovider"
  2735.     android:exported="false"
  2736.     android:grantUriPermissions="true">
  2737.     <meta-data
  2738.         android:name="android.support.FILE_PROVIDER_PATHS"
  2739.         android:resource="@xml/file_paths" />
  2740. </provider>logI('UpdateService', '已保存APK缓存信息: $version -> $filePath');
  2741.   } catch (e) {
  2742. <provider
  2743.     android:name="androidx.core.content.FileProvider"
  2744.     android:authorities="${applicationId}.fileprovider"
  2745.     android:exported="false"
  2746.     android:grantUriPermissions="true">
  2747.     <meta-data
  2748.         android:name="android.support.FILE_PROVIDER_PATHS"
  2749.         android:resource="@xml/file_paths" />
  2750. </provider>logE('UpdateService', '保存APK缓存信息失败', e);
  2751.   }
  2752. }
复制代码
APK安装核心问题

R8代码混淆导致的崩溃

在生产环境构建中,我们遇到了一个严重问题:APK安装功能在开发环境正常,但在生产环境100%崩溃。通过详细的日志分析,发现了问题的根本原因:
  1. // 崩溃日志
  2. java.lang.IncompatibleClassChangeError:
  3. Class android.content.res.XmlBlock$Parser does not implement interface 'g3.a'
  4. <provider
  5.     android:name="androidx.core.content.FileProvider"
  6.     android:authorities="${applicationId}.fileprovider"
  7.     android:exported="false"
  8.     android:grantUriPermissions="true">
  9.     <meta-data
  10.         android:name="android.support.FILE_PROVIDER_PATHS"
  11.         android:resource="@xml/file_paths" />
  12. </provider>at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:400)
复制代码
问题分析

  • R8混淆器将android.content.res.XmlBlock$Parser接口重命名为g3.a
  • FileProvider读取file_paths.xml时无法找到正确的XML解析器接口
  • 导致FileProvider.getUriForFile()调用失败
Proguard规则修复
  1. # 保护XML解析器相关类不被混淆(关键修复)
  2. -keep class android.content.res.XmlBlock { *; }
  3. -keep class android.content.res.XmlBlock$Parser { *; }
  4. -keep interface android.content.res.XmlResourceParser { *; }
  5. -keep interface org.xmlpull.v1.XmlPullParser { *; }
  6. # 保护XML解析实现类
  7. -keep class org.xmlpull.v1.** { *; }
  8. -dontwarn org.xmlpull.v1.**
  9. # 保护Android系统XML接口不被混淆
  10. -keep interface android.content.res.** { *; }
  11. -keep class android.content.res.** { *; }
  12. # 保护FileProvider相关类
  13. -keep class androidx.core.content.FileProvider { *; }
  14. -keep class androidx.core.content.FileProvider$** { *; }
  15. -keepclassmembers class androidx.core.content.FileProvider {
  16. <provider
  17.     android:name="androidx.core.content.FileProvider"
  18.     android:authorities="${applicationId}.fileprovider"
  19.     android:exported="false"
  20.     android:grantUriPermissions="true">
  21.     <meta-data
  22.         android:name="android.support.FILE_PROVIDER_PATHS"
  23.         android:resource="@xml/file_paths" />
  24. </provider>public *;
  25. <provider
  26.     android:name="androidx.core.content.FileProvider"
  27.     android:authorities="${applicationId}.fileprovider"
  28.     android:exported="false"
  29.     android:grantUriPermissions="true">
  30.     <meta-data
  31.         android:name="android.support.FILE_PROVIDER_PATHS"
  32.         android:resource="@xml/file_paths" />
  33. </provider>private *;
  34. }
  35. # 保护FileProvider路径配置
  36. -keepattributes *Annotation*
  37. -keep class * extends androidx.core.content.FileProvider
  38. -keepclassmembers class ** {
  39. <provider
  40.     android:name="androidx.core.content.FileProvider"
  41.     android:authorities="${applicationId}.fileprovider"
  42.     android:exported="false"
  43.     android:grantUriPermissions="true">
  44.     <meta-data
  45.         android:name="android.support.FILE_PROVIDER_PATHS"
  46.         android:resource="@xml/file_paths" />
  47. </provider>@androidx.core.content.FileProvider$* <fields>;
  48. }
复制代码
Android原生安装实现
  1. class MainActivity : FlutterActivity() {
  2. <provider
  3.     android:name="androidx.core.content.FileProvider"
  4.     android:authorities="${applicationId}.fileprovider"
  5.     android:exported="false"
  6.     android:grantUriPermissions="true">
  7.     <meta-data
  8.         android:name="android.support.FILE_PROVIDER_PATHS"
  9.         android:resource="@xml/file_paths" />
  10. </provider>private val INSTALL_CHANNEL = "com.example.beecount/install"
  11. <provider
  12.     android:name="androidx.core.content.FileProvider"
  13.     android:authorities="${applicationId}.fileprovider"
  14.     android:exported="false"
  15.     android:grantUriPermissions="true">
  16.     <meta-data
  17.         android:name="android.support.FILE_PROVIDER_PATHS"
  18.         android:resource="@xml/file_paths" />
  19. </provider>override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
  20. <provider
  21.     android:name="androidx.core.content.FileProvider"
  22.     android:authorities="${applicationId}.fileprovider"
  23.     android:exported="false"
  24.     android:grantUriPermissions="true">
  25.     <meta-data
  26.         android:name="android.support.FILE_PROVIDER_PATHS"
  27.         android:resource="@xml/file_paths" />
  28. </provider><provider
  29.     android:name="androidx.core.content.FileProvider"
  30.     android:authorities="${applicationId}.fileprovider"
  31.     android:exported="false"
  32.     android:grantUriPermissions="true">
  33.     <meta-data
  34.         android:name="android.support.FILE_PROVIDER_PATHS"
  35.         android:resource="@xml/file_paths" />
  36. </provider>super.configureFlutterEngine(flutterEngine)
  37. <provider
  38.     android:name="androidx.core.content.FileProvider"
  39.     android:authorities="${applicationId}.fileprovider"
  40.     android:exported="false"
  41.     android:grantUriPermissions="true">
  42.     <meta-data
  43.         android:name="android.support.FILE_PROVIDER_PATHS"
  44.         android:resource="@xml/file_paths" />
  45. </provider><provider
  46.     android:name="androidx.core.content.FileProvider"
  47.     android:authorities="${applicationId}.fileprovider"
  48.     android:exported="false"
  49.     android:grantUriPermissions="true">
  50.     <meta-data
  51.         android:name="android.support.FILE_PROVIDER_PATHS"
  52.         android:resource="@xml/file_paths" />
  53. </provider>// APK安装的MethodChannel
  54. <provider
  55.     android:name="androidx.core.content.FileProvider"
  56.     android:authorities="${applicationId}.fileprovider"
  57.     android:exported="false"
  58.     android:grantUriPermissions="true">
  59.     <meta-data
  60.         android:name="android.support.FILE_PROVIDER_PATHS"
  61.         android:resource="@xml/file_paths" />
  62. </provider><provider
  63.     android:name="androidx.core.content.FileProvider"
  64.     android:authorities="${applicationId}.fileprovider"
  65.     android:exported="false"
  66.     android:grantUriPermissions="true">
  67.     <meta-data
  68.         android:name="android.support.FILE_PROVIDER_PATHS"
  69.         android:resource="@xml/file_paths" />
  70. </provider>MethodChannel(flutterEngine.dartExecutor.binaryMessenger, INSTALL_CHANNEL)
  71. <provider
  72.     android:name="androidx.core.content.FileProvider"
  73.     android:authorities="${applicationId}.fileprovider"
  74.     android:exported="false"
  75.     android:grantUriPermissions="true">
  76.     <meta-data
  77.         android:name="android.support.FILE_PROVIDER_PATHS"
  78.         android:resource="@xml/file_paths" />
  79. </provider><provider
  80.     android:name="androidx.core.content.FileProvider"
  81.     android:authorities="${applicationId}.fileprovider"
  82.     android:exported="false"
  83.     android:grantUriPermissions="true">
  84.     <meta-data
  85.         android:name="android.support.FILE_PROVIDER_PATHS"
  86.         android:resource="@xml/file_paths" />
  87. </provider><provider
  88.     android:name="androidx.core.content.FileProvider"
  89.     android:authorities="${applicationId}.fileprovider"
  90.     android:exported="false"
  91.     android:grantUriPermissions="true">
  92.     <meta-data
  93.         android:name="android.support.FILE_PROVIDER_PATHS"
  94.         android:resource="@xml/file_paths" />
  95. </provider>.setMethodCallHandler { call, result ->
  96. <provider
  97.     android:name="androidx.core.content.FileProvider"
  98.     android:authorities="${applicationId}.fileprovider"
  99.     android:exported="false"
  100.     android:grantUriPermissions="true">
  101.     <meta-data
  102.         android:name="android.support.FILE_PROVIDER_PATHS"
  103.         android:resource="@xml/file_paths" />
  104. </provider><provider
  105.     android:name="androidx.core.content.FileProvider"
  106.     android:authorities="${applicationId}.fileprovider"
  107.     android:exported="false"
  108.     android:grantUriPermissions="true">
  109.     <meta-data
  110.         android:name="android.support.FILE_PROVIDER_PATHS"
  111.         android:resource="@xml/file_paths" />
  112. </provider><provider
  113.     android:name="androidx.core.content.FileProvider"
  114.     android:authorities="${applicationId}.fileprovider"
  115.     android:exported="false"
  116.     android:grantUriPermissions="true">
  117.     <meta-data
  118.         android:name="android.support.FILE_PROVIDER_PATHS"
  119.         android:resource="@xml/file_paths" />
  120. </provider><provider
  121.     android:name="androidx.core.content.FileProvider"
  122.     android:authorities="${applicationId}.fileprovider"
  123.     android:exported="false"
  124.     android:grantUriPermissions="true">
  125.     <meta-data
  126.         android:name="android.support.FILE_PROVIDER_PATHS"
  127.         android:resource="@xml/file_paths" />
  128. </provider>when (call.method) {
  129. <provider
  130.     android:name="androidx.core.content.FileProvider"
  131.     android:authorities="${applicationId}.fileprovider"
  132.     android:exported="false"
  133.     android:grantUriPermissions="true">
  134.     <meta-data
  135.         android:name="android.support.FILE_PROVIDER_PATHS"
  136.         android:resource="@xml/file_paths" />
  137. </provider><provider
  138.     android:name="androidx.core.content.FileProvider"
  139.     android:authorities="${applicationId}.fileprovider"
  140.     android:exported="false"
  141.     android:grantUriPermissions="true">
  142.     <meta-data
  143.         android:name="android.support.FILE_PROVIDER_PATHS"
  144.         android:resource="@xml/file_paths" />
  145. </provider><provider
  146.     android:name="androidx.core.content.FileProvider"
  147.     android:authorities="${applicationId}.fileprovider"
  148.     android:exported="false"
  149.     android:grantUriPermissions="true">
  150.     <meta-data
  151.         android:name="android.support.FILE_PROVIDER_PATHS"
  152.         android:resource="@xml/file_paths" />
  153. </provider><provider
  154.     android:name="androidx.core.content.FileProvider"
  155.     android:authorities="${applicationId}.fileprovider"
  156.     android:exported="false"
  157.     android:grantUriPermissions="true">
  158.     <meta-data
  159.         android:name="android.support.FILE_PROVIDER_PATHS"
  160.         android:resource="@xml/file_paths" />
  161. </provider><provider
  162.     android:name="androidx.core.content.FileProvider"
  163.     android:authorities="${applicationId}.fileprovider"
  164.     android:exported="false"
  165.     android:grantUriPermissions="true">
  166.     <meta-data
  167.         android:name="android.support.FILE_PROVIDER_PATHS"
  168.         android:resource="@xml/file_paths" />
  169. </provider>"installApk" -> {
  170. <?xml version="1.0" encoding="utf-8"?>
  171. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  172. <provider
  173.     android:name="androidx.core.content.FileProvider"
  174.     android:authorities="${applicationId}.fileprovider"
  175.     android:exported="false"
  176.     android:grantUriPermissions="true">
  177.     <meta-data
  178.         android:name="android.support.FILE_PROVIDER_PATHS"
  179.         android:resource="@xml/file_paths" />
  180. </provider>
  181. <provider
  182.     android:name="androidx.core.content.FileProvider"
  183.     android:authorities="${applicationId}.fileprovider"
  184.     android:exported="false"
  185.     android:grantUriPermissions="true">
  186.     <meta-data
  187.         android:name="android.support.FILE_PROVIDER_PATHS"
  188.         android:resource="@xml/file_paths" />
  189. </provider><cache-path name="apk_cache" path="apk/" />
  190. <provider
  191.     android:name="androidx.core.content.FileProvider"
  192.     android:authorities="${applicationId}.fileprovider"
  193.     android:exported="false"
  194.     android:grantUriPermissions="true">
  195.     <meta-data
  196.         android:name="android.support.FILE_PROVIDER_PATHS"
  197.         android:resource="@xml/file_paths" />
  198. </provider>
  199. <provider
  200.     android:name="androidx.core.content.FileProvider"
  201.     android:authorities="${applicationId}.fileprovider"
  202.     android:exported="false"
  203.     android:grantUriPermissions="true">
  204.     <meta-data
  205.         android:name="android.support.FILE_PROVIDER_PATHS"
  206.         android:resource="@xml/file_paths" />
  207. </provider><cache-path name="all_cache" path="." />
  208. <provider
  209.     android:name="androidx.core.content.FileProvider"
  210.     android:authorities="${applicationId}.fileprovider"
  211.     android:exported="false"
  212.     android:grantUriPermissions="true">
  213.     <meta-data
  214.         android:name="android.support.FILE_PROVIDER_PATHS"
  215.         android:resource="@xml/file_paths" />
  216. </provider>
  217. <provider
  218.     android:name="androidx.core.content.FileProvider"
  219.     android:authorities="${applicationId}.fileprovider"
  220.     android:exported="false"
  221.     android:grantUriPermissions="true">
  222.     <meta-data
  223.         android:name="android.support.FILE_PROVIDER_PATHS"
  224.         android:resource="@xml/file_paths" />
  225. </provider><external-files-path name="external_app_files" path="." />
  226. </paths>val filePath = call.argument<String>("filePath")
  227. <?xml version="1.0" encoding="utf-8"?>
  228. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  229. <provider
  230.     android:name="androidx.core.content.FileProvider"
  231.     android:authorities="${applicationId}.fileprovider"
  232.     android:exported="false"
  233.     android:grantUriPermissions="true">
  234.     <meta-data
  235.         android:name="android.support.FILE_PROVIDER_PATHS"
  236.         android:resource="@xml/file_paths" />
  237. </provider>
  238. <provider
  239.     android:name="androidx.core.content.FileProvider"
  240.     android:authorities="${applicationId}.fileprovider"
  241.     android:exported="false"
  242.     android:grantUriPermissions="true">
  243.     <meta-data
  244.         android:name="android.support.FILE_PROVIDER_PATHS"
  245.         android:resource="@xml/file_paths" />
  246. </provider><cache-path name="apk_cache" path="apk/" />
  247. <provider
  248.     android:name="androidx.core.content.FileProvider"
  249.     android:authorities="${applicationId}.fileprovider"
  250.     android:exported="false"
  251.     android:grantUriPermissions="true">
  252.     <meta-data
  253.         android:name="android.support.FILE_PROVIDER_PATHS"
  254.         android:resource="@xml/file_paths" />
  255. </provider>
  256. <provider
  257.     android:name="androidx.core.content.FileProvider"
  258.     android:authorities="${applicationId}.fileprovider"
  259.     android:exported="false"
  260.     android:grantUriPermissions="true">
  261.     <meta-data
  262.         android:name="android.support.FILE_PROVIDER_PATHS"
  263.         android:resource="@xml/file_paths" />
  264. </provider><cache-path name="all_cache" path="." />
  265. <provider
  266.     android:name="androidx.core.content.FileProvider"
  267.     android:authorities="${applicationId}.fileprovider"
  268.     android:exported="false"
  269.     android:grantUriPermissions="true">
  270.     <meta-data
  271.         android:name="android.support.FILE_PROVIDER_PATHS"
  272.         android:resource="@xml/file_paths" />
  273. </provider>
  274. <provider
  275.     android:name="androidx.core.content.FileProvider"
  276.     android:authorities="${applicationId}.fileprovider"
  277.     android:exported="false"
  278.     android:grantUriPermissions="true">
  279.     <meta-data
  280.         android:name="android.support.FILE_PROVIDER_PATHS"
  281.         android:resource="@xml/file_paths" />
  282. </provider><external-files-path name="external_app_files" path="." />
  283. </paths>if (filePath != null) {
  284. <?xml version="1.0" encoding="utf-8"?>
  285. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  286. <provider
  287.     android:name="androidx.core.content.FileProvider"
  288.     android:authorities="${applicationId}.fileprovider"
  289.     android:exported="false"
  290.     android:grantUriPermissions="true">
  291.     <meta-data
  292.         android:name="android.support.FILE_PROVIDER_PATHS"
  293.         android:resource="@xml/file_paths" />
  294. </provider>
  295. <provider
  296.     android:name="androidx.core.content.FileProvider"
  297.     android:authorities="${applicationId}.fileprovider"
  298.     android:exported="false"
  299.     android:grantUriPermissions="true">
  300.     <meta-data
  301.         android:name="android.support.FILE_PROVIDER_PATHS"
  302.         android:resource="@xml/file_paths" />
  303. </provider><cache-path name="apk_cache" path="apk/" />
  304. <provider
  305.     android:name="androidx.core.content.FileProvider"
  306.     android:authorities="${applicationId}.fileprovider"
  307.     android:exported="false"
  308.     android:grantUriPermissions="true">
  309.     <meta-data
  310.         android:name="android.support.FILE_PROVIDER_PATHS"
  311.         android:resource="@xml/file_paths" />
  312. </provider>
  313. <provider
  314.     android:name="androidx.core.content.FileProvider"
  315.     android:authorities="${applicationId}.fileprovider"
  316.     android:exported="false"
  317.     android:grantUriPermissions="true">
  318.     <meta-data
  319.         android:name="android.support.FILE_PROVIDER_PATHS"
  320.         android:resource="@xml/file_paths" />
  321. </provider><cache-path name="all_cache" path="." />
  322. <provider
  323.     android:name="androidx.core.content.FileProvider"
  324.     android:authorities="${applicationId}.fileprovider"
  325.     android:exported="false"
  326.     android:grantUriPermissions="true">
  327.     <meta-data
  328.         android:name="android.support.FILE_PROVIDER_PATHS"
  329.         android:resource="@xml/file_paths" />
  330. </provider>
  331. <provider
  332.     android:name="androidx.core.content.FileProvider"
  333.     android:authorities="${applicationId}.fileprovider"
  334.     android:exported="false"
  335.     android:grantUriPermissions="true">
  336.     <meta-data
  337.         android:name="android.support.FILE_PROVIDER_PATHS"
  338.         android:resource="@xml/file_paths" />
  339. </provider><external-files-path name="external_app_files" path="." />
  340. </paths><provider
  341.     android:name="androidx.core.content.FileProvider"
  342.     android:authorities="${applicationId}.fileprovider"
  343.     android:exported="false"
  344.     android:grantUriPermissions="true">
  345.     <meta-data
  346.         android:name="android.support.FILE_PROVIDER_PATHS"
  347.         android:resource="@xml/file_paths" />
  348. </provider>val success = installApkWithIntent(filePath)
  349. <?xml version="1.0" encoding="utf-8"?>
  350. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  351. <provider
  352.     android:name="androidx.core.content.FileProvider"
  353.     android:authorities="${applicationId}.fileprovider"
  354.     android:exported="false"
  355.     android:grantUriPermissions="true">
  356.     <meta-data
  357.         android:name="android.support.FILE_PROVIDER_PATHS"
  358.         android:resource="@xml/file_paths" />
  359. </provider>
  360. <provider
  361.     android:name="androidx.core.content.FileProvider"
  362.     android:authorities="${applicationId}.fileprovider"
  363.     android:exported="false"
  364.     android:grantUriPermissions="true">
  365.     <meta-data
  366.         android:name="android.support.FILE_PROVIDER_PATHS"
  367.         android:resource="@xml/file_paths" />
  368. </provider><cache-path name="apk_cache" path="apk/" />
  369. <provider
  370.     android:name="androidx.core.content.FileProvider"
  371.     android:authorities="${applicationId}.fileprovider"
  372.     android:exported="false"
  373.     android:grantUriPermissions="true">
  374.     <meta-data
  375.         android:name="android.support.FILE_PROVIDER_PATHS"
  376.         android:resource="@xml/file_paths" />
  377. </provider>
  378. <provider
  379.     android:name="androidx.core.content.FileProvider"
  380.     android:authorities="${applicationId}.fileprovider"
  381.     android:exported="false"
  382.     android:grantUriPermissions="true">
  383.     <meta-data
  384.         android:name="android.support.FILE_PROVIDER_PATHS"
  385.         android:resource="@xml/file_paths" />
  386. </provider><cache-path name="all_cache" path="." />
  387. <provider
  388.     android:name="androidx.core.content.FileProvider"
  389.     android:authorities="${applicationId}.fileprovider"
  390.     android:exported="false"
  391.     android:grantUriPermissions="true">
  392.     <meta-data
  393.         android:name="android.support.FILE_PROVIDER_PATHS"
  394.         android:resource="@xml/file_paths" />
  395. </provider>
  396. <provider
  397.     android:name="androidx.core.content.FileProvider"
  398.     android:authorities="${applicationId}.fileprovider"
  399.     android:exported="false"
  400.     android:grantUriPermissions="true">
  401.     <meta-data
  402.         android:name="android.support.FILE_PROVIDER_PATHS"
  403.         android:resource="@xml/file_paths" />
  404. </provider><external-files-path name="external_app_files" path="." />
  405. </paths><provider
  406.     android:name="androidx.core.content.FileProvider"
  407.     android:authorities="${applicationId}.fileprovider"
  408.     android:exported="false"
  409.     android:grantUriPermissions="true">
  410.     <meta-data
  411.         android:name="android.support.FILE_PROVIDER_PATHS"
  412.         android:resource="@xml/file_paths" />
  413. </provider>result.success(success)
  414. <?xml version="1.0" encoding="utf-8"?>
  415. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  416. <provider
  417.     android:name="androidx.core.content.FileProvider"
  418.     android:authorities="${applicationId}.fileprovider"
  419.     android:exported="false"
  420.     android:grantUriPermissions="true">
  421.     <meta-data
  422.         android:name="android.support.FILE_PROVIDER_PATHS"
  423.         android:resource="@xml/file_paths" />
  424. </provider>
  425. <provider
  426.     android:name="androidx.core.content.FileProvider"
  427.     android:authorities="${applicationId}.fileprovider"
  428.     android:exported="false"
  429.     android:grantUriPermissions="true">
  430.     <meta-data
  431.         android:name="android.support.FILE_PROVIDER_PATHS"
  432.         android:resource="@xml/file_paths" />
  433. </provider><cache-path name="apk_cache" path="apk/" />
  434. <provider
  435.     android:name="androidx.core.content.FileProvider"
  436.     android:authorities="${applicationId}.fileprovider"
  437.     android:exported="false"
  438.     android:grantUriPermissions="true">
  439.     <meta-data
  440.         android:name="android.support.FILE_PROVIDER_PATHS"
  441.         android:resource="@xml/file_paths" />
  442. </provider>
  443. <provider
  444.     android:name="androidx.core.content.FileProvider"
  445.     android:authorities="${applicationId}.fileprovider"
  446.     android:exported="false"
  447.     android:grantUriPermissions="true">
  448.     <meta-data
  449.         android:name="android.support.FILE_PROVIDER_PATHS"
  450.         android:resource="@xml/file_paths" />
  451. </provider><cache-path name="all_cache" path="." />
  452. <provider
  453.     android:name="androidx.core.content.FileProvider"
  454.     android:authorities="${applicationId}.fileprovider"
  455.     android:exported="false"
  456.     android:grantUriPermissions="true">
  457.     <meta-data
  458.         android:name="android.support.FILE_PROVIDER_PATHS"
  459.         android:resource="@xml/file_paths" />
  460. </provider>
  461. <provider
  462.     android:name="androidx.core.content.FileProvider"
  463.     android:authorities="${applicationId}.fileprovider"
  464.     android:exported="false"
  465.     android:grantUriPermissions="true">
  466.     <meta-data
  467.         android:name="android.support.FILE_PROVIDER_PATHS"
  468.         android:resource="@xml/file_paths" />
  469. </provider><external-files-path name="external_app_files" path="." />
  470. </paths>} else {
  471. <?xml version="1.0" encoding="utf-8"?>
  472. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  473. <provider
  474.     android:name="androidx.core.content.FileProvider"
  475.     android:authorities="${applicationId}.fileprovider"
  476.     android:exported="false"
  477.     android:grantUriPermissions="true">
  478.     <meta-data
  479.         android:name="android.support.FILE_PROVIDER_PATHS"
  480.         android:resource="@xml/file_paths" />
  481. </provider>
  482. <provider
  483.     android:name="androidx.core.content.FileProvider"
  484.     android:authorities="${applicationId}.fileprovider"
  485.     android:exported="false"
  486.     android:grantUriPermissions="true">
  487.     <meta-data
  488.         android:name="android.support.FILE_PROVIDER_PATHS"
  489.         android:resource="@xml/file_paths" />
  490. </provider><cache-path name="apk_cache" path="apk/" />
  491. <provider
  492.     android:name="androidx.core.content.FileProvider"
  493.     android:authorities="${applicationId}.fileprovider"
  494.     android:exported="false"
  495.     android:grantUriPermissions="true">
  496.     <meta-data
  497.         android:name="android.support.FILE_PROVIDER_PATHS"
  498.         android:resource="@xml/file_paths" />
  499. </provider>
  500. <provider
  501.     android:name="androidx.core.content.FileProvider"
  502.     android:authorities="${applicationId}.fileprovider"
  503.     android:exported="false"
  504.     android:grantUriPermissions="true">
  505.     <meta-data
  506.         android:name="android.support.FILE_PROVIDER_PATHS"
  507.         android:resource="@xml/file_paths" />
  508. </provider><cache-path name="all_cache" path="." />
  509. <provider
  510.     android:name="androidx.core.content.FileProvider"
  511.     android:authorities="${applicationId}.fileprovider"
  512.     android:exported="false"
  513.     android:grantUriPermissions="true">
  514.     <meta-data
  515.         android:name="android.support.FILE_PROVIDER_PATHS"
  516.         android:resource="@xml/file_paths" />
  517. </provider>
  518. <provider
  519.     android:name="androidx.core.content.FileProvider"
  520.     android:authorities="${applicationId}.fileprovider"
  521.     android:exported="false"
  522.     android:grantUriPermissions="true">
  523.     <meta-data
  524.         android:name="android.support.FILE_PROVIDER_PATHS"
  525.         android:resource="@xml/file_paths" />
  526. </provider><external-files-path name="external_app_files" path="." />
  527. </paths><provider
  528.     android:name="androidx.core.content.FileProvider"
  529.     android:authorities="${applicationId}.fileprovider"
  530.     android:exported="false"
  531.     android:grantUriPermissions="true">
  532.     <meta-data
  533.         android:name="android.support.FILE_PROVIDER_PATHS"
  534.         android:resource="@xml/file_paths" />
  535. </provider>result.error("INVALID_ARGUMENT", "文件路径不能为空", null)
  536. <?xml version="1.0" encoding="utf-8"?>
  537. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  538. <provider
  539.     android:name="androidx.core.content.FileProvider"
  540.     android:authorities="${applicationId}.fileprovider"
  541.     android:exported="false"
  542.     android:grantUriPermissions="true">
  543.     <meta-data
  544.         android:name="android.support.FILE_PROVIDER_PATHS"
  545.         android:resource="@xml/file_paths" />
  546. </provider>
  547. <provider
  548.     android:name="androidx.core.content.FileProvider"
  549.     android:authorities="${applicationId}.fileprovider"
  550.     android:exported="false"
  551.     android:grantUriPermissions="true">
  552.     <meta-data
  553.         android:name="android.support.FILE_PROVIDER_PATHS"
  554.         android:resource="@xml/file_paths" />
  555. </provider><cache-path name="apk_cache" path="apk/" />
  556. <provider
  557.     android:name="androidx.core.content.FileProvider"
  558.     android:authorities="${applicationId}.fileprovider"
  559.     android:exported="false"
  560.     android:grantUriPermissions="true">
  561.     <meta-data
  562.         android:name="android.support.FILE_PROVIDER_PATHS"
  563.         android:resource="@xml/file_paths" />
  564. </provider>
  565. <provider
  566.     android:name="androidx.core.content.FileProvider"
  567.     android:authorities="${applicationId}.fileprovider"
  568.     android:exported="false"
  569.     android:grantUriPermissions="true">
  570.     <meta-data
  571.         android:name="android.support.FILE_PROVIDER_PATHS"
  572.         android:resource="@xml/file_paths" />
  573. </provider><cache-path name="all_cache" path="." />
  574. <provider
  575.     android:name="androidx.core.content.FileProvider"
  576.     android:authorities="${applicationId}.fileprovider"
  577.     android:exported="false"
  578.     android:grantUriPermissions="true">
  579.     <meta-data
  580.         android:name="android.support.FILE_PROVIDER_PATHS"
  581.         android:resource="@xml/file_paths" />
  582. </provider>
  583. <provider
  584.     android:name="androidx.core.content.FileProvider"
  585.     android:authorities="${applicationId}.fileprovider"
  586.     android:exported="false"
  587.     android:grantUriPermissions="true">
  588.     <meta-data
  589.         android:name="android.support.FILE_PROVIDER_PATHS"
  590.         android:resource="@xml/file_paths" />
  591. </provider><external-files-path name="external_app_files" path="." />
  592. </paths>}
  593. <provider
  594.     android:name="androidx.core.content.FileProvider"
  595.     android:authorities="${applicationId}.fileprovider"
  596.     android:exported="false"
  597.     android:grantUriPermissions="true">
  598.     <meta-data
  599.         android:name="android.support.FILE_PROVIDER_PATHS"
  600.         android:resource="@xml/file_paths" />
  601. </provider><provider
  602.     android:name="androidx.core.content.FileProvider"
  603.     android:authorities="${applicationId}.fileprovider"
  604.     android:exported="false"
  605.     android:grantUriPermissions="true">
  606.     <meta-data
  607.         android:name="android.support.FILE_PROVIDER_PATHS"
  608.         android:resource="@xml/file_paths" />
  609. </provider><provider
  610.     android:name="androidx.core.content.FileProvider"
  611.     android:authorities="${applicationId}.fileprovider"
  612.     android:exported="false"
  613.     android:grantUriPermissions="true">
  614.     <meta-data
  615.         android:name="android.support.FILE_PROVIDER_PATHS"
  616.         android:resource="@xml/file_paths" />
  617. </provider><provider
  618.     android:name="androidx.core.content.FileProvider"
  619.     android:authorities="${applicationId}.fileprovider"
  620.     android:exported="false"
  621.     android:grantUriPermissions="true">
  622.     <meta-data
  623.         android:name="android.support.FILE_PROVIDER_PATHS"
  624.         android:resource="@xml/file_paths" />
  625. </provider><provider
  626.     android:name="androidx.core.content.FileProvider"
  627.     android:authorities="${applicationId}.fileprovider"
  628.     android:exported="false"
  629.     android:grantUriPermissions="true">
  630.     <meta-data
  631.         android:name="android.support.FILE_PROVIDER_PATHS"
  632.         android:resource="@xml/file_paths" />
  633. </provider>}
  634. <provider
  635.     android:name="androidx.core.content.FileProvider"
  636.     android:authorities="${applicationId}.fileprovider"
  637.     android:exported="false"
  638.     android:grantUriPermissions="true">
  639.     <meta-data
  640.         android:name="android.support.FILE_PROVIDER_PATHS"
  641.         android:resource="@xml/file_paths" />
  642. </provider><provider
  643.     android:name="androidx.core.content.FileProvider"
  644.     android:authorities="${applicationId}.fileprovider"
  645.     android:exported="false"
  646.     android:grantUriPermissions="true">
  647.     <meta-data
  648.         android:name="android.support.FILE_PROVIDER_PATHS"
  649.         android:resource="@xml/file_paths" />
  650. </provider><provider
  651.     android:name="androidx.core.content.FileProvider"
  652.     android:authorities="${applicationId}.fileprovider"
  653.     android:exported="false"
  654.     android:grantUriPermissions="true">
  655.     <meta-data
  656.         android:name="android.support.FILE_PROVIDER_PATHS"
  657.         android:resource="@xml/file_paths" />
  658. </provider><provider
  659.     android:name="androidx.core.content.FileProvider"
  660.     android:authorities="${applicationId}.fileprovider"
  661.     android:exported="false"
  662.     android:grantUriPermissions="true">
  663.     <meta-data
  664.         android:name="android.support.FILE_PROVIDER_PATHS"
  665.         android:resource="@xml/file_paths" />
  666. </provider><provider
  667.     android:name="androidx.core.content.FileProvider"
  668.     android:authorities="${applicationId}.fileprovider"
  669.     android:exported="false"
  670.     android:grantUriPermissions="true">
  671.     <meta-data
  672.         android:name="android.support.FILE_PROVIDER_PATHS"
  673.         android:resource="@xml/file_paths" />
  674. </provider>else -> result.notImplemented()
  675. <provider
  676.     android:name="androidx.core.content.FileProvider"
  677.     android:authorities="${applicationId}.fileprovider"
  678.     android:exported="false"
  679.     android:grantUriPermissions="true">
  680.     <meta-data
  681.         android:name="android.support.FILE_PROVIDER_PATHS"
  682.         android:resource="@xml/file_paths" />
  683. </provider><provider
  684.     android:name="androidx.core.content.FileProvider"
  685.     android:authorities="${applicationId}.fileprovider"
  686.     android:exported="false"
  687.     android:grantUriPermissions="true">
  688.     <meta-data
  689.         android:name="android.support.FILE_PROVIDER_PATHS"
  690.         android:resource="@xml/file_paths" />
  691. </provider><provider
  692.     android:name="androidx.core.content.FileProvider"
  693.     android:authorities="${applicationId}.fileprovider"
  694.     android:exported="false"
  695.     android:grantUriPermissions="true">
  696.     <meta-data
  697.         android:name="android.support.FILE_PROVIDER_PATHS"
  698.         android:resource="@xml/file_paths" />
  699. </provider><provider
  700.     android:name="androidx.core.content.FileProvider"
  701.     android:authorities="${applicationId}.fileprovider"
  702.     android:exported="false"
  703.     android:grantUriPermissions="true">
  704.     <meta-data
  705.         android:name="android.support.FILE_PROVIDER_PATHS"
  706.         android:resource="@xml/file_paths" />
  707. </provider>}
  708. <provider
  709.     android:name="androidx.core.content.FileProvider"
  710.     android:authorities="${applicationId}.fileprovider"
  711.     android:exported="false"
  712.     android:grantUriPermissions="true">
  713.     <meta-data
  714.         android:name="android.support.FILE_PROVIDER_PATHS"
  715.         android:resource="@xml/file_paths" />
  716. </provider><provider
  717.     android:name="androidx.core.content.FileProvider"
  718.     android:authorities="${applicationId}.fileprovider"
  719.     android:exported="false"
  720.     android:grantUriPermissions="true">
  721.     <meta-data
  722.         android:name="android.support.FILE_PROVIDER_PATHS"
  723.         android:resource="@xml/file_paths" />
  724. </provider><provider
  725.     android:name="androidx.core.content.FileProvider"
  726.     android:authorities="${applicationId}.fileprovider"
  727.     android:exported="false"
  728.     android:grantUriPermissions="true">
  729.     <meta-data
  730.         android:name="android.support.FILE_PROVIDER_PATHS"
  731.         android:resource="@xml/file_paths" />
  732. </provider>}
  733. <provider
  734.     android:name="androidx.core.content.FileProvider"
  735.     android:authorities="${applicationId}.fileprovider"
  736.     android:exported="false"
  737.     android:grantUriPermissions="true">
  738.     <meta-data
  739.         android:name="android.support.FILE_PROVIDER_PATHS"
  740.         android:resource="@xml/file_paths" />
  741. </provider>}
  742. <provider
  743.     android:name="androidx.core.content.FileProvider"
  744.     android:authorities="${applicationId}.fileprovider"
  745.     android:exported="false"
  746.     android:grantUriPermissions="true">
  747.     <meta-data
  748.         android:name="android.support.FILE_PROVIDER_PATHS"
  749.         android:resource="@xml/file_paths" />
  750. </provider>private fun installApkWithIntent(filePath: String): Boolean {
  751. <provider
  752.     android:name="androidx.core.content.FileProvider"
  753.     android:authorities="${applicationId}.fileprovider"
  754.     android:exported="false"
  755.     android:grantUriPermissions="true">
  756.     <meta-data
  757.         android:name="android.support.FILE_PROVIDER_PATHS"
  758.         android:resource="@xml/file_paths" />
  759. </provider><provider
  760.     android:name="androidx.core.content.FileProvider"
  761.     android:authorities="${applicationId}.fileprovider"
  762.     android:exported="false"
  763.     android:grantUriPermissions="true">
  764.     <meta-data
  765.         android:name="android.support.FILE_PROVIDER_PATHS"
  766.         android:resource="@xml/file_paths" />
  767. </provider>return try {
  768. <provider
  769.     android:name="androidx.core.content.FileProvider"
  770.     android:authorities="${applicationId}.fileprovider"
  771.     android:exported="false"
  772.     android:grantUriPermissions="true">
  773.     <meta-data
  774.         android:name="android.support.FILE_PROVIDER_PATHS"
  775.         android:resource="@xml/file_paths" />
  776. </provider><provider
  777.     android:name="androidx.core.content.FileProvider"
  778.     android:authorities="${applicationId}.fileprovider"
  779.     android:exported="false"
  780.     android:grantUriPermissions="true">
  781.     <meta-data
  782.         android:name="android.support.FILE_PROVIDER_PATHS"
  783.         android:resource="@xml/file_paths" />
  784. </provider><provider
  785.     android:name="androidx.core.content.FileProvider"
  786.     android:authorities="${applicationId}.fileprovider"
  787.     android:exported="false"
  788.     android:grantUriPermissions="true">
  789.     <meta-data
  790.         android:name="android.support.FILE_PROVIDER_PATHS"
  791.         android:resource="@xml/file_paths" />
  792. </provider>android.util.Log.d("MainActivity", "UPDATE_CRASH: 开始原生Intent安装APK: $filePath")
  793. <provider
  794.     android:name="androidx.core.content.FileProvider"
  795.     android:authorities="${applicationId}.fileprovider"
  796.     android:exported="false"
  797.     android:grantUriPermissions="true">
  798.     <meta-data
  799.         android:name="android.support.FILE_PROVIDER_PATHS"
  800.         android:resource="@xml/file_paths" />
  801. </provider><provider
  802.     android:name="androidx.core.content.FileProvider"
  803.     android:authorities="${applicationId}.fileprovider"
  804.     android:exported="false"
  805.     android:grantUriPermissions="true">
  806.     <meta-data
  807.         android:name="android.support.FILE_PROVIDER_PATHS"
  808.         android:resource="@xml/file_paths" />
  809. </provider><provider
  810.     android:name="androidx.core.content.FileProvider"
  811.     android:authorities="${applicationId}.fileprovider"
  812.     android:exported="false"
  813.     android:grantUriPermissions="true">
  814.     <meta-data
  815.         android:name="android.support.FILE_PROVIDER_PATHS"
  816.         android:resource="@xml/file_paths" />
  817. </provider>val sourceFile = File(filePath)
  818. <provider
  819.     android:name="androidx.core.content.FileProvider"
  820.     android:authorities="${applicationId}.fileprovider"
  821.     android:exported="false"
  822.     android:grantUriPermissions="true">
  823.     <meta-data
  824.         android:name="android.support.FILE_PROVIDER_PATHS"
  825.         android:resource="@xml/file_paths" />
  826. </provider><provider
  827.     android:name="androidx.core.content.FileProvider"
  828.     android:authorities="${applicationId}.fileprovider"
  829.     android:exported="false"
  830.     android:grantUriPermissions="true">
  831.     <meta-data
  832.         android:name="android.support.FILE_PROVIDER_PATHS"
  833.         android:resource="@xml/file_paths" />
  834. </provider><provider
  835.     android:name="androidx.core.content.FileProvider"
  836.     android:authorities="${applicationId}.fileprovider"
  837.     android:exported="false"
  838.     android:grantUriPermissions="true">
  839.     <meta-data
  840.         android:name="android.support.FILE_PROVIDER_PATHS"
  841.         android:resource="@xml/file_paths" />
  842. </provider>if (!sourceFile.exists()) {
  843. <provider
  844.     android:name="androidx.core.content.FileProvider"
  845.     android:authorities="${applicationId}.fileprovider"
  846.     android:exported="false"
  847.     android:grantUriPermissions="true">
  848.     <meta-data
  849.         android:name="android.support.FILE_PROVIDER_PATHS"
  850.         android:resource="@xml/file_paths" />
  851. </provider><provider
  852.     android:name="androidx.core.content.FileProvider"
  853.     android:authorities="${applicationId}.fileprovider"
  854.     android:exported="false"
  855.     android:grantUriPermissions="true">
  856.     <meta-data
  857.         android:name="android.support.FILE_PROVIDER_PATHS"
  858.         android:resource="@xml/file_paths" />
  859. </provider><provider
  860.     android:name="androidx.core.content.FileProvider"
  861.     android:authorities="${applicationId}.fileprovider"
  862.     android:exported="false"
  863.     android:grantUriPermissions="true">
  864.     <meta-data
  865.         android:name="android.support.FILE_PROVIDER_PATHS"
  866.         android:resource="@xml/file_paths" />
  867. </provider><provider
  868.     android:name="androidx.core.content.FileProvider"
  869.     android:authorities="${applicationId}.fileprovider"
  870.     android:exported="false"
  871.     android:grantUriPermissions="true">
  872.     <meta-data
  873.         android:name="android.support.FILE_PROVIDER_PATHS"
  874.         android:resource="@xml/file_paths" />
  875. </provider>android.util.Log.e("MainActivity", "UPDATE_CRASH: APK文件不存在: $filePath")
  876. <provider
  877.     android:name="androidx.core.content.FileProvider"
  878.     android:authorities="${applicationId}.fileprovider"
  879.     android:exported="false"
  880.     android:grantUriPermissions="true">
  881.     <meta-data
  882.         android:name="android.support.FILE_PROVIDER_PATHS"
  883.         android:resource="@xml/file_paths" />
  884. </provider><provider
  885.     android:name="androidx.core.content.FileProvider"
  886.     android:authorities="${applicationId}.fileprovider"
  887.     android:exported="false"
  888.     android:grantUriPermissions="true">
  889.     <meta-data
  890.         android:name="android.support.FILE_PROVIDER_PATHS"
  891.         android:resource="@xml/file_paths" />
  892. </provider><provider
  893.     android:name="androidx.core.content.FileProvider"
  894.     android:authorities="${applicationId}.fileprovider"
  895.     android:exported="false"
  896.     android:grantUriPermissions="true">
  897.     <meta-data
  898.         android:name="android.support.FILE_PROVIDER_PATHS"
  899.         android:resource="@xml/file_paths" />
  900. </provider><provider
  901.     android:name="androidx.core.content.FileProvider"
  902.     android:authorities="${applicationId}.fileprovider"
  903.     android:exported="false"
  904.     android:grantUriPermissions="true">
  905.     <meta-data
  906.         android:name="android.support.FILE_PROVIDER_PATHS"
  907.         android:resource="@xml/file_paths" />
  908. </provider>return false
  909. <provider
  910.     android:name="androidx.core.content.FileProvider"
  911.     android:authorities="${applicationId}.fileprovider"
  912.     android:exported="false"
  913.     android:grantUriPermissions="true">
  914.     <meta-data
  915.         android:name="android.support.FILE_PROVIDER_PATHS"
  916.         android:resource="@xml/file_paths" />
  917. </provider><provider
  918.     android:name="androidx.core.content.FileProvider"
  919.     android:authorities="${applicationId}.fileprovider"
  920.     android:exported="false"
  921.     android:grantUriPermissions="true">
  922.     <meta-data
  923.         android:name="android.support.FILE_PROVIDER_PATHS"
  924.         android:resource="@xml/file_paths" />
  925. </provider><provider
  926.     android:name="androidx.core.content.FileProvider"
  927.     android:authorities="${applicationId}.fileprovider"
  928.     android:exported="false"
  929.     android:grantUriPermissions="true">
  930.     <meta-data
  931.         android:name="android.support.FILE_PROVIDER_PATHS"
  932.         android:resource="@xml/file_paths" />
  933. </provider>}
  934. <provider
  935.     android:name="androidx.core.content.FileProvider"
  936.     android:authorities="${applicationId}.fileprovider"
  937.     android:exported="false"
  938.     android:grantUriPermissions="true">
  939.     <meta-data
  940.         android:name="android.support.FILE_PROVIDER_PATHS"
  941.         android:resource="@xml/file_paths" />
  942. </provider><provider
  943.     android:name="androidx.core.content.FileProvider"
  944.     android:authorities="${applicationId}.fileprovider"
  945.     android:exported="false"
  946.     android:grantUriPermissions="true">
  947.     <meta-data
  948.         android:name="android.support.FILE_PROVIDER_PATHS"
  949.         android:resource="@xml/file_paths" />
  950. </provider><provider
  951.     android:name="androidx.core.content.FileProvider"
  952.     android:authorities="${applicationId}.fileprovider"
  953.     android:exported="false"
  954.     android:grantUriPermissions="true">
  955.     <meta-data
  956.         android:name="android.support.FILE_PROVIDER_PATHS"
  957.         android:resource="@xml/file_paths" />
  958. </provider>// 直接在缓存根目录创建APK,避免子目录配置问题
  959. <provider
  960.     android:name="androidx.core.content.FileProvider"
  961.     android:authorities="${applicationId}.fileprovider"
  962.     android:exported="false"
  963.     android:grantUriPermissions="true">
  964.     <meta-data
  965.         android:name="android.support.FILE_PROVIDER_PATHS"
  966.         android:resource="@xml/file_paths" />
  967. </provider><provider
  968.     android:name="androidx.core.content.FileProvider"
  969.     android:authorities="${applicationId}.fileprovider"
  970.     android:exported="false"
  971.     android:grantUriPermissions="true">
  972.     <meta-data
  973.         android:name="android.support.FILE_PROVIDER_PATHS"
  974.         android:resource="@xml/file_paths" />
  975. </provider><provider
  976.     android:name="androidx.core.content.FileProvider"
  977.     android:authorities="${applicationId}.fileprovider"
  978.     android:exported="false"
  979.     android:grantUriPermissions="true">
  980.     <meta-data
  981.         android:name="android.support.FILE_PROVIDER_PATHS"
  982.         android:resource="@xml/file_paths" />
  983. </provider>val cachedApk = File(cacheDir, "install.apk")
  984. <provider
  985.     android:name="androidx.core.content.FileProvider"
  986.     android:authorities="${applicationId}.fileprovider"
  987.     android:exported="false"
  988.     android:grantUriPermissions="true">
  989.     <meta-data
  990.         android:name="android.support.FILE_PROVIDER_PATHS"
  991.         android:resource="@xml/file_paths" />
  992. </provider><provider
  993.     android:name="androidx.core.content.FileProvider"
  994.     android:authorities="${applicationId}.fileprovider"
  995.     android:exported="false"
  996.     android:grantUriPermissions="true">
  997.     <meta-data
  998.         android:name="android.support.FILE_PROVIDER_PATHS"
  999.         android:resource="@xml/file_paths" />
  1000. </provider><provider
  1001.     android:name="androidx.core.content.FileProvider"
  1002.     android:authorities="${applicationId}.fileprovider"
  1003.     android:exported="false"
  1004.     android:grantUriPermissions="true">
  1005.     <meta-data
  1006.         android:name="android.support.FILE_PROVIDER_PATHS"
  1007.         android:resource="@xml/file_paths" />
  1008. </provider>sourceFile.copyTo(cachedApk, overwrite = true)
  1009. <provider
  1010.     android:name="androidx.core.content.FileProvider"
  1011.     android:authorities="${applicationId}.fileprovider"
  1012.     android:exported="false"
  1013.     android:grantUriPermissions="true">
  1014.     <meta-data
  1015.         android:name="android.support.FILE_PROVIDER_PATHS"
  1016.         android:resource="@xml/file_paths" />
  1017. </provider><provider
  1018.     android:name="androidx.core.content.FileProvider"
  1019.     android:authorities="${applicationId}.fileprovider"
  1020.     android:exported="false"
  1021.     android:grantUriPermissions="true">
  1022.     <meta-data
  1023.         android:name="android.support.FILE_PROVIDER_PATHS"
  1024.         android:resource="@xml/file_paths" />
  1025. </provider><provider
  1026.     android:name="androidx.core.content.FileProvider"
  1027.     android:authorities="${applicationId}.fileprovider"
  1028.     android:exported="false"
  1029.     android:grantUriPermissions="true">
  1030.     <meta-data
  1031.         android:name="android.support.FILE_PROVIDER_PATHS"
  1032.         android:resource="@xml/file_paths" />
  1033. </provider>android.util.Log.d("MainActivity", "UPDATE_CRASH: APK已复制到: ${cachedApk.absolutePath}")
  1034. <provider
  1035.     android:name="androidx.core.content.FileProvider"
  1036.     android:authorities="${applicationId}.fileprovider"
  1037.     android:exported="false"
  1038.     android:grantUriPermissions="true">
  1039.     <meta-data
  1040.         android:name="android.support.FILE_PROVIDER_PATHS"
  1041.         android:resource="@xml/file_paths" />
  1042. </provider><provider
  1043.     android:name="androidx.core.content.FileProvider"
  1044.     android:authorities="${applicationId}.fileprovider"
  1045.     android:exported="false"
  1046.     android:grantUriPermissions="true">
  1047.     <meta-data
  1048.         android:name="android.support.FILE_PROVIDER_PATHS"
  1049.         android:resource="@xml/file_paths" />
  1050. </provider><provider
  1051.     android:name="androidx.core.content.FileProvider"
  1052.     android:authorities="${applicationId}.fileprovider"
  1053.     android:exported="false"
  1054.     android:grantUriPermissions="true">
  1055.     <meta-data
  1056.         android:name="android.support.FILE_PROVIDER_PATHS"
  1057.         android:resource="@xml/file_paths" />
  1058. </provider>val intent = Intent(Intent.ACTION_VIEW)
  1059. <provider
  1060.     android:name="androidx.core.content.FileProvider"
  1061.     android:authorities="${applicationId}.fileprovider"
  1062.     android:exported="false"
  1063.     android:grantUriPermissions="true">
  1064.     <meta-data
  1065.         android:name="android.support.FILE_PROVIDER_PATHS"
  1066.         android:resource="@xml/file_paths" />
  1067. </provider><provider
  1068.     android:name="androidx.core.content.FileProvider"
  1069.     android:authorities="${applicationId}.fileprovider"
  1070.     android:exported="false"
  1071.     android:grantUriPermissions="true">
  1072.     <meta-data
  1073.         android:name="android.support.FILE_PROVIDER_PATHS"
  1074.         android:resource="@xml/file_paths" />
  1075. </provider><provider
  1076.     android:name="androidx.core.content.FileProvider"
  1077.     android:authorities="${applicationId}.fileprovider"
  1078.     android:exported="false"
  1079.     android:grantUriPermissions="true">
  1080.     <meta-data
  1081.         android:name="android.support.FILE_PROVIDER_PATHS"
  1082.         android:resource="@xml/file_paths" />
  1083. </provider>try {
  1084. <provider
  1085.     android:name="androidx.core.content.FileProvider"
  1086.     android:authorities="${applicationId}.fileprovider"
  1087.     android:exported="false"
  1088.     android:grantUriPermissions="true">
  1089.     <meta-data
  1090.         android:name="android.support.FILE_PROVIDER_PATHS"
  1091.         android:resource="@xml/file_paths" />
  1092. </provider><provider
  1093.     android:name="androidx.core.content.FileProvider"
  1094.     android:authorities="${applicationId}.fileprovider"
  1095.     android:exported="false"
  1096.     android:grantUriPermissions="true">
  1097.     <meta-data
  1098.         android:name="android.support.FILE_PROVIDER_PATHS"
  1099.         android:resource="@xml/file_paths" />
  1100. </provider><provider
  1101.     android:name="androidx.core.content.FileProvider"
  1102.     android:authorities="${applicationId}.fileprovider"
  1103.     android:exported="false"
  1104.     android:grantUriPermissions="true">
  1105.     <meta-data
  1106.         android:name="android.support.FILE_PROVIDER_PATHS"
  1107.         android:resource="@xml/file_paths" />
  1108. </provider><provider
  1109.     android:name="androidx.core.content.FileProvider"
  1110.     android:authorities="${applicationId}.fileprovider"
  1111.     android:exported="false"
  1112.     android:grantUriPermissions="true">
  1113.     <meta-data
  1114.         android:name="android.support.FILE_PROVIDER_PATHS"
  1115.         android:resource="@xml/file_paths" />
  1116. </provider>val uri = FileProvider.getUriForFile(
  1117. <provider
  1118.     android:name="androidx.core.content.FileProvider"
  1119.     android:authorities="${applicationId}.fileprovider"
  1120.     android:exported="false"
  1121.     android:grantUriPermissions="true">
  1122.     <meta-data
  1123.         android:name="android.support.FILE_PROVIDER_PATHS"
  1124.         android:resource="@xml/file_paths" />
  1125. </provider><provider
  1126.     android:name="androidx.core.content.FileProvider"
  1127.     android:authorities="${applicationId}.fileprovider"
  1128.     android:exported="false"
  1129.     android:grantUriPermissions="true">
  1130.     <meta-data
  1131.         android:name="android.support.FILE_PROVIDER_PATHS"
  1132.         android:resource="@xml/file_paths" />
  1133. </provider><provider
  1134.     android:name="androidx.core.content.FileProvider"
  1135.     android:authorities="${applicationId}.fileprovider"
  1136.     android:exported="false"
  1137.     android:grantUriPermissions="true">
  1138.     <meta-data
  1139.         android:name="android.support.FILE_PROVIDER_PATHS"
  1140.         android:resource="@xml/file_paths" />
  1141. </provider><provider
  1142.     android:name="androidx.core.content.FileProvider"
  1143.     android:authorities="${applicationId}.fileprovider"
  1144.     android:exported="false"
  1145.     android:grantUriPermissions="true">
  1146.     <meta-data
  1147.         android:name="android.support.FILE_PROVIDER_PATHS"
  1148.         android:resource="@xml/file_paths" />
  1149. </provider><provider
  1150.     android:name="androidx.core.content.FileProvider"
  1151.     android:authorities="${applicationId}.fileprovider"
  1152.     android:exported="false"
  1153.     android:grantUriPermissions="true">
  1154.     <meta-data
  1155.         android:name="android.support.FILE_PROVIDER_PATHS"
  1156.         android:resource="@xml/file_paths" />
  1157. </provider>this,
  1158. <provider
  1159.     android:name="androidx.core.content.FileProvider"
  1160.     android:authorities="${applicationId}.fileprovider"
  1161.     android:exported="false"
  1162.     android:grantUriPermissions="true">
  1163.     <meta-data
  1164.         android:name="android.support.FILE_PROVIDER_PATHS"
  1165.         android:resource="@xml/file_paths" />
  1166. </provider><provider
  1167.     android:name="androidx.core.content.FileProvider"
  1168.     android:authorities="${applicationId}.fileprovider"
  1169.     android:exported="false"
  1170.     android:grantUriPermissions="true">
  1171.     <meta-data
  1172.         android:name="android.support.FILE_PROVIDER_PATHS"
  1173.         android:resource="@xml/file_paths" />
  1174. </provider><provider
  1175.     android:name="androidx.core.content.FileProvider"
  1176.     android:authorities="${applicationId}.fileprovider"
  1177.     android:exported="false"
  1178.     android:grantUriPermissions="true">
  1179.     <meta-data
  1180.         android:name="android.support.FILE_PROVIDER_PATHS"
  1181.         android:resource="@xml/file_paths" />
  1182. </provider><provider
  1183.     android:name="androidx.core.content.FileProvider"
  1184.     android:authorities="${applicationId}.fileprovider"
  1185.     android:exported="false"
  1186.     android:grantUriPermissions="true">
  1187.     <meta-data
  1188.         android:name="android.support.FILE_PROVIDER_PATHS"
  1189.         android:resource="@xml/file_paths" />
  1190. </provider><provider
  1191.     android:name="androidx.core.content.FileProvider"
  1192.     android:authorities="${applicationId}.fileprovider"
  1193.     android:exported="false"
  1194.     android:grantUriPermissions="true">
  1195.     <meta-data
  1196.         android:name="android.support.FILE_PROVIDER_PATHS"
  1197.         android:resource="@xml/file_paths" />
  1198. </provider>"$packageName.fileprovider",
  1199. <provider
  1200.     android:name="androidx.core.content.FileProvider"
  1201.     android:authorities="${applicationId}.fileprovider"
  1202.     android:exported="false"
  1203.     android:grantUriPermissions="true">
  1204.     <meta-data
  1205.         android:name="android.support.FILE_PROVIDER_PATHS"
  1206.         android:resource="@xml/file_paths" />
  1207. </provider><provider
  1208.     android:name="androidx.core.content.FileProvider"
  1209.     android:authorities="${applicationId}.fileprovider"
  1210.     android:exported="false"
  1211.     android:grantUriPermissions="true">
  1212.     <meta-data
  1213.         android:name="android.support.FILE_PROVIDER_PATHS"
  1214.         android:resource="@xml/file_paths" />
  1215. </provider><provider
  1216.     android:name="androidx.core.content.FileProvider"
  1217.     android:authorities="${applicationId}.fileprovider"
  1218.     android:exported="false"
  1219.     android:grantUriPermissions="true">
  1220.     <meta-data
  1221.         android:name="android.support.FILE_PROVIDER_PATHS"
  1222.         android:resource="@xml/file_paths" />
  1223. </provider><provider
  1224.     android:name="androidx.core.content.FileProvider"
  1225.     android:authorities="${applicationId}.fileprovider"
  1226.     android:exported="false"
  1227.     android:grantUriPermissions="true">
  1228.     <meta-data
  1229.         android:name="android.support.FILE_PROVIDER_PATHS"
  1230.         android:resource="@xml/file_paths" />
  1231. </provider><provider
  1232.     android:name="androidx.core.content.FileProvider"
  1233.     android:authorities="${applicationId}.fileprovider"
  1234.     android:exported="false"
  1235.     android:grantUriPermissions="true">
  1236.     <meta-data
  1237.         android:name="android.support.FILE_PROVIDER_PATHS"
  1238.         android:resource="@xml/file_paths" />
  1239. </provider>cachedApk
  1240. <provider
  1241.     android:name="androidx.core.content.FileProvider"
  1242.     android:authorities="${applicationId}.fileprovider"
  1243.     android:exported="false"
  1244.     android:grantUriPermissions="true">
  1245.     <meta-data
  1246.         android:name="android.support.FILE_PROVIDER_PATHS"
  1247.         android:resource="@xml/file_paths" />
  1248. </provider><provider
  1249.     android:name="androidx.core.content.FileProvider"
  1250.     android:authorities="${applicationId}.fileprovider"
  1251.     android:exported="false"
  1252.     android:grantUriPermissions="true">
  1253.     <meta-data
  1254.         android:name="android.support.FILE_PROVIDER_PATHS"
  1255.         android:resource="@xml/file_paths" />
  1256. </provider><provider
  1257.     android:name="androidx.core.content.FileProvider"
  1258.     android:authorities="${applicationId}.fileprovider"
  1259.     android:exported="false"
  1260.     android:grantUriPermissions="true">
  1261.     <meta-data
  1262.         android:name="android.support.FILE_PROVIDER_PATHS"
  1263.         android:resource="@xml/file_paths" />
  1264. </provider><provider
  1265.     android:name="androidx.core.content.FileProvider"
  1266.     android:authorities="${applicationId}.fileprovider"
  1267.     android:exported="false"
  1268.     android:grantUriPermissions="true">
  1269.     <meta-data
  1270.         android:name="android.support.FILE_PROVIDER_PATHS"
  1271.         android:resource="@xml/file_paths" />
  1272. </provider>)
  1273. <provider
  1274.     android:name="androidx.core.content.FileProvider"
  1275.     android:authorities="${applicationId}.fileprovider"
  1276.     android:exported="false"
  1277.     android:grantUriPermissions="true">
  1278.     <meta-data
  1279.         android:name="android.support.FILE_PROVIDER_PATHS"
  1280.         android:resource="@xml/file_paths" />
  1281. </provider><provider
  1282.     android:name="androidx.core.content.FileProvider"
  1283.     android:authorities="${applicationId}.fileprovider"
  1284.     android:exported="false"
  1285.     android:grantUriPermissions="true">
  1286.     <meta-data
  1287.         android:name="android.support.FILE_PROVIDER_PATHS"
  1288.         android:resource="@xml/file_paths" />
  1289. </provider><provider
  1290.     android:name="androidx.core.content.FileProvider"
  1291.     android:authorities="${applicationId}.fileprovider"
  1292.     android:exported="false"
  1293.     android:grantUriPermissions="true">
  1294.     <meta-data
  1295.         android:name="android.support.FILE_PROVIDER_PATHS"
  1296.         android:resource="@xml/file_paths" />
  1297. </provider><provider
  1298.     android:name="androidx.core.content.FileProvider"
  1299.     android:authorities="${applicationId}.fileprovider"
  1300.     android:exported="false"
  1301.     android:grantUriPermissions="true">
  1302.     <meta-data
  1303.         android:name="android.support.FILE_PROVIDER_PATHS"
  1304.         android:resource="@xml/file_paths" />
  1305. </provider>android.util.Log.d("MainActivity", "UPDATE_CRASH: ✅ FileProvider URI创建成功: $uri")
  1306. <provider
  1307.     android:name="androidx.core.content.FileProvider"
  1308.     android:authorities="${applicationId}.fileprovider"
  1309.     android:exported="false"
  1310.     android:grantUriPermissions="true">
  1311.     <meta-data
  1312.         android:name="android.support.FILE_PROVIDER_PATHS"
  1313.         android:resource="@xml/file_paths" />
  1314. </provider><provider
  1315.     android:name="androidx.core.content.FileProvider"
  1316.     android:authorities="${applicationId}.fileprovider"
  1317.     android:exported="false"
  1318.     android:grantUriPermissions="true">
  1319.     <meta-data
  1320.         android:name="android.support.FILE_PROVIDER_PATHS"
  1321.         android:resource="@xml/file_paths" />
  1322. </provider><provider
  1323.     android:name="androidx.core.content.FileProvider"
  1324.     android:authorities="${applicationId}.fileprovider"
  1325.     android:exported="false"
  1326.     android:grantUriPermissions="true">
  1327.     <meta-data
  1328.         android:name="android.support.FILE_PROVIDER_PATHS"
  1329.         android:resource="@xml/file_paths" />
  1330. </provider><provider
  1331.     android:name="androidx.core.content.FileProvider"
  1332.     android:authorities="${applicationId}.fileprovider"
  1333.     android:exported="false"
  1334.     android:grantUriPermissions="true">
  1335.     <meta-data
  1336.         android:name="android.support.FILE_PROVIDER_PATHS"
  1337.         android:resource="@xml/file_paths" />
  1338. </provider>intent.setDataAndType(uri, "application/vnd.android.package-archive")
  1339. <provider
  1340.     android:name="androidx.core.content.FileProvider"
  1341.     android:authorities="${applicationId}.fileprovider"
  1342.     android:exported="false"
  1343.     android:grantUriPermissions="true">
  1344.     <meta-data
  1345.         android:name="android.support.FILE_PROVIDER_PATHS"
  1346.         android:resource="@xml/file_paths" />
  1347. </provider><provider
  1348.     android:name="androidx.core.content.FileProvider"
  1349.     android:authorities="${applicationId}.fileprovider"
  1350.     android:exported="false"
  1351.     android:grantUriPermissions="true">
  1352.     <meta-data
  1353.         android:name="android.support.FILE_PROVIDER_PATHS"
  1354.         android:resource="@xml/file_paths" />
  1355. </provider><provider
  1356.     android:name="androidx.core.content.FileProvider"
  1357.     android:authorities="${applicationId}.fileprovider"
  1358.     android:exported="false"
  1359.     android:grantUriPermissions="true">
  1360.     <meta-data
  1361.         android:name="android.support.FILE_PROVIDER_PATHS"
  1362.         android:resource="@xml/file_paths" />
  1363. </provider><provider
  1364.     android:name="androidx.core.content.FileProvider"
  1365.     android:authorities="${applicationId}.fileprovider"
  1366.     android:exported="false"
  1367.     android:grantUriPermissions="true">
  1368.     <meta-data
  1369.         android:name="android.support.FILE_PROVIDER_PATHS"
  1370.         android:resource="@xml/file_paths" />
  1371. </provider>intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
  1372. <provider
  1373.     android:name="androidx.core.content.FileProvider"
  1374.     android:authorities="${applicationId}.fileprovider"
  1375.     android:exported="false"
  1376.     android:grantUriPermissions="true">
  1377.     <meta-data
  1378.         android:name="android.support.FILE_PROVIDER_PATHS"
  1379.         android:resource="@xml/file_paths" />
  1380. </provider><provider
  1381.     android:name="androidx.core.content.FileProvider"
  1382.     android:authorities="${applicationId}.fileprovider"
  1383.     android:exported="false"
  1384.     android:grantUriPermissions="true">
  1385.     <meta-data
  1386.         android:name="android.support.FILE_PROVIDER_PATHS"
  1387.         android:resource="@xml/file_paths" />
  1388. </provider><provider
  1389.     android:name="androidx.core.content.FileProvider"
  1390.     android:authorities="${applicationId}.fileprovider"
  1391.     android:exported="false"
  1392.     android:grantUriPermissions="true">
  1393.     <meta-data
  1394.         android:name="android.support.FILE_PROVIDER_PATHS"
  1395.         android:resource="@xml/file_paths" />
  1396. </provider>} catch (e: IllegalArgumentException) {
  1397. <provider
  1398.     android:name="androidx.core.content.FileProvider"
  1399.     android:authorities="${applicationId}.fileprovider"
  1400.     android:exported="false"
  1401.     android:grantUriPermissions="true">
  1402.     <meta-data
  1403.         android:name="android.support.FILE_PROVIDER_PATHS"
  1404.         android:resource="@xml/file_paths" />
  1405. </provider><provider
  1406.     android:name="androidx.core.content.FileProvider"
  1407.     android:authorities="${applicationId}.fileprovider"
  1408.     android:exported="false"
  1409.     android:grantUriPermissions="true">
  1410.     <meta-data
  1411.         android:name="android.support.FILE_PROVIDER_PATHS"
  1412.         android:resource="@xml/file_paths" />
  1413. </provider><provider
  1414.     android:name="androidx.core.content.FileProvider"
  1415.     android:authorities="${applicationId}.fileprovider"
  1416.     android:exported="false"
  1417.     android:grantUriPermissions="true">
  1418.     <meta-data
  1419.         android:name="android.support.FILE_PROVIDER_PATHS"
  1420.         android:resource="@xml/file_paths" />
  1421. </provider><provider
  1422.     android:name="androidx.core.content.FileProvider"
  1423.     android:authorities="${applicationId}.fileprovider"
  1424.     android:exported="false"
  1425.     android:grantUriPermissions="true">
  1426.     <meta-data
  1427.         android:name="android.support.FILE_PROVIDER_PATHS"
  1428.         android:resource="@xml/file_paths" />
  1429. </provider>android.util.Log.e("MainActivity", "UPDATE_CRASH: ❌ FileProvider路径配置错误", e)
  1430. <provider
  1431.     android:name="androidx.core.content.FileProvider"
  1432.     android:authorities="${applicationId}.fileprovider"
  1433.     android:exported="false"
  1434.     android:grantUriPermissions="true">
  1435.     <meta-data
  1436.         android:name="android.support.FILE_PROVIDER_PATHS"
  1437.         android:resource="@xml/file_paths" />
  1438. </provider><provider
  1439.     android:name="androidx.core.content.FileProvider"
  1440.     android:authorities="${applicationId}.fileprovider"
  1441.     android:exported="false"
  1442.     android:grantUriPermissions="true">
  1443.     <meta-data
  1444.         android:name="android.support.FILE_PROVIDER_PATHS"
  1445.         android:resource="@xml/file_paths" />
  1446. </provider><provider
  1447.     android:name="androidx.core.content.FileProvider"
  1448.     android:authorities="${applicationId}.fileprovider"
  1449.     android:exported="false"
  1450.     android:grantUriPermissions="true">
  1451.     <meta-data
  1452.         android:name="android.support.FILE_PROVIDER_PATHS"
  1453.         android:resource="@xml/file_paths" />
  1454. </provider><provider
  1455.     android:name="androidx.core.content.FileProvider"
  1456.     android:authorities="${applicationId}.fileprovider"
  1457.     android:exported="false"
  1458.     android:grantUriPermissions="true">
  1459.     <meta-data
  1460.         android:name="android.support.FILE_PROVIDER_PATHS"
  1461.         android:resource="@xml/file_paths" />
  1462. </provider>return false
  1463. <provider
  1464.     android:name="androidx.core.content.FileProvider"
  1465.     android:authorities="${applicationId}.fileprovider"
  1466.     android:exported="false"
  1467.     android:grantUriPermissions="true">
  1468.     <meta-data
  1469.         android:name="android.support.FILE_PROVIDER_PATHS"
  1470.         android:resource="@xml/file_paths" />
  1471. </provider><provider
  1472.     android:name="androidx.core.content.FileProvider"
  1473.     android:authorities="${applicationId}.fileprovider"
  1474.     android:exported="false"
  1475.     android:grantUriPermissions="true">
  1476.     <meta-data
  1477.         android:name="android.support.FILE_PROVIDER_PATHS"
  1478.         android:resource="@xml/file_paths" />
  1479. </provider><provider
  1480.     android:name="androidx.core.content.FileProvider"
  1481.     android:authorities="${applicationId}.fileprovider"
  1482.     android:exported="false"
  1483.     android:grantUriPermissions="true">
  1484.     <meta-data
  1485.         android:name="android.support.FILE_PROVIDER_PATHS"
  1486.         android:resource="@xml/file_paths" />
  1487. </provider>} catch (e: Exception) {
  1488. <provider
  1489.     android:name="androidx.core.content.FileProvider"
  1490.     android:authorities="${applicationId}.fileprovider"
  1491.     android:exported="false"
  1492.     android:grantUriPermissions="true">
  1493.     <meta-data
  1494.         android:name="android.support.FILE_PROVIDER_PATHS"
  1495.         android:resource="@xml/file_paths" />
  1496. </provider><provider
  1497.     android:name="androidx.core.content.FileProvider"
  1498.     android:authorities="${applicationId}.fileprovider"
  1499.     android:exported="false"
  1500.     android:grantUriPermissions="true">
  1501.     <meta-data
  1502.         android:name="android.support.FILE_PROVIDER_PATHS"
  1503.         android:resource="@xml/file_paths" />
  1504. </provider><provider
  1505.     android:name="androidx.core.content.FileProvider"
  1506.     android:authorities="${applicationId}.fileprovider"
  1507.     android:exported="false"
  1508.     android:grantUriPermissions="true">
  1509.     <meta-data
  1510.         android:name="android.support.FILE_PROVIDER_PATHS"
  1511.         android:resource="@xml/file_paths" />
  1512. </provider><provider
  1513.     android:name="androidx.core.content.FileProvider"
  1514.     android:authorities="${applicationId}.fileprovider"
  1515.     android:exported="false"
  1516.     android:grantUriPermissions="true">
  1517.     <meta-data
  1518.         android:name="android.support.FILE_PROVIDER_PATHS"
  1519.         android:resource="@xml/file_paths" />
  1520. </provider>android.util.Log.e("MainActivity", "UPDATE_CRASH: ❌ FileProvider创建URI失败", e)
  1521. <provider
  1522.     android:name="androidx.core.content.FileProvider"
  1523.     android:authorities="${applicationId}.fileprovider"
  1524.     android:exported="false"
  1525.     android:grantUriPermissions="true">
  1526.     <meta-data
  1527.         android:name="android.support.FILE_PROVIDER_PATHS"
  1528.         android:resource="@xml/file_paths" />
  1529. </provider><provider
  1530.     android:name="androidx.core.content.FileProvider"
  1531.     android:authorities="${applicationId}.fileprovider"
  1532.     android:exported="false"
  1533.     android:grantUriPermissions="true">
  1534.     <meta-data
  1535.         android:name="android.support.FILE_PROVIDER_PATHS"
  1536.         android:resource="@xml/file_paths" />
  1537. </provider><provider
  1538.     android:name="androidx.core.content.FileProvider"
  1539.     android:authorities="${applicationId}.fileprovider"
  1540.     android:exported="false"
  1541.     android:grantUriPermissions="true">
  1542.     <meta-data
  1543.         android:name="android.support.FILE_PROVIDER_PATHS"
  1544.         android:resource="@xml/file_paths" />
  1545. </provider><provider
  1546.     android:name="androidx.core.content.FileProvider"
  1547.     android:authorities="${applicationId}.fileprovider"
  1548.     android:exported="false"
  1549.     android:grantUriPermissions="true">
  1550.     <meta-data
  1551.         android:name="android.support.FILE_PROVIDER_PATHS"
  1552.         android:resource="@xml/file_paths" />
  1553. </provider>return false
  1554. <provider
  1555.     android:name="androidx.core.content.FileProvider"
  1556.     android:authorities="${applicationId}.fileprovider"
  1557.     android:exported="false"
  1558.     android:grantUriPermissions="true">
  1559.     <meta-data
  1560.         android:name="android.support.FILE_PROVIDER_PATHS"
  1561.         android:resource="@xml/file_paths" />
  1562. </provider><provider
  1563.     android:name="androidx.core.content.FileProvider"
  1564.     android:authorities="${applicationId}.fileprovider"
  1565.     android:exported="false"
  1566.     android:grantUriPermissions="true">
  1567.     <meta-data
  1568.         android:name="android.support.FILE_PROVIDER_PATHS"
  1569.         android:resource="@xml/file_paths" />
  1570. </provider><provider
  1571.     android:name="androidx.core.content.FileProvider"
  1572.     android:authorities="${applicationId}.fileprovider"
  1573.     android:exported="false"
  1574.     android:grantUriPermissions="true">
  1575.     <meta-data
  1576.         android:name="android.support.FILE_PROVIDER_PATHS"
  1577.         android:resource="@xml/file_paths" />
  1578. </provider>}
  1579. <provider
  1580.     android:name="androidx.core.content.FileProvider"
  1581.     android:authorities="${applicationId}.fileprovider"
  1582.     android:exported="false"
  1583.     android:grantUriPermissions="true">
  1584.     <meta-data
  1585.         android:name="android.support.FILE_PROVIDER_PATHS"
  1586.         android:resource="@xml/file_paths" />
  1587. </provider><provider
  1588.     android:name="androidx.core.content.FileProvider"
  1589.     android:authorities="${applicationId}.fileprovider"
  1590.     android:exported="false"
  1591.     android:grantUriPermissions="true">
  1592.     <meta-data
  1593.         android:name="android.support.FILE_PROVIDER_PATHS"
  1594.         android:resource="@xml/file_paths" />
  1595. </provider><provider
  1596.     android:name="androidx.core.content.FileProvider"
  1597.     android:authorities="${applicationId}.fileprovider"
  1598.     android:exported="false"
  1599.     android:grantUriPermissions="true">
  1600.     <meta-data
  1601.         android:name="android.support.FILE_PROVIDER_PATHS"
  1602.         android:resource="@xml/file_paths" />
  1603. </provider>intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  1604. <provider
  1605.     android:name="androidx.core.content.FileProvider"
  1606.     android:authorities="${applicationId}.fileprovider"
  1607.     android:exported="false"
  1608.     android:grantUriPermissions="true">
  1609.     <meta-data
  1610.         android:name="android.support.FILE_PROVIDER_PATHS"
  1611.         android:resource="@xml/file_paths" />
  1612. </provider><provider
  1613.     android:name="androidx.core.content.FileProvider"
  1614.     android:authorities="${applicationId}.fileprovider"
  1615.     android:exported="false"
  1616.     android:grantUriPermissions="true">
  1617.     <meta-data
  1618.         android:name="android.support.FILE_PROVIDER_PATHS"
  1619.         android:resource="@xml/file_paths" />
  1620. </provider><provider
  1621.     android:name="androidx.core.content.FileProvider"
  1622.     android:authorities="${applicationId}.fileprovider"
  1623.     android:exported="false"
  1624.     android:grantUriPermissions="true">
  1625.     <meta-data
  1626.         android:name="android.support.FILE_PROVIDER_PATHS"
  1627.         android:resource="@xml/file_paths" />
  1628. </provider>// 检查是否有应用可以处理该Intent
  1629. <provider
  1630.     android:name="androidx.core.content.FileProvider"
  1631.     android:authorities="${applicationId}.fileprovider"
  1632.     android:exported="false"
  1633.     android:grantUriPermissions="true">
  1634.     <meta-data
  1635.         android:name="android.support.FILE_PROVIDER_PATHS"
  1636.         android:resource="@xml/file_paths" />
  1637. </provider><provider
  1638.     android:name="androidx.core.content.FileProvider"
  1639.     android:authorities="${applicationId}.fileprovider"
  1640.     android:exported="false"
  1641.     android:grantUriPermissions="true">
  1642.     <meta-data
  1643.         android:name="android.support.FILE_PROVIDER_PATHS"
  1644.         android:resource="@xml/file_paths" />
  1645. </provider><provider
  1646.     android:name="androidx.core.content.FileProvider"
  1647.     android:authorities="${applicationId}.fileprovider"
  1648.     android:exported="false"
  1649.     android:grantUriPermissions="true">
  1650.     <meta-data
  1651.         android:name="android.support.FILE_PROVIDER_PATHS"
  1652.         android:resource="@xml/file_paths" />
  1653. </provider>if (intent.resolveActivity(packageManager) != null) {
  1654. <provider
  1655.     android:name="androidx.core.content.FileProvider"
  1656.     android:authorities="${applicationId}.fileprovider"
  1657.     android:exported="false"
  1658.     android:grantUriPermissions="true">
  1659.     <meta-data
  1660.         android:name="android.support.FILE_PROVIDER_PATHS"
  1661.         android:resource="@xml/file_paths" />
  1662. </provider><provider
  1663.     android:name="androidx.core.content.FileProvider"
  1664.     android:authorities="${applicationId}.fileprovider"
  1665.     android:exported="false"
  1666.     android:grantUriPermissions="true">
  1667.     <meta-data
  1668.         android:name="android.support.FILE_PROVIDER_PATHS"
  1669.         android:resource="@xml/file_paths" />
  1670. </provider><provider
  1671.     android:name="androidx.core.content.FileProvider"
  1672.     android:authorities="${applicationId}.fileprovider"
  1673.     android:exported="false"
  1674.     android:grantUriPermissions="true">
  1675.     <meta-data
  1676.         android:name="android.support.FILE_PROVIDER_PATHS"
  1677.         android:resource="@xml/file_paths" />
  1678. </provider><provider
  1679.     android:name="androidx.core.content.FileProvider"
  1680.     android:authorities="${applicationId}.fileprovider"
  1681.     android:exported="false"
  1682.     android:grantUriPermissions="true">
  1683.     <meta-data
  1684.         android:name="android.support.FILE_PROVIDER_PATHS"
  1685.         android:resource="@xml/file_paths" />
  1686. </provider>android.util.Log.d("MainActivity", "UPDATE_CRASH: 找到可处理APK安装的应用")
  1687. <provider
  1688.     android:name="androidx.core.content.FileProvider"
  1689.     android:authorities="${applicationId}.fileprovider"
  1690.     android:exported="false"
  1691.     android:grantUriPermissions="true">
  1692.     <meta-data
  1693.         android:name="android.support.FILE_PROVIDER_PATHS"
  1694.         android:resource="@xml/file_paths" />
  1695. </provider><provider
  1696.     android:name="androidx.core.content.FileProvider"
  1697.     android:authorities="${applicationId}.fileprovider"
  1698.     android:exported="false"
  1699.     android:grantUriPermissions="true">
  1700.     <meta-data
  1701.         android:name="android.support.FILE_PROVIDER_PATHS"
  1702.         android:resource="@xml/file_paths" />
  1703. </provider><provider
  1704.     android:name="androidx.core.content.FileProvider"
  1705.     android:authorities="${applicationId}.fileprovider"
  1706.     android:exported="false"
  1707.     android:grantUriPermissions="true">
  1708.     <meta-data
  1709.         android:name="android.support.FILE_PROVIDER_PATHS"
  1710.         android:resource="@xml/file_paths" />
  1711. </provider><provider
  1712.     android:name="androidx.core.content.FileProvider"
  1713.     android:authorities="${applicationId}.fileprovider"
  1714.     android:exported="false"
  1715.     android:grantUriPermissions="true">
  1716.     <meta-data
  1717.         android:name="android.support.FILE_PROVIDER_PATHS"
  1718.         android:resource="@xml/file_paths" />
  1719. </provider>startActivity(intent)
  1720. <provider
  1721.     android:name="androidx.core.content.FileProvider"
  1722.     android:authorities="${applicationId}.fileprovider"
  1723.     android:exported="false"
  1724.     android:grantUriPermissions="true">
  1725.     <meta-data
  1726.         android:name="android.support.FILE_PROVIDER_PATHS"
  1727.         android:resource="@xml/file_paths" />
  1728. </provider><provider
  1729.     android:name="androidx.core.content.FileProvider"
  1730.     android:authorities="${applicationId}.fileprovider"
  1731.     android:exported="false"
  1732.     android:grantUriPermissions="true">
  1733.     <meta-data
  1734.         android:name="android.support.FILE_PROVIDER_PATHS"
  1735.         android:resource="@xml/file_paths" />
  1736. </provider><provider
  1737.     android:name="androidx.core.content.FileProvider"
  1738.     android:authorities="${applicationId}.fileprovider"
  1739.     android:exported="false"
  1740.     android:grantUriPermissions="true">
  1741.     <meta-data
  1742.         android:name="android.support.FILE_PROVIDER_PATHS"
  1743.         android:resource="@xml/file_paths" />
  1744. </provider><provider
  1745.     android:name="androidx.core.content.FileProvider"
  1746.     android:authorities="${applicationId}.fileprovider"
  1747.     android:exported="false"
  1748.     android:grantUriPermissions="true">
  1749.     <meta-data
  1750.         android:name="android.support.FILE_PROVIDER_PATHS"
  1751.         android:resource="@xml/file_paths" />
  1752. </provider>android.util.Log.d("MainActivity", "UPDATE_CRASH: ✅ APK安装Intent启动成功")
  1753. <provider
  1754.     android:name="androidx.core.content.FileProvider"
  1755.     android:authorities="${applicationId}.fileprovider"
  1756.     android:exported="false"
  1757.     android:grantUriPermissions="true">
  1758.     <meta-data
  1759.         android:name="android.support.FILE_PROVIDER_PATHS"
  1760.         android:resource="@xml/file_paths" />
  1761. </provider><provider
  1762.     android:name="androidx.core.content.FileProvider"
  1763.     android:authorities="${applicationId}.fileprovider"
  1764.     android:exported="false"
  1765.     android:grantUriPermissions="true">
  1766.     <meta-data
  1767.         android:name="android.support.FILE_PROVIDER_PATHS"
  1768.         android:resource="@xml/file_paths" />
  1769. </provider><provider
  1770.     android:name="androidx.core.content.FileProvider"
  1771.     android:authorities="${applicationId}.fileprovider"
  1772.     android:exported="false"
  1773.     android:grantUriPermissions="true">
  1774.     <meta-data
  1775.         android:name="android.support.FILE_PROVIDER_PATHS"
  1776.         android:resource="@xml/file_paths" />
  1777. </provider><provider
  1778.     android:name="androidx.core.content.FileProvider"
  1779.     android:authorities="${applicationId}.fileprovider"
  1780.     android:exported="false"
  1781.     android:grantUriPermissions="true">
  1782.     <meta-data
  1783.         android:name="android.support.FILE_PROVIDER_PATHS"
  1784.         android:resource="@xml/file_paths" />
  1785. </provider>return true
  1786. <provider
  1787.     android:name="androidx.core.content.FileProvider"
  1788.     android:authorities="${applicationId}.fileprovider"
  1789.     android:exported="false"
  1790.     android:grantUriPermissions="true">
  1791.     <meta-data
  1792.         android:name="android.support.FILE_PROVIDER_PATHS"
  1793.         android:resource="@xml/file_paths" />
  1794. </provider><provider
  1795.     android:name="androidx.core.content.FileProvider"
  1796.     android:authorities="${applicationId}.fileprovider"
  1797.     android:exported="false"
  1798.     android:grantUriPermissions="true">
  1799.     <meta-data
  1800.         android:name="android.support.FILE_PROVIDER_PATHS"
  1801.         android:resource="@xml/file_paths" />
  1802. </provider><provider
  1803.     android:name="androidx.core.content.FileProvider"
  1804.     android:authorities="${applicationId}.fileprovider"
  1805.     android:exported="false"
  1806.     android:grantUriPermissions="true">
  1807.     <meta-data
  1808.         android:name="android.support.FILE_PROVIDER_PATHS"
  1809.         android:resource="@xml/file_paths" />
  1810. </provider>} else {
  1811. <provider
  1812.     android:name="androidx.core.content.FileProvider"
  1813.     android:authorities="${applicationId}.fileprovider"
  1814.     android:exported="false"
  1815.     android:grantUriPermissions="true">
  1816.     <meta-data
  1817.         android:name="android.support.FILE_PROVIDER_PATHS"
  1818.         android:resource="@xml/file_paths" />
  1819. </provider><provider
  1820.     android:name="androidx.core.content.FileProvider"
  1821.     android:authorities="${applicationId}.fileprovider"
  1822.     android:exported="false"
  1823.     android:grantUriPermissions="true">
  1824.     <meta-data
  1825.         android:name="android.support.FILE_PROVIDER_PATHS"
  1826.         android:resource="@xml/file_paths" />
  1827. </provider><provider
  1828.     android:name="androidx.core.content.FileProvider"
  1829.     android:authorities="${applicationId}.fileprovider"
  1830.     android:exported="false"
  1831.     android:grantUriPermissions="true">
  1832.     <meta-data
  1833.         android:name="android.support.FILE_PROVIDER_PATHS"
  1834.         android:resource="@xml/file_paths" />
  1835. </provider><provider
  1836.     android:name="androidx.core.content.FileProvider"
  1837.     android:authorities="${applicationId}.fileprovider"
  1838.     android:exported="false"
  1839.     android:grantUriPermissions="true">
  1840.     <meta-data
  1841.         android:name="android.support.FILE_PROVIDER_PATHS"
  1842.         android:resource="@xml/file_paths" />
  1843. </provider>android.util.Log.e("MainActivity", "UPDATE_CRASH: ❌ 没有应用可以处理APK安装")
  1844. <provider
  1845.     android:name="androidx.core.content.FileProvider"
  1846.     android:authorities="${applicationId}.fileprovider"
  1847.     android:exported="false"
  1848.     android:grantUriPermissions="true">
  1849.     <meta-data
  1850.         android:name="android.support.FILE_PROVIDER_PATHS"
  1851.         android:resource="@xml/file_paths" />
  1852. </provider><provider
  1853.     android:name="androidx.core.content.FileProvider"
  1854.     android:authorities="${applicationId}.fileprovider"
  1855.     android:exported="false"
  1856.     android:grantUriPermissions="true">
  1857.     <meta-data
  1858.         android:name="android.support.FILE_PROVIDER_PATHS"
  1859.         android:resource="@xml/file_paths" />
  1860. </provider><provider
  1861.     android:name="androidx.core.content.FileProvider"
  1862.     android:authorities="${applicationId}.fileprovider"
  1863.     android:exported="false"
  1864.     android:grantUriPermissions="true">
  1865.     <meta-data
  1866.         android:name="android.support.FILE_PROVIDER_PATHS"
  1867.         android:resource="@xml/file_paths" />
  1868. </provider><provider
  1869.     android:name="androidx.core.content.FileProvider"
  1870.     android:authorities="${applicationId}.fileprovider"
  1871.     android:exported="false"
  1872.     android:grantUriPermissions="true">
  1873.     <meta-data
  1874.         android:name="android.support.FILE_PROVIDER_PATHS"
  1875.         android:resource="@xml/file_paths" />
  1876. </provider>return false
  1877. <provider
  1878.     android:name="androidx.core.content.FileProvider"
  1879.     android:authorities="${applicationId}.fileprovider"
  1880.     android:exported="false"
  1881.     android:grantUriPermissions="true">
  1882.     <meta-data
  1883.         android:name="android.support.FILE_PROVIDER_PATHS"
  1884.         android:resource="@xml/file_paths" />
  1885. </provider><provider
  1886.     android:name="androidx.core.content.FileProvider"
  1887.     android:authorities="${applicationId}.fileprovider"
  1888.     android:exported="false"
  1889.     android:grantUriPermissions="true">
  1890.     <meta-data
  1891.         android:name="android.support.FILE_PROVIDER_PATHS"
  1892.         android:resource="@xml/file_paths" />
  1893. </provider><provider
  1894.     android:name="androidx.core.content.FileProvider"
  1895.     android:authorities="${applicationId}.fileprovider"
  1896.     android:exported="false"
  1897.     android:grantUriPermissions="true">
  1898.     <meta-data
  1899.         android:name="android.support.FILE_PROVIDER_PATHS"
  1900.         android:resource="@xml/file_paths" />
  1901. </provider>}
  1902. <provider
  1903.     android:name="androidx.core.content.FileProvider"
  1904.     android:authorities="${applicationId}.fileprovider"
  1905.     android:exported="false"
  1906.     android:grantUriPermissions="true">
  1907.     <meta-data
  1908.         android:name="android.support.FILE_PROVIDER_PATHS"
  1909.         android:resource="@xml/file_paths" />
  1910. </provider><provider
  1911.     android:name="androidx.core.content.FileProvider"
  1912.     android:authorities="${applicationId}.fileprovider"
  1913.     android:exported="false"
  1914.     android:grantUriPermissions="true">
  1915.     <meta-data
  1916.         android:name="android.support.FILE_PROVIDER_PATHS"
  1917.         android:resource="@xml/file_paths" />
  1918. </provider>} catch (e: Exception) {
  1919. <provider
  1920.     android:name="androidx.core.content.FileProvider"
  1921.     android:authorities="${applicationId}.fileprovider"
  1922.     android:exported="false"
  1923.     android:grantUriPermissions="true">
  1924.     <meta-data
  1925.         android:name="android.support.FILE_PROVIDER_PATHS"
  1926.         android:resource="@xml/file_paths" />
  1927. </provider><provider
  1928.     android:name="androidx.core.content.FileProvider"
  1929.     android:authorities="${applicationId}.fileprovider"
  1930.     android:exported="false"
  1931.     android:grantUriPermissions="true">
  1932.     <meta-data
  1933.         android:name="android.support.FILE_PROVIDER_PATHS"
  1934.         android:resource="@xml/file_paths" />
  1935. </provider><provider
  1936.     android:name="androidx.core.content.FileProvider"
  1937.     android:authorities="${applicationId}.fileprovider"
  1938.     android:exported="false"
  1939.     android:grantUriPermissions="true">
  1940.     <meta-data
  1941.         android:name="android.support.FILE_PROVIDER_PATHS"
  1942.         android:resource="@xml/file_paths" />
  1943. </provider>android.util.Log.e("MainActivity", "UPDATE_CRASH: ❌ 原生Intent安装失败: $e")
  1944. <provider
  1945.     android:name="androidx.core.content.FileProvider"
  1946.     android:authorities="${applicationId}.fileprovider"
  1947.     android:exported="false"
  1948.     android:grantUriPermissions="true">
  1949.     <meta-data
  1950.         android:name="android.support.FILE_PROVIDER_PATHS"
  1951.         android:resource="@xml/file_paths" />
  1952. </provider><provider
  1953.     android:name="androidx.core.content.FileProvider"
  1954.     android:authorities="${applicationId}.fileprovider"
  1955.     android:exported="false"
  1956.     android:grantUriPermissions="true">
  1957.     <meta-data
  1958.         android:name="android.support.FILE_PROVIDER_PATHS"
  1959.         android:resource="@xml/file_paths" />
  1960. </provider><provider
  1961.     android:name="androidx.core.content.FileProvider"
  1962.     android:authorities="${applicationId}.fileprovider"
  1963.     android:exported="false"
  1964.     android:grantUriPermissions="true">
  1965.     <meta-data
  1966.         android:name="android.support.FILE_PROVIDER_PATHS"
  1967.         android:resource="@xml/file_paths" />
  1968. </provider>return false
  1969. <provider
  1970.     android:name="androidx.core.content.FileProvider"
  1971.     android:authorities="${applicationId}.fileprovider"
  1972.     android:exported="false"
  1973.     android:grantUriPermissions="true">
  1974.     <meta-data
  1975.         android:name="android.support.FILE_PROVIDER_PATHS"
  1976.         android:resource="@xml/file_paths" />
  1977. </provider><provider
  1978.     android:name="androidx.core.content.FileProvider"
  1979.     android:authorities="${applicationId}.fileprovider"
  1980.     android:exported="false"
  1981.     android:grantUriPermissions="true">
  1982.     <meta-data
  1983.         android:name="android.support.FILE_PROVIDER_PATHS"
  1984.         android:resource="@xml/file_paths" />
  1985. </provider>}
  1986. <provider
  1987.     android:name="androidx.core.content.FileProvider"
  1988.     android:authorities="${applicationId}.fileprovider"
  1989.     android:exported="false"
  1990.     android:grantUriPermissions="true">
  1991.     <meta-data
  1992.         android:name="android.support.FILE_PROVIDER_PATHS"
  1993.         android:resource="@xml/file_paths" />
  1994. </provider>}
  1995. }
复制代码
FileProvider配置
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  3. <provider
  4.     android:name="androidx.core.content.FileProvider"
  5.     android:authorities="${applicationId}.fileprovider"
  6.     android:exported="false"
  7.     android:grantUriPermissions="true">
  8.     <meta-data
  9.         android:name="android.support.FILE_PROVIDER_PATHS"
  10.         android:resource="@xml/file_paths" />
  11. </provider>
  12. <provider
  13.     android:name="androidx.core.content.FileProvider"
  14.     android:authorities="${applicationId}.fileprovider"
  15.     android:exported="false"
  16.     android:grantUriPermissions="true">
  17.     <meta-data
  18.         android:name="android.support.FILE_PROVIDER_PATHS"
  19.         android:resource="@xml/file_paths" />
  20. </provider><cache-path name="apk_cache" path="apk/" />
  21. <provider
  22.     android:name="androidx.core.content.FileProvider"
  23.     android:authorities="${applicationId}.fileprovider"
  24.     android:exported="false"
  25.     android:grantUriPermissions="true">
  26.     <meta-data
  27.         android:name="android.support.FILE_PROVIDER_PATHS"
  28.         android:resource="@xml/file_paths" />
  29. </provider>
  30. <provider
  31.     android:name="androidx.core.content.FileProvider"
  32.     android:authorities="${applicationId}.fileprovider"
  33.     android:exported="false"
  34.     android:grantUriPermissions="true">
  35.     <meta-data
  36.         android:name="android.support.FILE_PROVIDER_PATHS"
  37.         android:resource="@xml/file_paths" />
  38. </provider><cache-path name="all_cache" path="." />
  39. <provider
  40.     android:name="androidx.core.content.FileProvider"
  41.     android:authorities="${applicationId}.fileprovider"
  42.     android:exported="false"
  43.     android:grantUriPermissions="true">
  44.     <meta-data
  45.         android:name="android.support.FILE_PROVIDER_PATHS"
  46.         android:resource="@xml/file_paths" />
  47. </provider>
  48. <provider
  49.     android:name="androidx.core.content.FileProvider"
  50.     android:authorities="${applicationId}.fileprovider"
  51.     android:exported="false"
  52.     android:grantUriPermissions="true">
  53.     <meta-data
  54.         android:name="android.support.FILE_PROVIDER_PATHS"
  55.         android:resource="@xml/file_paths" />
  56. </provider><external-files-path name="external_app_files" path="." />
  57. </paths>
复制代码
  1. <provider
  2.     android:name="androidx.core.content.FileProvider"
  3.     android:authorities="${applicationId}.fileprovider"
  4.     android:exported="false"
  5.     android:grantUriPermissions="true">
  6.     <meta-data
  7.         android:name="android.support.FILE_PROVIDER_PATHS"
  8.         android:resource="@xml/file_paths" />
  9. </provider>
复制代码
Flutter更新服务集成

安装APK实现
  1. /// 安装APKstatic Future _installApk(String filePath) async {  try {<provider
  2.     android:name="androidx.core.content.FileProvider"
  3.     android:authorities="${applicationId}.fileprovider"
  4.     android:exported="false"
  5.     android:grantUriPermissions="true">
  6.     <meta-data
  7.         android:name="android.support.FILE_PROVIDER_PATHS"
  8.         android:resource="@xml/file_paths" />
  9. </provider>logI('UpdateService', 'UPDATE_CRASH: === 开始APK安装流程 ===');<provider
  10.     android:name="androidx.core.content.FileProvider"
  11.     android:authorities="${applicationId}.fileprovider"
  12.     android:exported="false"
  13.     android:grantUriPermissions="true">
  14.     <meta-data
  15.         android:name="android.support.FILE_PROVIDER_PATHS"
  16.         android:resource="@xml/file_paths" />
  17. </provider>logI('UpdateService', 'UPDATE_CRASH: 文件路径: $filePath');<provider
  18.     android:name="androidx.core.content.FileProvider"
  19.     android:authorities="${applicationId}.fileprovider"
  20.     android:exported="false"
  21.     android:grantUriPermissions="true">
  22.     <meta-data
  23.         android:name="android.support.FILE_PROVIDER_PATHS"
  24.         android:resource="@xml/file_paths" />
  25. </provider>// 检查文件是否存在<provider
  26.     android:name="androidx.core.content.FileProvider"
  27.     android:authorities="${applicationId}.fileprovider"
  28.     android:exported="false"
  29.     android:grantUriPermissions="true">
  30.     <meta-data
  31.         android:name="android.support.FILE_PROVIDER_PATHS"
  32.         android:resource="@xml/file_paths" />
  33. </provider>final file = File(filePath);<provider
  34.     android:name="androidx.core.content.FileProvider"
  35.     android:authorities="${applicationId}.fileprovider"
  36.     android:exported="false"
  37.     android:grantUriPermissions="true">
  38.     <meta-data
  39.         android:name="android.support.FILE_PROVIDER_PATHS"
  40.         android:resource="@xml/file_paths" />
  41. </provider>final fileExists = await file.exists();<provider
  42.     android:name="androidx.core.content.FileProvider"
  43.     android:authorities="${applicationId}.fileprovider"
  44.     android:exported="false"
  45.     android:grantUriPermissions="true">
  46.     <meta-data
  47.         android:name="android.support.FILE_PROVIDER_PATHS"
  48.         android:resource="@xml/file_paths" />
  49. </provider>logI('UpdateService', 'UPDATE_CRASH: APK文件存在: $fileExists');<provider
  50.     android:name="androidx.core.content.FileProvider"
  51.     android:authorities="${applicationId}.fileprovider"
  52.     android:exported="false"
  53.     android:grantUriPermissions="true">
  54.     <meta-data
  55.         android:name="android.support.FILE_PROVIDER_PATHS"
  56.         android:resource="@xml/file_paths" />
  57. </provider>if (!fileExists) {<provider
  58.     android:name="androidx.core.content.FileProvider"
  59.     android:authorities="${applicationId}.fileprovider"
  60.     android:exported="false"
  61.     android:grantUriPermissions="true">
  62.     <meta-data
  63.         android:name="android.support.FILE_PROVIDER_PATHS"
  64.         android:resource="@xml/file_paths" />
  65. </provider>  logE('UpdateService', 'UPDATE_CRASH: APK文件不存在');<provider
  66.     android:name="androidx.core.content.FileProvider"
  67.     android:authorities="${applicationId}.fileprovider"
  68.     android:exported="false"
  69.     android:grantUriPermissions="true">
  70.     <meta-data
  71.         android:name="android.support.FILE_PROVIDER_PATHS"
  72.         android:resource="@xml/file_paths" />
  73. </provider>  return false;<provider
  74.     android:name="androidx.core.content.FileProvider"
  75.     android:authorities="${applicationId}.fileprovider"
  76.     android:exported="false"
  77.     android:grantUriPermissions="true">
  78.     <meta-data
  79.         android:name="android.support.FILE_PROVIDER_PATHS"
  80.         android:resource="@xml/file_paths" />
  81. </provider>}<provider
  82.     android:name="androidx.core.content.FileProvider"
  83.     android:authorities="${applicationId}.fileprovider"
  84.     android:exported="false"
  85.     android:grantUriPermissions="true">
  86.     <meta-data
  87.         android:name="android.support.FILE_PROVIDER_PATHS"
  88.         android:resource="@xml/file_paths" />
  89. </provider>final fileSize = await file.length();<provider
  90.     android:name="androidx.core.content.FileProvider"
  91.     android:authorities="${applicationId}.fileprovider"
  92.     android:exported="false"
  93.     android:grantUriPermissions="true">
  94.     <meta-data
  95.         android:name="android.support.FILE_PROVIDER_PATHS"
  96.         android:resource="@xml/file_paths" />
  97. </provider>logI('UpdateService', 'UPDATE_CRASH: APK文件大小: $fileSize 字节');<provider
  98.     android:name="androidx.core.content.FileProvider"
  99.     android:authorities="${applicationId}.fileprovider"
  100.     android:exported="false"
  101.     android:grantUriPermissions="true">
  102.     <meta-data
  103.         android:name="android.support.FILE_PROVIDER_PATHS"
  104.         android:resource="@xml/file_paths" />
  105. </provider>// 检查权限状态<provider
  106.     android:name="androidx.core.content.FileProvider"
  107.     android:authorities="${applicationId}.fileprovider"
  108.     android:exported="false"
  109.     android:grantUriPermissions="true">
  110.     <meta-data
  111.         android:name="android.support.FILE_PROVIDER_PATHS"
  112.         android:resource="@xml/file_paths" />
  113. </provider>final installPermission = await Permission.requestInstallPackages.status;<provider
  114.     android:name="androidx.core.content.FileProvider"
  115.     android:authorities="${applicationId}.fileprovider"
  116.     android:exported="false"
  117.     android:grantUriPermissions="true">
  118.     <meta-data
  119.         android:name="android.support.FILE_PROVIDER_PATHS"
  120.         android:resource="@xml/file_paths" />
  121. </provider>logI('UpdateService', 'UPDATE_CRASH: 安装权限状态: $installPermission');<provider
  122.     android:name="androidx.core.content.FileProvider"
  123.     android:authorities="${applicationId}.fileprovider"
  124.     android:exported="false"
  125.     android:grantUriPermissions="true">
  126.     <meta-data
  127.         android:name="android.support.FILE_PROVIDER_PATHS"
  128.         android:resource="@xml/file_paths" />
  129. </provider>// 在生产环境中使用更安全的调用方式<provider
  130.     android:name="androidx.core.content.FileProvider"
  131.     android:authorities="${applicationId}.fileprovider"
  132.     android:exported="false"
  133.     android:grantUriPermissions="true">
  134.     <meta-data
  135.         android:name="android.support.FILE_PROVIDER_PATHS"
  136.         android:resource="@xml/file_paths" />
  137. </provider>bool success = false;<provider
  138.     android:name="androidx.core.content.FileProvider"
  139.     android:authorities="${applicationId}.fileprovider"
  140.     android:exported="false"
  141.     android:grantUriPermissions="true">
  142.     <meta-data
  143.         android:name="android.support.FILE_PROVIDER_PATHS"
  144.         android:resource="@xml/file_paths" />
  145. </provider>if (const bool.fromEnvironment('dart.vm.product')) {<provider
  146.     android:name="androidx.core.content.FileProvider"
  147.     android:authorities="${applicationId}.fileprovider"
  148.     android:exported="false"
  149.     android:grantUriPermissions="true">
  150.     <meta-data
  151.         android:name="android.support.FILE_PROVIDER_PATHS"
  152.         android:resource="@xml/file_paths" />
  153. </provider>  logI('UpdateService', 'UPDATE_CRASH: 生产环境,使用原生Intent方式安装');<provider
  154.     android:name="androidx.core.content.FileProvider"
  155.     android:authorities="${applicationId}.fileprovider"
  156.     android:exported="false"
  157.     android:grantUriPermissions="true">
  158.     <meta-data
  159.         android:name="android.support.FILE_PROVIDER_PATHS"
  160.         android:resource="@xml/file_paths" />
  161. </provider>  try {<provider
  162.     android:name="androidx.core.content.FileProvider"
  163.     android:authorities="${applicationId}.fileprovider"
  164.     android:exported="false"
  165.     android:grantUriPermissions="true">
  166.     <meta-data
  167.         android:name="android.support.FILE_PROVIDER_PATHS"
  168.         android:resource="@xml/file_paths" />
  169. </provider><provider
  170.     android:name="androidx.core.content.FileProvider"
  171.     android:authorities="${applicationId}.fileprovider"
  172.     android:exported="false"
  173.     android:grantUriPermissions="true">
  174.     <meta-data
  175.         android:name="android.support.FILE_PROVIDER_PATHS"
  176.         android:resource="@xml/file_paths" />
  177. </provider>success = await _installApkWithIntent(filePath);<provider
  178.     android:name="androidx.core.content.FileProvider"
  179.     android:authorities="${applicationId}.fileprovider"
  180.     android:exported="false"
  181.     android:grantUriPermissions="true">
  182.     <meta-data
  183.         android:name="android.support.FILE_PROVIDER_PATHS"
  184.         android:resource="@xml/file_paths" />
  185. </provider>  } catch (intentException) {<provider
  186.     android:name="androidx.core.content.FileProvider"
  187.     android:authorities="${applicationId}.fileprovider"
  188.     android:exported="false"
  189.     android:grantUriPermissions="true">
  190.     <meta-data
  191.         android:name="android.support.FILE_PROVIDER_PATHS"
  192.         android:resource="@xml/file_paths" />
  193. </provider><provider
  194.     android:name="androidx.core.content.FileProvider"
  195.     android:authorities="${applicationId}.fileprovider"
  196.     android:exported="false"
  197.     android:grantUriPermissions="true">
  198.     <meta-data
  199.         android:name="android.support.FILE_PROVIDER_PATHS"
  200.         android:resource="@xml/file_paths" />
  201. </provider>logE('UpdateService', 'UPDATE_CRASH: Intent安装失败,尝试OpenFilex备用方案', intentException);<provider
  202.     android:name="androidx.core.content.FileProvider"
  203.     android:authorities="${applicationId}.fileprovider"
  204.     android:exported="false"
  205.     android:grantUriPermissions="true">
  206.     <meta-data
  207.         android:name="android.support.FILE_PROVIDER_PATHS"
  208.         android:resource="@xml/file_paths" />
  209. </provider><provider
  210.     android:name="androidx.core.content.FileProvider"
  211.     android:authorities="${applicationId}.fileprovider"
  212.     android:exported="false"
  213.     android:grantUriPermissions="true">
  214.     <meta-data
  215.         android:name="android.support.FILE_PROVIDER_PATHS"
  216.         android:resource="@xml/file_paths" />
  217. </provider>try {<provider
  218.     android:name="androidx.core.content.FileProvider"
  219.     android:authorities="${applicationId}.fileprovider"
  220.     android:exported="false"
  221.     android:grantUriPermissions="true">
  222.     <meta-data
  223.         android:name="android.support.FILE_PROVIDER_PATHS"
  224.         android:resource="@xml/file_paths" />
  225. </provider><provider
  226.     android:name="androidx.core.content.FileProvider"
  227.     android:authorities="${applicationId}.fileprovider"
  228.     android:exported="false"
  229.     android:grantUriPermissions="true">
  230.     <meta-data
  231.         android:name="android.support.FILE_PROVIDER_PATHS"
  232.         android:resource="@xml/file_paths" />
  233. </provider>  final result = await OpenFilex.open(filePath);<provider
  234.     android:name="androidx.core.content.FileProvider"
  235.     android:authorities="${applicationId}.fileprovider"
  236.     android:exported="false"
  237.     android:grantUriPermissions="true">
  238.     <meta-data
  239.         android:name="android.support.FILE_PROVIDER_PATHS"
  240.         android:resource="@xml/file_paths" />
  241. </provider><provider
  242.     android:name="androidx.core.content.FileProvider"
  243.     android:authorities="${applicationId}.fileprovider"
  244.     android:exported="false"
  245.     android:grantUriPermissions="true">
  246.     <meta-data
  247.         android:name="android.support.FILE_PROVIDER_PATHS"
  248.         android:resource="@xml/file_paths" />
  249. </provider>  logI('UpdateService', 'UPDATE_CRASH: === OpenFilex.open备用调用完成 ===');<provider
  250.     android:name="androidx.core.content.FileProvider"
  251.     android:authorities="${applicationId}.fileprovider"
  252.     android:exported="false"
  253.     android:grantUriPermissions="true">
  254.     <meta-data
  255.         android:name="android.support.FILE_PROVIDER_PATHS"
  256.         android:resource="@xml/file_paths" />
  257. </provider><provider
  258.     android:name="androidx.core.content.FileProvider"
  259.     android:authorities="${applicationId}.fileprovider"
  260.     android:exported="false"
  261.     android:grantUriPermissions="true">
  262.     <meta-data
  263.         android:name="android.support.FILE_PROVIDER_PATHS"
  264.         android:resource="@xml/file_paths" />
  265. </provider>  success = result.type == ResultType.done;<provider
  266.     android:name="androidx.core.content.FileProvider"
  267.     android:authorities="${applicationId}.fileprovider"
  268.     android:exported="false"
  269.     android:grantUriPermissions="true">
  270.     <meta-data
  271.         android:name="android.support.FILE_PROVIDER_PATHS"
  272.         android:resource="@xml/file_paths" />
  273. </provider><provider
  274.     android:name="androidx.core.content.FileProvider"
  275.     android:authorities="${applicationId}.fileprovider"
  276.     android:exported="false"
  277.     android:grantUriPermissions="true">
  278.     <meta-data
  279.         android:name="android.support.FILE_PROVIDER_PATHS"
  280.         android:resource="@xml/file_paths" />
  281. </provider>} catch (openFileException) {<provider
  282.     android:name="androidx.core.content.FileProvider"
  283.     android:authorities="${applicationId}.fileprovider"
  284.     android:exported="false"
  285.     android:grantUriPermissions="true">
  286.     <meta-data
  287.         android:name="android.support.FILE_PROVIDER_PATHS"
  288.         android:resource="@xml/file_paths" />
  289. </provider><provider
  290.     android:name="androidx.core.content.FileProvider"
  291.     android:authorities="${applicationId}.fileprovider"
  292.     android:exported="false"
  293.     android:grantUriPermissions="true">
  294.     <meta-data
  295.         android:name="android.support.FILE_PROVIDER_PATHS"
  296.         android:resource="@xml/file_paths" />
  297. </provider>  logE('UpdateService', 'UPDATE_CRASH: OpenFilex备用方案也失败', openFileException);<provider
  298.     android:name="androidx.core.content.FileProvider"
  299.     android:authorities="${applicationId}.fileprovider"
  300.     android:exported="false"
  301.     android:grantUriPermissions="true">
  302.     <meta-data
  303.         android:name="android.support.FILE_PROVIDER_PATHS"
  304.         android:resource="@xml/file_paths" />
  305. </provider><provider
  306.     android:name="androidx.core.content.FileProvider"
  307.     android:authorities="${applicationId}.fileprovider"
  308.     android:exported="false"
  309.     android:grantUriPermissions="true">
  310.     <meta-data
  311.         android:name="android.support.FILE_PROVIDER_PATHS"
  312.         android:resource="@xml/file_paths" />
  313. </provider>  success = false;<provider
  314.     android:name="androidx.core.content.FileProvider"
  315.     android:authorities="${applicationId}.fileprovider"
  316.     android:exported="false"
  317.     android:grantUriPermissions="true">
  318.     <meta-data
  319.         android:name="android.support.FILE_PROVIDER_PATHS"
  320.         android:resource="@xml/file_paths" />
  321. </provider><provider
  322.     android:name="androidx.core.content.FileProvider"
  323.     android:authorities="${applicationId}.fileprovider"
  324.     android:exported="false"
  325.     android:grantUriPermissions="true">
  326.     <meta-data
  327.         android:name="android.support.FILE_PROVIDER_PATHS"
  328.         android:resource="@xml/file_paths" />
  329. </provider>}<provider
  330.     android:name="androidx.core.content.FileProvider"
  331.     android:authorities="${applicationId}.fileprovider"
  332.     android:exported="false"
  333.     android:grantUriPermissions="true">
  334.     <meta-data
  335.         android:name="android.support.FILE_PROVIDER_PATHS"
  336.         android:resource="@xml/file_paths" />
  337. </provider>  }<provider
  338.     android:name="androidx.core.content.FileProvider"
  339.     android:authorities="${applicationId}.fileprovider"
  340.     android:exported="false"
  341.     android:grantUriPermissions="true">
  342.     <meta-data
  343.         android:name="android.support.FILE_PROVIDER_PATHS"
  344.         android:resource="@xml/file_paths" />
  345. </provider>} else {<provider
  346.     android:name="androidx.core.content.FileProvider"
  347.     android:authorities="${applicationId}.fileprovider"
  348.     android:exported="false"
  349.     android:grantUriPermissions="true">
  350.     <meta-data
  351.         android:name="android.support.FILE_PROVIDER_PATHS"
  352.         android:resource="@xml/file_paths" />
  353. </provider>  // 开发环境使用原来的方式<provider
  354.     android:name="androidx.core.content.FileProvider"
  355.     android:authorities="${applicationId}.fileprovider"
  356.     android:exported="false"
  357.     android:grantUriPermissions="true">
  358.     <meta-data
  359.         android:name="android.support.FILE_PROVIDER_PATHS"
  360.         android:resource="@xml/file_paths" />
  361. </provider>  final result = await OpenFilex.open(filePath);<provider
  362.     android:name="androidx.core.content.FileProvider"
  363.     android:authorities="${applicationId}.fileprovider"
  364.     android:exported="false"
  365.     android:grantUriPermissions="true">
  366.     <meta-data
  367.         android:name="android.support.FILE_PROVIDER_PATHS"
  368.         android:resource="@xml/file_paths" />
  369. </provider>  logI('UpdateService', 'UPDATE_CRASH: === OpenFilex.open调用完成 ===');<provider
  370.     android:name="androidx.core.content.FileProvider"
  371.     android:authorities="${applicationId}.fileprovider"
  372.     android:exported="false"
  373.     android:grantUriPermissions="true">
  374.     <meta-data
  375.         android:name="android.support.FILE_PROVIDER_PATHS"
  376.         android:resource="@xml/file_paths" />
  377. </provider>  logI('UpdateService', 'UPDATE_CRASH: 返回类型: ${result.type}');<provider
  378.     android:name="androidx.core.content.FileProvider"
  379.     android:authorities="${applicationId}.fileprovider"
  380.     android:exported="false"
  381.     android:grantUriPermissions="true">
  382.     <meta-data
  383.         android:name="android.support.FILE_PROVIDER_PATHS"
  384.         android:resource="@xml/file_paths" />
  385. </provider>  logI('UpdateService', 'UPDATE_CRASH: 返回消息: ${result.message}');<provider
  386.     android:name="androidx.core.content.FileProvider"
  387.     android:authorities="${applicationId}.fileprovider"
  388.     android:exported="false"
  389.     android:grantUriPermissions="true">
  390.     <meta-data
  391.         android:name="android.support.FILE_PROVIDER_PATHS"
  392.         android:resource="@xml/file_paths" />
  393. </provider>  success = result.type == ResultType.done;<provider
  394.     android:name="androidx.core.content.FileProvider"
  395.     android:authorities="${applicationId}.fileprovider"
  396.     android:exported="false"
  397.     android:grantUriPermissions="true">
  398.     <meta-data
  399.         android:name="android.support.FILE_PROVIDER_PATHS"
  400.         android:resource="@xml/file_paths" />
  401. </provider>}<provider
  402.     android:name="androidx.core.content.FileProvider"
  403.     android:authorities="${applicationId}.fileprovider"
  404.     android:exported="false"
  405.     android:grantUriPermissions="true">
  406.     <meta-data
  407.         android:name="android.support.FILE_PROVIDER_PATHS"
  408.         android:resource="@xml/file_paths" />
  409. </provider>logI('UpdateService', 'UPDATE_CRASH: 安装结果判定: $success');<provider
  410.     android:name="androidx.core.content.FileProvider"
  411.     android:authorities="${applicationId}.fileprovider"
  412.     android:exported="false"
  413.     android:grantUriPermissions="true">
  414.     <meta-data
  415.         android:name="android.support.FILE_PROVIDER_PATHS"
  416.         android:resource="@xml/file_paths" />
  417. </provider>if (success) {<provider
  418.     android:name="androidx.core.content.FileProvider"
  419.     android:authorities="${applicationId}.fileprovider"
  420.     android:exported="false"
  421.     android:grantUriPermissions="true">
  422.     <meta-data
  423.         android:name="android.support.FILE_PROVIDER_PATHS"
  424.         android:resource="@xml/file_paths" />
  425. </provider>  logI('UpdateService', 'UPDATE_CRASH: ✅ APK安装程序启动成功');<provider
  426.     android:name="androidx.core.content.FileProvider"
  427.     android:authorities="${applicationId}.fileprovider"
  428.     android:exported="false"
  429.     android:grantUriPermissions="true">
  430.     <meta-data
  431.         android:name="android.support.FILE_PROVIDER_PATHS"
  432.         android:resource="@xml/file_paths" />
  433. </provider>} else {<provider
  434.     android:name="androidx.core.content.FileProvider"
  435.     android:authorities="${applicationId}.fileprovider"
  436.     android:exported="false"
  437.     android:grantUriPermissions="true">
  438.     <meta-data
  439.         android:name="android.support.FILE_PROVIDER_PATHS"
  440.         android:resource="@xml/file_paths" />
  441. </provider>  logW('UpdateService', 'UPDATE_CRASH: ⚠️ APK安装程序启动失败');<provider
  442.     android:name="androidx.core.content.FileProvider"
  443.     android:authorities="${applicationId}.fileprovider"
  444.     android:exported="false"
  445.     android:grantUriPermissions="true">
  446.     <meta-data
  447.         android:name="android.support.FILE_PROVIDER_PATHS"
  448.         android:resource="@xml/file_paths" />
  449. </provider>}<provider
  450.     android:name="androidx.core.content.FileProvider"
  451.     android:authorities="${applicationId}.fileprovider"
  452.     android:exported="false"
  453.     android:grantUriPermissions="true">
  454.     <meta-data
  455.         android:name="android.support.FILE_PROVIDER_PATHS"
  456.         android:resource="@xml/file_paths" />
  457. </provider>return success;  } catch (e, stackTrace) {<provider
  458.     android:name="androidx.core.content.FileProvider"
  459.     android:authorities="${applicationId}.fileprovider"
  460.     android:exported="false"
  461.     android:grantUriPermissions="true">
  462.     <meta-data
  463.         android:name="android.support.FILE_PROVIDER_PATHS"
  464.         android:resource="@xml/file_paths" />
  465. </provider>logE('UpdateService', 'UPDATE_CRASH: ❌ 安装APK过程中发生异常', e);<provider
  466.     android:name="androidx.core.content.FileProvider"
  467.     android:authorities="${applicationId}.fileprovider"
  468.     android:exported="false"
  469.     android:grantUriPermissions="true">
  470.     <meta-data
  471.         android:name="android.support.FILE_PROVIDER_PATHS"
  472.         android:resource="@xml/file_paths" />
  473. </provider>logE('UpdateService', 'UPDATE_CRASH: 异常堆栈: $stackTrace');<provider
  474.     android:name="androidx.core.content.FileProvider"
  475.     android:authorities="${applicationId}.fileprovider"
  476.     android:exported="false"
  477.     android:grantUriPermissions="true">
  478.     <meta-data
  479.         android:name="android.support.FILE_PROVIDER_PATHS"
  480.         android:resource="@xml/file_paths" />
  481. </provider>return false;  }}/// 使用原生Android Intent安装APK(生产环境专用)static Future _installApkWithIntent(String filePath) async {  try {<provider
  482.     android:name="androidx.core.content.FileProvider"
  483.     android:authorities="${applicationId}.fileprovider"
  484.     android:exported="false"
  485.     android:grantUriPermissions="true">
  486.     <meta-data
  487.         android:name="android.support.FILE_PROVIDER_PATHS"
  488.         android:resource="@xml/file_paths" />
  489. </provider>logI('UpdateService', 'UPDATE_CRASH: 开始使用Intent安装APK');<provider
  490.     android:name="androidx.core.content.FileProvider"
  491.     android:authorities="${applicationId}.fileprovider"
  492.     android:exported="false"
  493.     android:grantUriPermissions="true">
  494.     <meta-data
  495.         android:name="android.support.FILE_PROVIDER_PATHS"
  496.         android:resource="@xml/file_paths" />
  497. </provider>if (!Platform.isAndroid) {<provider
  498.     android:name="androidx.core.content.FileProvider"
  499.     android:authorities="${applicationId}.fileprovider"
  500.     android:exported="false"
  501.     android:grantUriPermissions="true">
  502.     <meta-data
  503.         android:name="android.support.FILE_PROVIDER_PATHS"
  504.         android:resource="@xml/file_paths" />
  505. </provider>  logE('UpdateService', 'UPDATE_CRASH: 非Android平台,无法使用Intent安装');<provider
  506.     android:name="androidx.core.content.FileProvider"
  507.     android:authorities="${applicationId}.fileprovider"
  508.     android:exported="false"
  509.     android:grantUriPermissions="true">
  510.     <meta-data
  511.         android:name="android.support.FILE_PROVIDER_PATHS"
  512.         android:resource="@xml/file_paths" />
  513. </provider>  return false;<provider
  514.     android:name="androidx.core.content.FileProvider"
  515.     android:authorities="${applicationId}.fileprovider"
  516.     android:exported="false"
  517.     android:grantUriPermissions="true">
  518.     <meta-data
  519.         android:name="android.support.FILE_PROVIDER_PATHS"
  520.         android:resource="@xml/file_paths" />
  521. </provider>}<provider
  522.     android:name="androidx.core.content.FileProvider"
  523.     android:authorities="${applicationId}.fileprovider"
  524.     android:exported="false"
  525.     android:grantUriPermissions="true">
  526.     <meta-data
  527.         android:name="android.support.FILE_PROVIDER_PATHS"
  528.         android:resource="@xml/file_paths" />
  529. </provider>// 使用MethodChannel调用原生Android代码<provider
  530.     android:name="androidx.core.content.FileProvider"
  531.     android:authorities="${applicationId}.fileprovider"
  532.     android:exported="false"
  533.     android:grantUriPermissions="true">
  534.     <meta-data
  535.         android:name="android.support.FILE_PROVIDER_PATHS"
  536.         android:resource="@xml/file_paths" />
  537. </provider>const platform = MethodChannel('com.example.beecount/install');<provider
  538.     android:name="androidx.core.content.FileProvider"
  539.     android:authorities="${applicationId}.fileprovider"
  540.     android:exported="false"
  541.     android:grantUriPermissions="true">
  542.     <meta-data
  543.         android:name="android.support.FILE_PROVIDER_PATHS"
  544.         android:resource="@xml/file_paths" />
  545. </provider>logI('UpdateService', 'UPDATE_CRASH: 调用原生安装方法,文件路径: $filePath');<provider
  546.     android:name="androidx.core.content.FileProvider"
  547.     android:authorities="${applicationId}.fileprovider"
  548.     android:exported="false"
  549.     android:grantUriPermissions="true">
  550.     <meta-data
  551.         android:name="android.support.FILE_PROVIDER_PATHS"
  552.         android:resource="@xml/file_paths" />
  553. </provider>final result = await platform.invokeMethod('installApk', {<provider
  554.     android:name="androidx.core.content.FileProvider"
  555.     android:authorities="${applicationId}.fileprovider"
  556.     android:exported="false"
  557.     android:grantUriPermissions="true">
  558.     <meta-data
  559.         android:name="android.support.FILE_PROVIDER_PATHS"
  560.         android:resource="@xml/file_paths" />
  561. </provider>  'filePath': filePath,<provider
  562.     android:name="androidx.core.content.FileProvider"
  563.     android:authorities="${applicationId}.fileprovider"
  564.     android:exported="false"
  565.     android:grantUriPermissions="true">
  566.     <meta-data
  567.         android:name="android.support.FILE_PROVIDER_PATHS"
  568.         android:resource="@xml/file_paths" />
  569. </provider>});<provider
  570.     android:name="androidx.core.content.FileProvider"
  571.     android:authorities="${applicationId}.fileprovider"
  572.     android:exported="false"
  573.     android:grantUriPermissions="true">
  574.     <meta-data
  575.         android:name="android.support.FILE_PROVIDER_PATHS"
  576.         android:resource="@xml/file_paths" />
  577. </provider>logI('UpdateService', 'UPDATE_CRASH: 原生安装方法调用完成,结果: $result');<provider
  578.     android:name="androidx.core.content.FileProvider"
  579.     android:authorities="${applicationId}.fileprovider"
  580.     android:exported="false"
  581.     android:grantUriPermissions="true">
  582.     <meta-data
  583.         android:name="android.support.FILE_PROVIDER_PATHS"
  584.         android:resource="@xml/file_paths" />
  585. </provider>return result == true;  } catch (e, stackTrace) {<provider
  586.     android:name="androidx.core.content.FileProvider"
  587.     android:authorities="${applicationId}.fileprovider"
  588.     android:exported="false"
  589.     android:grantUriPermissions="true">
  590.     <meta-data
  591.         android:name="android.support.FILE_PROVIDER_PATHS"
  592.         android:resource="@xml/file_paths" />
  593. </provider>logE('UpdateService', 'UPDATE_CRASH: Intent安装异常', e);<provider
  594.     android:name="androidx.core.content.FileProvider"
  595.     android:authorities="${applicationId}.fileprovider"
  596.     android:exported="false"
  597.     android:grantUriPermissions="true">
  598.     <meta-data
  599.         android:name="android.support.FILE_PROVIDER_PATHS"
  600.         android:resource="@xml/file_paths" />
  601. </provider>logE('UpdateService', 'UPDATE_CRASH: Intent安装异常堆栈', stackTrace);<provider
  602.     android:name="androidx.core.content.FileProvider"
  603.     android:authorities="${applicationId}.fileprovider"
  604.     android:exported="false"
  605.     android:grantUriPermissions="true">
  606.     <meta-data
  607.         android:name="android.support.FILE_PROVIDER_PATHS"
  608.         android:resource="@xml/file_paths" />
  609. </provider>return false;  }}
复制代码
缓存APK处理修复

在实际使用中发现的另一个问题:当用户选择安装缓存的APK时,系统返回了错误的成功状态。
问题原因:UpdateResult构造函数中success参数的默认值是false,但安装缓存APK时没有显式设置为true。
  1. // 问题代码
  2. return UpdateResult(
  3.   hasUpdate: true,
  4.   message: '正在安装缓存的APK',  // 缺少 success: true
  5.   filePath: cachedApkPath,
  6. );
  7. // 修复后代码
  8. return UpdateResult(
  9.   hasUpdate: true,
  10.   success: true,  // 明确设置成功状态
  11.   message: '正在安装缓存的APK',
  12.   filePath: cachedApkPath,
  13. );
复制代码
用户界面设计

更新对话框
  1. /// 显示更新对话框static Future showUpdateDialog(  BuildContext context, {  required bool isForced,  VoidCallback? onLaterPressed,  Function(double progress, String status)? onProgress,}) async {  final result = await checkUpdate();  if (!result.hasUpdate) {<provider
  2.     android:name="androidx.core.content.FileProvider"
  3.     android:authorities="${applicationId}.fileprovider"
  4.     android:exported="false"
  5.     android:grantUriPermissions="true">
  6.     <meta-data
  7.         android:name="android.support.FILE_PROVIDER_PATHS"
  8.         android:resource="@xml/file_paths" />
  9. </provider>if (context.mounted) {<provider
  10.     android:name="androidx.core.content.FileProvider"
  11.     android:authorities="${applicationId}.fileprovider"
  12.     android:exported="false"
  13.     android:grantUriPermissions="true">
  14.     <meta-data
  15.         android:name="android.support.FILE_PROVIDER_PATHS"
  16.         android:resource="@xml/file_paths" />
  17. </provider>  ScaffoldMessenger.of(context).showSnackBar(<provider
  18.     android:name="androidx.core.content.FileProvider"
  19.     android:authorities="${applicationId}.fileprovider"
  20.     android:exported="false"
  21.     android:grantUriPermissions="true">
  22.     <meta-data
  23.         android:name="android.support.FILE_PROVIDER_PATHS"
  24.         android:resource="@xml/file_paths" />
  25. </provider><provider
  26.     android:name="androidx.core.content.FileProvider"
  27.     android:authorities="${applicationId}.fileprovider"
  28.     android:exported="false"
  29.     android:grantUriPermissions="true">
  30.     <meta-data
  31.         android:name="android.support.FILE_PROVIDER_PATHS"
  32.         android:resource="@xml/file_paths" />
  33. </provider>SnackBar(content: Text(result.message ?? '已是最新版本')),<provider
  34.     android:name="androidx.core.content.FileProvider"
  35.     android:authorities="${applicationId}.fileprovider"
  36.     android:exported="false"
  37.     android:grantUriPermissions="true">
  38.     <meta-data
  39.         android:name="android.support.FILE_PROVIDER_PATHS"
  40.         android:resource="@xml/file_paths" />
  41. </provider>  );<provider
  42.     android:name="androidx.core.content.FileProvider"
  43.     android:authorities="${applicationId}.fileprovider"
  44.     android:exported="false"
  45.     android:grantUriPermissions="true">
  46.     <meta-data
  47.         android:name="android.support.FILE_PROVIDER_PATHS"
  48.         android:resource="@xml/file_paths" />
  49. </provider>}<provider
  50.     android:name="androidx.core.content.FileProvider"
  51.     android:authorities="${applicationId}.fileprovider"
  52.     android:exported="false"
  53.     android:grantUriPermissions="true">
  54.     <meta-data
  55.         android:name="android.support.FILE_PROVIDER_PATHS"
  56.         android:resource="@xml/file_paths" />
  57. </provider>return;  }  if (!context.mounted) return;  // 显示更新确认对话框  final shouldUpdate = await showDialog(<provider
  58.     android:name="androidx.core.content.FileProvider"
  59.     android:authorities="${applicationId}.fileprovider"
  60.     android:exported="false"
  61.     android:grantUriPermissions="true">
  62.     <meta-data
  63.         android:name="android.support.FILE_PROVIDER_PATHS"
  64.         android:resource="@xml/file_paths" />
  65. </provider>context: context,<provider
  66.     android:name="androidx.core.content.FileProvider"
  67.     android:authorities="${applicationId}.fileprovider"
  68.     android:exported="false"
  69.     android:grantUriPermissions="true">
  70.     <meta-data
  71.         android:name="android.support.FILE_PROVIDER_PATHS"
  72.         android:resource="@xml/file_paths" />
  73. </provider>barrierDismissible: !isForced,<provider
  74.     android:name="androidx.core.content.FileProvider"
  75.     android:authorities="${applicationId}.fileprovider"
  76.     android:exported="false"
  77.     android:grantUriPermissions="true">
  78.     <meta-data
  79.         android:name="android.support.FILE_PROVIDER_PATHS"
  80.         android:resource="@xml/file_paths" />
  81. </provider>builder: (context) => AlertDialog(<provider
  82.     android:name="androidx.core.content.FileProvider"
  83.     android:authorities="${applicationId}.fileprovider"
  84.     android:exported="false"
  85.     android:grantUriPermissions="true">
  86.     <meta-data
  87.         android:name="android.support.FILE_PROVIDER_PATHS"
  88.         android:resource="@xml/file_paths" />
  89. </provider>  title: Row(<provider
  90.     android:name="androidx.core.content.FileProvider"
  91.     android:authorities="${applicationId}.fileprovider"
  92.     android:exported="false"
  93.     android:grantUriPermissions="true">
  94.     <meta-data
  95.         android:name="android.support.FILE_PROVIDER_PATHS"
  96.         android:resource="@xml/file_paths" />
  97. </provider><provider
  98.     android:name="androidx.core.content.FileProvider"
  99.     android:authorities="${applicationId}.fileprovider"
  100.     android:exported="false"
  101.     android:grantUriPermissions="true">
  102.     <meta-data
  103.         android:name="android.support.FILE_PROVIDER_PATHS"
  104.         android:resource="@xml/file_paths" />
  105. </provider>children: [<provider
  106.     android:name="androidx.core.content.FileProvider"
  107.     android:authorities="${applicationId}.fileprovider"
  108.     android:exported="false"
  109.     android:grantUriPermissions="true">
  110.     <meta-data
  111.         android:name="android.support.FILE_PROVIDER_PATHS"
  112.         android:resource="@xml/file_paths" />
  113. </provider><provider
  114.     android:name="androidx.core.content.FileProvider"
  115.     android:authorities="${applicationId}.fileprovider"
  116.     android:exported="false"
  117.     android:grantUriPermissions="true">
  118.     <meta-data
  119.         android:name="android.support.FILE_PROVIDER_PATHS"
  120.         android:resource="@xml/file_paths" />
  121. </provider>  Icon(Icons.system_update, color: Theme.of(context).primaryColor),<provider
  122.     android:name="androidx.core.content.FileProvider"
  123.     android:authorities="${applicationId}.fileprovider"
  124.     android:exported="false"
  125.     android:grantUriPermissions="true">
  126.     <meta-data
  127.         android:name="android.support.FILE_PROVIDER_PATHS"
  128.         android:resource="@xml/file_paths" />
  129. </provider><provider
  130.     android:name="androidx.core.content.FileProvider"
  131.     android:authorities="${applicationId}.fileprovider"
  132.     android:exported="false"
  133.     android:grantUriPermissions="true">
  134.     <meta-data
  135.         android:name="android.support.FILE_PROVIDER_PATHS"
  136.         android:resource="@xml/file_paths" />
  137. </provider>  const SizedBox(width: 12),<provider
  138.     android:name="androidx.core.content.FileProvider"
  139.     android:authorities="${applicationId}.fileprovider"
  140.     android:exported="false"
  141.     android:grantUriPermissions="true">
  142.     <meta-data
  143.         android:name="android.support.FILE_PROVIDER_PATHS"
  144.         android:resource="@xml/file_paths" />
  145. </provider><provider
  146.     android:name="androidx.core.content.FileProvider"
  147.     android:authorities="${applicationId}.fileprovider"
  148.     android:exported="false"
  149.     android:grantUriPermissions="true">
  150.     <meta-data
  151.         android:name="android.support.FILE_PROVIDER_PATHS"
  152.         android:resource="@xml/file_paths" />
  153. </provider>  Text('发现新版本:${result.version}'),<provider
  154.     android:name="androidx.core.content.FileProvider"
  155.     android:authorities="${applicationId}.fileprovider"
  156.     android:exported="false"
  157.     android:grantUriPermissions="true">
  158.     <meta-data
  159.         android:name="android.support.FILE_PROVIDER_PATHS"
  160.         android:resource="@xml/file_paths" />
  161. </provider><provider
  162.     android:name="androidx.core.content.FileProvider"
  163.     android:authorities="${applicationId}.fileprovider"
  164.     android:exported="false"
  165.     android:grantUriPermissions="true">
  166.     <meta-data
  167.         android:name="android.support.FILE_PROVIDER_PATHS"
  168.         android:resource="@xml/file_paths" />
  169. </provider>],<provider
  170.     android:name="androidx.core.content.FileProvider"
  171.     android:authorities="${applicationId}.fileprovider"
  172.     android:exported="false"
  173.     android:grantUriPermissions="true">
  174.     <meta-data
  175.         android:name="android.support.FILE_PROVIDER_PATHS"
  176.         android:resource="@xml/file_paths" />
  177. </provider>  ),<provider
  178.     android:name="androidx.core.content.FileProvider"
  179.     android:authorities="${applicationId}.fileprovider"
  180.     android:exported="false"
  181.     android:grantUriPermissions="true">
  182.     <meta-data
  183.         android:name="android.support.FILE_PROVIDER_PATHS"
  184.         android:resource="@xml/file_paths" />
  185. </provider>  content: SingleChildScrollView(<provider
  186.     android:name="androidx.core.content.FileProvider"
  187.     android:authorities="${applicationId}.fileprovider"
  188.     android:exported="false"
  189.     android:grantUriPermissions="true">
  190.     <meta-data
  191.         android:name="android.support.FILE_PROVIDER_PATHS"
  192.         android:resource="@xml/file_paths" />
  193. </provider><provider
  194.     android:name="androidx.core.content.FileProvider"
  195.     android:authorities="${applicationId}.fileprovider"
  196.     android:exported="false"
  197.     android:grantUriPermissions="true">
  198.     <meta-data
  199.         android:name="android.support.FILE_PROVIDER_PATHS"
  200.         android:resource="@xml/file_paths" />
  201. </provider>child: Column(<provider
  202.     android:name="androidx.core.content.FileProvider"
  203.     android:authorities="${applicationId}.fileprovider"
  204.     android:exported="false"
  205.     android:grantUriPermissions="true">
  206.     <meta-data
  207.         android:name="android.support.FILE_PROVIDER_PATHS"
  208.         android:resource="@xml/file_paths" />
  209. </provider><provider
  210.     android:name="androidx.core.content.FileProvider"
  211.     android:authorities="${applicationId}.fileprovider"
  212.     android:exported="false"
  213.     android:grantUriPermissions="true">
  214.     <meta-data
  215.         android:name="android.support.FILE_PROVIDER_PATHS"
  216.         android:resource="@xml/file_paths" />
  217. </provider>  mainAxisSize: MainAxisSize.min,<provider
  218.     android:name="androidx.core.content.FileProvider"
  219.     android:authorities="${applicationId}.fileprovider"
  220.     android:exported="false"
  221.     android:grantUriPermissions="true">
  222.     <meta-data
  223.         android:name="android.support.FILE_PROVIDER_PATHS"
  224.         android:resource="@xml/file_paths" />
  225. </provider><provider
  226.     android:name="androidx.core.content.FileProvider"
  227.     android:authorities="${applicationId}.fileprovider"
  228.     android:exported="false"
  229.     android:grantUriPermissions="true">
  230.     <meta-data
  231.         android:name="android.support.FILE_PROVIDER_PATHS"
  232.         android:resource="@xml/file_paths" />
  233. </provider>  crossAxisAlignment: CrossAxisAlignment.start,<provider
  234.     android:name="androidx.core.content.FileProvider"
  235.     android:authorities="${applicationId}.fileprovider"
  236.     android:exported="false"
  237.     android:grantUriPermissions="true">
  238.     <meta-data
  239.         android:name="android.support.FILE_PROVIDER_PATHS"
  240.         android:resource="@xml/file_paths" />
  241. </provider><provider
  242.     android:name="androidx.core.content.FileProvider"
  243.     android:authorities="${applicationId}.fileprovider"
  244.     android:exported="false"
  245.     android:grantUriPermissions="true">
  246.     <meta-data
  247.         android:name="android.support.FILE_PROVIDER_PATHS"
  248.         android:resource="@xml/file_paths" />
  249. </provider>  children: [<provider
  250.     android:name="androidx.core.content.FileProvider"
  251.     android:authorities="${applicationId}.fileprovider"
  252.     android:exported="false"
  253.     android:grantUriPermissions="true">
  254.     <meta-data
  255.         android:name="android.support.FILE_PROVIDER_PATHS"
  256.         android:resource="@xml/file_paths" />
  257. </provider><provider
  258.     android:name="androidx.core.content.FileProvider"
  259.     android:authorities="${applicationId}.fileprovider"
  260.     android:exported="false"
  261.     android:grantUriPermissions="true">
  262.     <meta-data
  263.         android:name="android.support.FILE_PROVIDER_PATHS"
  264.         android:resource="@xml/file_paths" />
  265. </provider><provider
  266.     android:name="androidx.core.content.FileProvider"
  267.     android:authorities="${applicationId}.fileprovider"
  268.     android:exported="false"
  269.     android:grantUriPermissions="true">
  270.     <meta-data
  271.         android:name="android.support.FILE_PROVIDER_PATHS"
  272.         android:resource="@xml/file_paths" />
  273. </provider>if (result.releaseNotes?.isNotEmpty == true) ...[<provider
  274.     android:name="androidx.core.content.FileProvider"
  275.     android:authorities="${applicationId}.fileprovider"
  276.     android:exported="false"
  277.     android:grantUriPermissions="true">
  278.     <meta-data
  279.         android:name="android.support.FILE_PROVIDER_PATHS"
  280.         android:resource="@xml/file_paths" />
  281. </provider><provider
  282.     android:name="androidx.core.content.FileProvider"
  283.     android:authorities="${applicationId}.fileprovider"
  284.     android:exported="false"
  285.     android:grantUriPermissions="true">
  286.     <meta-data
  287.         android:name="android.support.FILE_PROVIDER_PATHS"
  288.         android:resource="@xml/file_paths" />
  289. </provider><provider
  290.     android:name="androidx.core.content.FileProvider"
  291.     android:authorities="${applicationId}.fileprovider"
  292.     android:exported="false"
  293.     android:grantUriPermissions="true">
  294.     <meta-data
  295.         android:name="android.support.FILE_PROVIDER_PATHS"
  296.         android:resource="@xml/file_paths" />
  297. </provider>  const Text('更新内容:', style: TextStyle(fontWeight: FontWeight.bold)),<provider
  298.     android:name="androidx.core.content.FileProvider"
  299.     android:authorities="${applicationId}.fileprovider"
  300.     android:exported="false"
  301.     android:grantUriPermissions="true">
  302.     <meta-data
  303.         android:name="android.support.FILE_PROVIDER_PATHS"
  304.         android:resource="@xml/file_paths" />
  305. </provider><provider
  306.     android:name="androidx.core.content.FileProvider"
  307.     android:authorities="${applicationId}.fileprovider"
  308.     android:exported="false"
  309.     android:grantUriPermissions="true">
  310.     <meta-data
  311.         android:name="android.support.FILE_PROVIDER_PATHS"
  312.         android:resource="@xml/file_paths" />
  313. </provider><provider
  314.     android:name="androidx.core.content.FileProvider"
  315.     android:authorities="${applicationId}.fileprovider"
  316.     android:exported="false"
  317.     android:grantUriPermissions="true">
  318.     <meta-data
  319.         android:name="android.support.FILE_PROVIDER_PATHS"
  320.         android:resource="@xml/file_paths" />
  321. </provider>  const SizedBox(height: 8),<provider
  322.     android:name="androidx.core.content.FileProvider"
  323.     android:authorities="${applicationId}.fileprovider"
  324.     android:exported="false"
  325.     android:grantUriPermissions="true">
  326.     <meta-data
  327.         android:name="android.support.FILE_PROVIDER_PATHS"
  328.         android:resource="@xml/file_paths" />
  329. </provider><provider
  330.     android:name="androidx.core.content.FileProvider"
  331.     android:authorities="${applicationId}.fileprovider"
  332.     android:exported="false"
  333.     android:grantUriPermissions="true">
  334.     <meta-data
  335.         android:name="android.support.FILE_PROVIDER_PATHS"
  336.         android:resource="@xml/file_paths" />
  337. </provider><provider
  338.     android:name="androidx.core.content.FileProvider"
  339.     android:authorities="${applicationId}.fileprovider"
  340.     android:exported="false"
  341.     android:grantUriPermissions="true">
  342.     <meta-data
  343.         android:name="android.support.FILE_PROVIDER_PATHS"
  344.         android:resource="@xml/file_paths" />
  345. </provider>  Container(<provider
  346.     android:name="androidx.core.content.FileProvider"
  347.     android:authorities="${applicationId}.fileprovider"
  348.     android:exported="false"
  349.     android:grantUriPermissions="true">
  350.     <meta-data
  351.         android:name="android.support.FILE_PROVIDER_PATHS"
  352.         android:resource="@xml/file_paths" />
  353. </provider><provider
  354.     android:name="androidx.core.content.FileProvider"
  355.     android:authorities="${applicationId}.fileprovider"
  356.     android:exported="false"
  357.     android:grantUriPermissions="true">
  358.     <meta-data
  359.         android:name="android.support.FILE_PROVIDER_PATHS"
  360.         android:resource="@xml/file_paths" />
  361. </provider><provider
  362.     android:name="androidx.core.content.FileProvider"
  363.     android:authorities="${applicationId}.fileprovider"
  364.     android:exported="false"
  365.     android:grantUriPermissions="true">
  366.     <meta-data
  367.         android:name="android.support.FILE_PROVIDER_PATHS"
  368.         android:resource="@xml/file_paths" />
  369. </provider><provider
  370.     android:name="androidx.core.content.FileProvider"
  371.     android:authorities="${applicationId}.fileprovider"
  372.     android:exported="false"
  373.     android:grantUriPermissions="true">
  374.     <meta-data
  375.         android:name="android.support.FILE_PROVIDER_PATHS"
  376.         android:resource="@xml/file_paths" />
  377. </provider>padding: const EdgeInsets.all(12),<provider
  378.     android:name="androidx.core.content.FileProvider"
  379.     android:authorities="${applicationId}.fileprovider"
  380.     android:exported="false"
  381.     android:grantUriPermissions="true">
  382.     <meta-data
  383.         android:name="android.support.FILE_PROVIDER_PATHS"
  384.         android:resource="@xml/file_paths" />
  385. </provider><provider
  386.     android:name="androidx.core.content.FileProvider"
  387.     android:authorities="${applicationId}.fileprovider"
  388.     android:exported="false"
  389.     android:grantUriPermissions="true">
  390.     <meta-data
  391.         android:name="android.support.FILE_PROVIDER_PATHS"
  392.         android:resource="@xml/file_paths" />
  393. </provider><provider
  394.     android:name="androidx.core.content.FileProvider"
  395.     android:authorities="${applicationId}.fileprovider"
  396.     android:exported="false"
  397.     android:grantUriPermissions="true">
  398.     <meta-data
  399.         android:name="android.support.FILE_PROVIDER_PATHS"
  400.         android:resource="@xml/file_paths" />
  401. </provider><provider
  402.     android:name="androidx.core.content.FileProvider"
  403.     android:authorities="${applicationId}.fileprovider"
  404.     android:exported="false"
  405.     android:grantUriPermissions="true">
  406.     <meta-data
  407.         android:name="android.support.FILE_PROVIDER_PATHS"
  408.         android:resource="@xml/file_paths" />
  409. </provider>decoration: BoxDecoration(<provider
  410.     android:name="androidx.core.content.FileProvider"
  411.     android:authorities="${applicationId}.fileprovider"
  412.     android:exported="false"
  413.     android:grantUriPermissions="true">
  414.     <meta-data
  415.         android:name="android.support.FILE_PROVIDER_PATHS"
  416.         android:resource="@xml/file_paths" />
  417. </provider><provider
  418.     android:name="androidx.core.content.FileProvider"
  419.     android:authorities="${applicationId}.fileprovider"
  420.     android:exported="false"
  421.     android:grantUriPermissions="true">
  422.     <meta-data
  423.         android:name="android.support.FILE_PROVIDER_PATHS"
  424.         android:resource="@xml/file_paths" />
  425. </provider><provider
  426.     android:name="androidx.core.content.FileProvider"
  427.     android:authorities="${applicationId}.fileprovider"
  428.     android:exported="false"
  429.     android:grantUriPermissions="true">
  430.     <meta-data
  431.         android:name="android.support.FILE_PROVIDER_PATHS"
  432.         android:resource="@xml/file_paths" />
  433. </provider><provider
  434.     android:name="androidx.core.content.FileProvider"
  435.     android:authorities="${applicationId}.fileprovider"
  436.     android:exported="false"
  437.     android:grantUriPermissions="true">
  438.     <meta-data
  439.         android:name="android.support.FILE_PROVIDER_PATHS"
  440.         android:resource="@xml/file_paths" />
  441. </provider>  color: Colors.grey[100],<provider
  442.     android:name="androidx.core.content.FileProvider"
  443.     android:authorities="${applicationId}.fileprovider"
  444.     android:exported="false"
  445.     android:grantUriPermissions="true">
  446.     <meta-data
  447.         android:name="android.support.FILE_PROVIDER_PATHS"
  448.         android:resource="@xml/file_paths" />
  449. </provider><provider
  450.     android:name="androidx.core.content.FileProvider"
  451.     android:authorities="${applicationId}.fileprovider"
  452.     android:exported="false"
  453.     android:grantUriPermissions="true">
  454.     <meta-data
  455.         android:name="android.support.FILE_PROVIDER_PATHS"
  456.         android:resource="@xml/file_paths" />
  457. </provider><provider
  458.     android:name="androidx.core.content.FileProvider"
  459.     android:authorities="${applicationId}.fileprovider"
  460.     android:exported="false"
  461.     android:grantUriPermissions="true">
  462.     <meta-data
  463.         android:name="android.support.FILE_PROVIDER_PATHS"
  464.         android:resource="@xml/file_paths" />
  465. </provider><provider
  466.     android:name="androidx.core.content.FileProvider"
  467.     android:authorities="${applicationId}.fileprovider"
  468.     android:exported="false"
  469.     android:grantUriPermissions="true">
  470.     <meta-data
  471.         android:name="android.support.FILE_PROVIDER_PATHS"
  472.         android:resource="@xml/file_paths" />
  473. </provider>  borderRadius: BorderRadius.circular(8),<provider
  474.     android:name="androidx.core.content.FileProvider"
  475.     android:authorities="${applicationId}.fileprovider"
  476.     android:exported="false"
  477.     android:grantUriPermissions="true">
  478.     <meta-data
  479.         android:name="android.support.FILE_PROVIDER_PATHS"
  480.         android:resource="@xml/file_paths" />
  481. </provider><provider
  482.     android:name="androidx.core.content.FileProvider"
  483.     android:authorities="${applicationId}.fileprovider"
  484.     android:exported="false"
  485.     android:grantUriPermissions="true">
  486.     <meta-data
  487.         android:name="android.support.FILE_PROVIDER_PATHS"
  488.         android:resource="@xml/file_paths" />
  489. </provider><provider
  490.     android:name="androidx.core.content.FileProvider"
  491.     android:authorities="${applicationId}.fileprovider"
  492.     android:exported="false"
  493.     android:grantUriPermissions="true">
  494.     <meta-data
  495.         android:name="android.support.FILE_PROVIDER_PATHS"
  496.         android:resource="@xml/file_paths" />
  497. </provider><provider
  498.     android:name="androidx.core.content.FileProvider"
  499.     android:authorities="${applicationId}.fileprovider"
  500.     android:exported="false"
  501.     android:grantUriPermissions="true">
  502.     <meta-data
  503.         android:name="android.support.FILE_PROVIDER_PATHS"
  504.         android:resource="@xml/file_paths" />
  505. </provider>),<provider
  506.     android:name="androidx.core.content.FileProvider"
  507.     android:authorities="${applicationId}.fileprovider"
  508.     android:exported="false"
  509.     android:grantUriPermissions="true">
  510.     <meta-data
  511.         android:name="android.support.FILE_PROVIDER_PATHS"
  512.         android:resource="@xml/file_paths" />
  513. </provider><provider
  514.     android:name="androidx.core.content.FileProvider"
  515.     android:authorities="${applicationId}.fileprovider"
  516.     android:exported="false"
  517.     android:grantUriPermissions="true">
  518.     <meta-data
  519.         android:name="android.support.FILE_PROVIDER_PATHS"
  520.         android:resource="@xml/file_paths" />
  521. </provider><provider
  522.     android:name="androidx.core.content.FileProvider"
  523.     android:authorities="${applicationId}.fileprovider"
  524.     android:exported="false"
  525.     android:grantUriPermissions="true">
  526.     <meta-data
  527.         android:name="android.support.FILE_PROVIDER_PATHS"
  528.         android:resource="@xml/file_paths" />
  529. </provider><provider
  530.     android:name="androidx.core.content.FileProvider"
  531.     android:authorities="${applicationId}.fileprovider"
  532.     android:exported="false"
  533.     android:grantUriPermissions="true">
  534.     <meta-data
  535.         android:name="android.support.FILE_PROVIDER_PATHS"
  536.         android:resource="@xml/file_paths" />
  537. </provider>child: Text(<provider
  538.     android:name="androidx.core.content.FileProvider"
  539.     android:authorities="${applicationId}.fileprovider"
  540.     android:exported="false"
  541.     android:grantUriPermissions="true">
  542.     <meta-data
  543.         android:name="android.support.FILE_PROVIDER_PATHS"
  544.         android:resource="@xml/file_paths" />
  545. </provider><provider
  546.     android:name="androidx.core.content.FileProvider"
  547.     android:authorities="${applicationId}.fileprovider"
  548.     android:exported="false"
  549.     android:grantUriPermissions="true">
  550.     <meta-data
  551.         android:name="android.support.FILE_PROVIDER_PATHS"
  552.         android:resource="@xml/file_paths" />
  553. </provider><provider
  554.     android:name="androidx.core.content.FileProvider"
  555.     android:authorities="${applicationId}.fileprovider"
  556.     android:exported="false"
  557.     android:grantUriPermissions="true">
  558.     <meta-data
  559.         android:name="android.support.FILE_PROVIDER_PATHS"
  560.         android:resource="@xml/file_paths" />
  561. </provider><provider
  562.     android:name="androidx.core.content.FileProvider"
  563.     android:authorities="${applicationId}.fileprovider"
  564.     android:exported="false"
  565.     android:grantUriPermissions="true">
  566.     <meta-data
  567.         android:name="android.support.FILE_PROVIDER_PATHS"
  568.         android:resource="@xml/file_paths" />
  569. </provider>  result.releaseNotes!,<provider
  570.     android:name="androidx.core.content.FileProvider"
  571.     android:authorities="${applicationId}.fileprovider"
  572.     android:exported="false"
  573.     android:grantUriPermissions="true">
  574.     <meta-data
  575.         android:name="android.support.FILE_PROVIDER_PATHS"
  576.         android:resource="@xml/file_paths" />
  577. </provider><provider
  578.     android:name="androidx.core.content.FileProvider"
  579.     android:authorities="${applicationId}.fileprovider"
  580.     android:exported="false"
  581.     android:grantUriPermissions="true">
  582.     <meta-data
  583.         android:name="android.support.FILE_PROVIDER_PATHS"
  584.         android:resource="@xml/file_paths" />
  585. </provider><provider
  586.     android:name="androidx.core.content.FileProvider"
  587.     android:authorities="${applicationId}.fileprovider"
  588.     android:exported="false"
  589.     android:grantUriPermissions="true">
  590.     <meta-data
  591.         android:name="android.support.FILE_PROVIDER_PATHS"
  592.         android:resource="@xml/file_paths" />
  593. </provider><provider
  594.     android:name="androidx.core.content.FileProvider"
  595.     android:authorities="${applicationId}.fileprovider"
  596.     android:exported="false"
  597.     android:grantUriPermissions="true">
  598.     <meta-data
  599.         android:name="android.support.FILE_PROVIDER_PATHS"
  600.         android:resource="@xml/file_paths" />
  601. </provider>  style: const TextStyle(fontSize: 14),<provider
  602.     android:name="androidx.core.content.FileProvider"
  603.     android:authorities="${applicationId}.fileprovider"
  604.     android:exported="false"
  605.     android:grantUriPermissions="true">
  606.     <meta-data
  607.         android:name="android.support.FILE_PROVIDER_PATHS"
  608.         android:resource="@xml/file_paths" />
  609. </provider><provider
  610.     android:name="androidx.core.content.FileProvider"
  611.     android:authorities="${applicationId}.fileprovider"
  612.     android:exported="false"
  613.     android:grantUriPermissions="true">
  614.     <meta-data
  615.         android:name="android.support.FILE_PROVIDER_PATHS"
  616.         android:resource="@xml/file_paths" />
  617. </provider><provider
  618.     android:name="androidx.core.content.FileProvider"
  619.     android:authorities="${applicationId}.fileprovider"
  620.     android:exported="false"
  621.     android:grantUriPermissions="true">
  622.     <meta-data
  623.         android:name="android.support.FILE_PROVIDER_PATHS"
  624.         android:resource="@xml/file_paths" />
  625. </provider><provider
  626.     android:name="androidx.core.content.FileProvider"
  627.     android:authorities="${applicationId}.fileprovider"
  628.     android:exported="false"
  629.     android:grantUriPermissions="true">
  630.     <meta-data
  631.         android:name="android.support.FILE_PROVIDER_PATHS"
  632.         android:resource="@xml/file_paths" />
  633. </provider>),<provider
  634.     android:name="androidx.core.content.FileProvider"
  635.     android:authorities="${applicationId}.fileprovider"
  636.     android:exported="false"
  637.     android:grantUriPermissions="true">
  638.     <meta-data
  639.         android:name="android.support.FILE_PROVIDER_PATHS"
  640.         android:resource="@xml/file_paths" />
  641. </provider><provider
  642.     android:name="androidx.core.content.FileProvider"
  643.     android:authorities="${applicationId}.fileprovider"
  644.     android:exported="false"
  645.     android:grantUriPermissions="true">
  646.     <meta-data
  647.         android:name="android.support.FILE_PROVIDER_PATHS"
  648.         android:resource="@xml/file_paths" />
  649. </provider><provider
  650.     android:name="androidx.core.content.FileProvider"
  651.     android:authorities="${applicationId}.fileprovider"
  652.     android:exported="false"
  653.     android:grantUriPermissions="true">
  654.     <meta-data
  655.         android:name="android.support.FILE_PROVIDER_PATHS"
  656.         android:resource="@xml/file_paths" />
  657. </provider>  ),<provider
  658.     android:name="androidx.core.content.FileProvider"
  659.     android:authorities="${applicationId}.fileprovider"
  660.     android:exported="false"
  661.     android:grantUriPermissions="true">
  662.     <meta-data
  663.         android:name="android.support.FILE_PROVIDER_PATHS"
  664.         android:resource="@xml/file_paths" />
  665. </provider><provider
  666.     android:name="androidx.core.content.FileProvider"
  667.     android:authorities="${applicationId}.fileprovider"
  668.     android:exported="false"
  669.     android:grantUriPermissions="true">
  670.     <meta-data
  671.         android:name="android.support.FILE_PROVIDER_PATHS"
  672.         android:resource="@xml/file_paths" />
  673. </provider><provider
  674.     android:name="androidx.core.content.FileProvider"
  675.     android:authorities="${applicationId}.fileprovider"
  676.     android:exported="false"
  677.     android:grantUriPermissions="true">
  678.     <meta-data
  679.         android:name="android.support.FILE_PROVIDER_PATHS"
  680.         android:resource="@xml/file_paths" />
  681. </provider>  const SizedBox(height: 16),<provider
  682.     android:name="androidx.core.content.FileProvider"
  683.     android:authorities="${applicationId}.fileprovider"
  684.     android:exported="false"
  685.     android:grantUriPermissions="true">
  686.     <meta-data
  687.         android:name="android.support.FILE_PROVIDER_PATHS"
  688.         android:resource="@xml/file_paths" />
  689. </provider><provider
  690.     android:name="androidx.core.content.FileProvider"
  691.     android:authorities="${applicationId}.fileprovider"
  692.     android:exported="false"
  693.     android:grantUriPermissions="true">
  694.     <meta-data
  695.         android:name="android.support.FILE_PROVIDER_PATHS"
  696.         android:resource="@xml/file_paths" />
  697. </provider><provider
  698.     android:name="androidx.core.content.FileProvider"
  699.     android:authorities="${applicationId}.fileprovider"
  700.     android:exported="false"
  701.     android:grantUriPermissions="true">
  702.     <meta-data
  703.         android:name="android.support.FILE_PROVIDER_PATHS"
  704.         android:resource="@xml/file_paths" />
  705. </provider>],<provider
  706.     android:name="androidx.core.content.FileProvider"
  707.     android:authorities="${applicationId}.fileprovider"
  708.     android:exported="false"
  709.     android:grantUriPermissions="true">
  710.     <meta-data
  711.         android:name="android.support.FILE_PROVIDER_PATHS"
  712.         android:resource="@xml/file_paths" />
  713. </provider><provider
  714.     android:name="androidx.core.content.FileProvider"
  715.     android:authorities="${applicationId}.fileprovider"
  716.     android:exported="false"
  717.     android:grantUriPermissions="true">
  718.     <meta-data
  719.         android:name="android.support.FILE_PROVIDER_PATHS"
  720.         android:resource="@xml/file_paths" />
  721. </provider><provider
  722.     android:name="androidx.core.content.FileProvider"
  723.     android:authorities="${applicationId}.fileprovider"
  724.     android:exported="false"
  725.     android:grantUriPermissions="true">
  726.     <meta-data
  727.         android:name="android.support.FILE_PROVIDER_PATHS"
  728.         android:resource="@xml/file_paths" />
  729. </provider>if (result.publishedAt != null) ...[<provider
  730.     android:name="androidx.core.content.FileProvider"
  731.     android:authorities="${applicationId}.fileprovider"
  732.     android:exported="false"
  733.     android:grantUriPermissions="true">
  734.     <meta-data
  735.         android:name="android.support.FILE_PROVIDER_PATHS"
  736.         android:resource="@xml/file_paths" />
  737. </provider><provider
  738.     android:name="androidx.core.content.FileProvider"
  739.     android:authorities="${applicationId}.fileprovider"
  740.     android:exported="false"
  741.     android:grantUriPermissions="true">
  742.     <meta-data
  743.         android:name="android.support.FILE_PROVIDER_PATHS"
  744.         android:resource="@xml/file_paths" />
  745. </provider><provider
  746.     android:name="androidx.core.content.FileProvider"
  747.     android:authorities="${applicationId}.fileprovider"
  748.     android:exported="false"
  749.     android:grantUriPermissions="true">
  750.     <meta-data
  751.         android:name="android.support.FILE_PROVIDER_PATHS"
  752.         android:resource="@xml/file_paths" />
  753. </provider>  Text(<provider
  754.     android:name="androidx.core.content.FileProvider"
  755.     android:authorities="${applicationId}.fileprovider"
  756.     android:exported="false"
  757.     android:grantUriPermissions="true">
  758.     <meta-data
  759.         android:name="android.support.FILE_PROVIDER_PATHS"
  760.         android:resource="@xml/file_paths" />
  761. </provider><provider
  762.     android:name="androidx.core.content.FileProvider"
  763.     android:authorities="${applicationId}.fileprovider"
  764.     android:exported="false"
  765.     android:grantUriPermissions="true">
  766.     <meta-data
  767.         android:name="android.support.FILE_PROVIDER_PATHS"
  768.         android:resource="@xml/file_paths" />
  769. </provider><provider
  770.     android:name="androidx.core.content.FileProvider"
  771.     android:authorities="${applicationId}.fileprovider"
  772.     android:exported="false"
  773.     android:grantUriPermissions="true">
  774.     <meta-data
  775.         android:name="android.support.FILE_PROVIDER_PATHS"
  776.         android:resource="@xml/file_paths" />
  777. </provider><provider
  778.     android:name="androidx.core.content.FileProvider"
  779.     android:authorities="${applicationId}.fileprovider"
  780.     android:exported="false"
  781.     android:grantUriPermissions="true">
  782.     <meta-data
  783.         android:name="android.support.FILE_PROVIDER_PATHS"
  784.         android:resource="@xml/file_paths" />
  785. </provider>'发布时间: ${_formatPublishTime(result.publishedAt!)}',<provider
  786.     android:name="androidx.core.content.FileProvider"
  787.     android:authorities="${applicationId}.fileprovider"
  788.     android:exported="false"
  789.     android:grantUriPermissions="true">
  790.     <meta-data
  791.         android:name="android.support.FILE_PROVIDER_PATHS"
  792.         android:resource="@xml/file_paths" />
  793. </provider><provider
  794.     android:name="androidx.core.content.FileProvider"
  795.     android:authorities="${applicationId}.fileprovider"
  796.     android:exported="false"
  797.     android:grantUriPermissions="true">
  798.     <meta-data
  799.         android:name="android.support.FILE_PROVIDER_PATHS"
  800.         android:resource="@xml/file_paths" />
  801. </provider><provider
  802.     android:name="androidx.core.content.FileProvider"
  803.     android:authorities="${applicationId}.fileprovider"
  804.     android:exported="false"
  805.     android:grantUriPermissions="true">
  806.     <meta-data
  807.         android:name="android.support.FILE_PROVIDER_PATHS"
  808.         android:resource="@xml/file_paths" />
  809. </provider><provider
  810.     android:name="androidx.core.content.FileProvider"
  811.     android:authorities="${applicationId}.fileprovider"
  812.     android:exported="false"
  813.     android:grantUriPermissions="true">
  814.     <meta-data
  815.         android:name="android.support.FILE_PROVIDER_PATHS"
  816.         android:resource="@xml/file_paths" />
  817. </provider>style: TextStyle(<provider
  818.     android:name="androidx.core.content.FileProvider"
  819.     android:authorities="${applicationId}.fileprovider"
  820.     android:exported="false"
  821.     android:grantUriPermissions="true">
  822.     <meta-data
  823.         android:name="android.support.FILE_PROVIDER_PATHS"
  824.         android:resource="@xml/file_paths" />
  825. </provider><provider
  826.     android:name="androidx.core.content.FileProvider"
  827.     android:authorities="${applicationId}.fileprovider"
  828.     android:exported="false"
  829.     android:grantUriPermissions="true">
  830.     <meta-data
  831.         android:name="android.support.FILE_PROVIDER_PATHS"
  832.         android:resource="@xml/file_paths" />
  833. </provider><provider
  834.     android:name="androidx.core.content.FileProvider"
  835.     android:authorities="${applicationId}.fileprovider"
  836.     android:exported="false"
  837.     android:grantUriPermissions="true">
  838.     <meta-data
  839.         android:name="android.support.FILE_PROVIDER_PATHS"
  840.         android:resource="@xml/file_paths" />
  841. </provider><provider
  842.     android:name="androidx.core.content.FileProvider"
  843.     android:authorities="${applicationId}.fileprovider"
  844.     android:exported="false"
  845.     android:grantUriPermissions="true">
  846.     <meta-data
  847.         android:name="android.support.FILE_PROVIDER_PATHS"
  848.         android:resource="@xml/file_paths" />
  849. </provider>  fontSize: 12,<provider
  850.     android:name="androidx.core.content.FileProvider"
  851.     android:authorities="${applicationId}.fileprovider"
  852.     android:exported="false"
  853.     android:grantUriPermissions="true">
  854.     <meta-data
  855.         android:name="android.support.FILE_PROVIDER_PATHS"
  856.         android:resource="@xml/file_paths" />
  857. </provider><provider
  858.     android:name="androidx.core.content.FileProvider"
  859.     android:authorities="${applicationId}.fileprovider"
  860.     android:exported="false"
  861.     android:grantUriPermissions="true">
  862.     <meta-data
  863.         android:name="android.support.FILE_PROVIDER_PATHS"
  864.         android:resource="@xml/file_paths" />
  865. </provider><provider
  866.     android:name="androidx.core.content.FileProvider"
  867.     android:authorities="${applicationId}.fileprovider"
  868.     android:exported="false"
  869.     android:grantUriPermissions="true">
  870.     <meta-data
  871.         android:name="android.support.FILE_PROVIDER_PATHS"
  872.         android:resource="@xml/file_paths" />
  873. </provider><provider
  874.     android:name="androidx.core.content.FileProvider"
  875.     android:authorities="${applicationId}.fileprovider"
  876.     android:exported="false"
  877.     android:grantUriPermissions="true">
  878.     <meta-data
  879.         android:name="android.support.FILE_PROVIDER_PATHS"
  880.         android:resource="@xml/file_paths" />
  881. </provider>  color: Colors.grey[600],<provider
  882.     android:name="androidx.core.content.FileProvider"
  883.     android:authorities="${applicationId}.fileprovider"
  884.     android:exported="false"
  885.     android:grantUriPermissions="true">
  886.     <meta-data
  887.         android:name="android.support.FILE_PROVIDER_PATHS"
  888.         android:resource="@xml/file_paths" />
  889. </provider><provider
  890.     android:name="androidx.core.content.FileProvider"
  891.     android:authorities="${applicationId}.fileprovider"
  892.     android:exported="false"
  893.     android:grantUriPermissions="true">
  894.     <meta-data
  895.         android:name="android.support.FILE_PROVIDER_PATHS"
  896.         android:resource="@xml/file_paths" />
  897. </provider><provider
  898.     android:name="androidx.core.content.FileProvider"
  899.     android:authorities="${applicationId}.fileprovider"
  900.     android:exported="false"
  901.     android:grantUriPermissions="true">
  902.     <meta-data
  903.         android:name="android.support.FILE_PROVIDER_PATHS"
  904.         android:resource="@xml/file_paths" />
  905. </provider><provider
  906.     android:name="androidx.core.content.FileProvider"
  907.     android:authorities="${applicationId}.fileprovider"
  908.     android:exported="false"
  909.     android:grantUriPermissions="true">
  910.     <meta-data
  911.         android:name="android.support.FILE_PROVIDER_PATHS"
  912.         android:resource="@xml/file_paths" />
  913. </provider>),<provider
  914.     android:name="androidx.core.content.FileProvider"
  915.     android:authorities="${applicationId}.fileprovider"
  916.     android:exported="false"
  917.     android:grantUriPermissions="true">
  918.     <meta-data
  919.         android:name="android.support.FILE_PROVIDER_PATHS"
  920.         android:resource="@xml/file_paths" />
  921. </provider><provider
  922.     android:name="androidx.core.content.FileProvider"
  923.     android:authorities="${applicationId}.fileprovider"
  924.     android:exported="false"
  925.     android:grantUriPermissions="true">
  926.     <meta-data
  927.         android:name="android.support.FILE_PROVIDER_PATHS"
  928.         android:resource="@xml/file_paths" />
  929. </provider><provider
  930.     android:name="androidx.core.content.FileProvider"
  931.     android:authorities="${applicationId}.fileprovider"
  932.     android:exported="false"
  933.     android:grantUriPermissions="true">
  934.     <meta-data
  935.         android:name="android.support.FILE_PROVIDER_PATHS"
  936.         android:resource="@xml/file_paths" />
  937. </provider>  ),<provider
  938.     android:name="androidx.core.content.FileProvider"
  939.     android:authorities="${applicationId}.fileprovider"
  940.     android:exported="false"
  941.     android:grantUriPermissions="true">
  942.     <meta-data
  943.         android:name="android.support.FILE_PROVIDER_PATHS"
  944.         android:resource="@xml/file_paths" />
  945. </provider><provider
  946.     android:name="androidx.core.content.FileProvider"
  947.     android:authorities="${applicationId}.fileprovider"
  948.     android:exported="false"
  949.     android:grantUriPermissions="true">
  950.     <meta-data
  951.         android:name="android.support.FILE_PROVIDER_PATHS"
  952.         android:resource="@xml/file_paths" />
  953. </provider><provider
  954.     android:name="androidx.core.content.FileProvider"
  955.     android:authorities="${applicationId}.fileprovider"
  956.     android:exported="false"
  957.     android:grantUriPermissions="true">
  958.     <meta-data
  959.         android:name="android.support.FILE_PROVIDER_PATHS"
  960.         android:resource="@xml/file_paths" />
  961. </provider>  const SizedBox(height: 8),<provider
  962.     android:name="androidx.core.content.FileProvider"
  963.     android:authorities="${applicationId}.fileprovider"
  964.     android:exported="false"
  965.     android:grantUriPermissions="true">
  966.     <meta-data
  967.         android:name="android.support.FILE_PROVIDER_PATHS"
  968.         android:resource="@xml/file_paths" />
  969. </provider><provider
  970.     android:name="androidx.core.content.FileProvider"
  971.     android:authorities="${applicationId}.fileprovider"
  972.     android:exported="false"
  973.     android:grantUriPermissions="true">
  974.     <meta-data
  975.         android:name="android.support.FILE_PROVIDER_PATHS"
  976.         android:resource="@xml/file_paths" />
  977. </provider><provider
  978.     android:name="androidx.core.content.FileProvider"
  979.     android:authorities="${applicationId}.fileprovider"
  980.     android:exported="false"
  981.     android:grantUriPermissions="true">
  982.     <meta-data
  983.         android:name="android.support.FILE_PROVIDER_PATHS"
  984.         android:resource="@xml/file_paths" />
  985. </provider>],<provider
  986.     android:name="androidx.core.content.FileProvider"
  987.     android:authorities="${applicationId}.fileprovider"
  988.     android:exported="false"
  989.     android:grantUriPermissions="true">
  990.     <meta-data
  991.         android:name="android.support.FILE_PROVIDER_PATHS"
  992.         android:resource="@xml/file_paths" />
  993. </provider><provider
  994.     android:name="androidx.core.content.FileProvider"
  995.     android:authorities="${applicationId}.fileprovider"
  996.     android:exported="false"
  997.     android:grantUriPermissions="true">
  998.     <meta-data
  999.         android:name="android.support.FILE_PROVIDER_PATHS"
  1000.         android:resource="@xml/file_paths" />
  1001. </provider><provider
  1002.     android:name="androidx.core.content.FileProvider"
  1003.     android:authorities="${applicationId}.fileprovider"
  1004.     android:exported="false"
  1005.     android:grantUriPermissions="true">
  1006.     <meta-data
  1007.         android:name="android.support.FILE_PROVIDER_PATHS"
  1008.         android:resource="@xml/file_paths" />
  1009. </provider>Container(<provider
  1010.     android:name="androidx.core.content.FileProvider"
  1011.     android:authorities="${applicationId}.fileprovider"
  1012.     android:exported="false"
  1013.     android:grantUriPermissions="true">
  1014.     <meta-data
  1015.         android:name="android.support.FILE_PROVIDER_PATHS"
  1016.         android:resource="@xml/file_paths" />
  1017. </provider><provider
  1018.     android:name="androidx.core.content.FileProvider"
  1019.     android:authorities="${applicationId}.fileprovider"
  1020.     android:exported="false"
  1021.     android:grantUriPermissions="true">
  1022.     <meta-data
  1023.         android:name="android.support.FILE_PROVIDER_PATHS"
  1024.         android:resource="@xml/file_paths" />
  1025. </provider><provider
  1026.     android:name="androidx.core.content.FileProvider"
  1027.     android:authorities="${applicationId}.fileprovider"
  1028.     android:exported="false"
  1029.     android:grantUriPermissions="true">
  1030.     <meta-data
  1031.         android:name="android.support.FILE_PROVIDER_PATHS"
  1032.         android:resource="@xml/file_paths" />
  1033. </provider>  padding: const EdgeInsets.all(12),<provider
  1034.     android:name="androidx.core.content.FileProvider"
  1035.     android:authorities="${applicationId}.fileprovider"
  1036.     android:exported="false"
  1037.     android:grantUriPermissions="true">
  1038.     <meta-data
  1039.         android:name="android.support.FILE_PROVIDER_PATHS"
  1040.         android:resource="@xml/file_paths" />
  1041. </provider><provider
  1042.     android:name="androidx.core.content.FileProvider"
  1043.     android:authorities="${applicationId}.fileprovider"
  1044.     android:exported="false"
  1045.     android:grantUriPermissions="true">
  1046.     <meta-data
  1047.         android:name="android.support.FILE_PROVIDER_PATHS"
  1048.         android:resource="@xml/file_paths" />
  1049. </provider><provider
  1050.     android:name="androidx.core.content.FileProvider"
  1051.     android:authorities="${applicationId}.fileprovider"
  1052.     android:exported="false"
  1053.     android:grantUriPermissions="true">
  1054.     <meta-data
  1055.         android:name="android.support.FILE_PROVIDER_PATHS"
  1056.         android:resource="@xml/file_paths" />
  1057. </provider>  decoration: BoxDecoration(<provider
  1058.     android:name="androidx.core.content.FileProvider"
  1059.     android:authorities="${applicationId}.fileprovider"
  1060.     android:exported="false"
  1061.     android:grantUriPermissions="true">
  1062.     <meta-data
  1063.         android:name="android.support.FILE_PROVIDER_PATHS"
  1064.         android:resource="@xml/file_paths" />
  1065. </provider><provider
  1066.     android:name="androidx.core.content.FileProvider"
  1067.     android:authorities="${applicationId}.fileprovider"
  1068.     android:exported="false"
  1069.     android:grantUriPermissions="true">
  1070.     <meta-data
  1071.         android:name="android.support.FILE_PROVIDER_PATHS"
  1072.         android:resource="@xml/file_paths" />
  1073. </provider><provider
  1074.     android:name="androidx.core.content.FileProvider"
  1075.     android:authorities="${applicationId}.fileprovider"
  1076.     android:exported="false"
  1077.     android:grantUriPermissions="true">
  1078.     <meta-data
  1079.         android:name="android.support.FILE_PROVIDER_PATHS"
  1080.         android:resource="@xml/file_paths" />
  1081. </provider><provider
  1082.     android:name="androidx.core.content.FileProvider"
  1083.     android:authorities="${applicationId}.fileprovider"
  1084.     android:exported="false"
  1085.     android:grantUriPermissions="true">
  1086.     <meta-data
  1087.         android:name="android.support.FILE_PROVIDER_PATHS"
  1088.         android:resource="@xml/file_paths" />
  1089. </provider>color: Colors.blue[50],<provider
  1090.     android:name="androidx.core.content.FileProvider"
  1091.     android:authorities="${applicationId}.fileprovider"
  1092.     android:exported="false"
  1093.     android:grantUriPermissions="true">
  1094.     <meta-data
  1095.         android:name="android.support.FILE_PROVIDER_PATHS"
  1096.         android:resource="@xml/file_paths" />
  1097. </provider><provider
  1098.     android:name="androidx.core.content.FileProvider"
  1099.     android:authorities="${applicationId}.fileprovider"
  1100.     android:exported="false"
  1101.     android:grantUriPermissions="true">
  1102.     <meta-data
  1103.         android:name="android.support.FILE_PROVIDER_PATHS"
  1104.         android:resource="@xml/file_paths" />
  1105. </provider><provider
  1106.     android:name="androidx.core.content.FileProvider"
  1107.     android:authorities="${applicationId}.fileprovider"
  1108.     android:exported="false"
  1109.     android:grantUriPermissions="true">
  1110.     <meta-data
  1111.         android:name="android.support.FILE_PROVIDER_PATHS"
  1112.         android:resource="@xml/file_paths" />
  1113. </provider><provider
  1114.     android:name="androidx.core.content.FileProvider"
  1115.     android:authorities="${applicationId}.fileprovider"
  1116.     android:exported="false"
  1117.     android:grantUriPermissions="true">
  1118.     <meta-data
  1119.         android:name="android.support.FILE_PROVIDER_PATHS"
  1120.         android:resource="@xml/file_paths" />
  1121. </provider>borderRadius: BorderRadius.circular(8),<provider
  1122.     android:name="androidx.core.content.FileProvider"
  1123.     android:authorities="${applicationId}.fileprovider"
  1124.     android:exported="false"
  1125.     android:grantUriPermissions="true">
  1126.     <meta-data
  1127.         android:name="android.support.FILE_PROVIDER_PATHS"
  1128.         android:resource="@xml/file_paths" />
  1129. </provider><provider
  1130.     android:name="androidx.core.content.FileProvider"
  1131.     android:authorities="${applicationId}.fileprovider"
  1132.     android:exported="false"
  1133.     android:grantUriPermissions="true">
  1134.     <meta-data
  1135.         android:name="android.support.FILE_PROVIDER_PATHS"
  1136.         android:resource="@xml/file_paths" />
  1137. </provider><provider
  1138.     android:name="androidx.core.content.FileProvider"
  1139.     android:authorities="${applicationId}.fileprovider"
  1140.     android:exported="false"
  1141.     android:grantUriPermissions="true">
  1142.     <meta-data
  1143.         android:name="android.support.FILE_PROVIDER_PATHS"
  1144.         android:resource="@xml/file_paths" />
  1145. </provider><provider
  1146.     android:name="androidx.core.content.FileProvider"
  1147.     android:authorities="${applicationId}.fileprovider"
  1148.     android:exported="false"
  1149.     android:grantUriPermissions="true">
  1150.     <meta-data
  1151.         android:name="android.support.FILE_PROVIDER_PATHS"
  1152.         android:resource="@xml/file_paths" />
  1153. </provider>border: Border.all(color: Colors.blue[200]!),<provider
  1154.     android:name="androidx.core.content.FileProvider"
  1155.     android:authorities="${applicationId}.fileprovider"
  1156.     android:exported="false"
  1157.     android:grantUriPermissions="true">
  1158.     <meta-data
  1159.         android:name="android.support.FILE_PROVIDER_PATHS"
  1160.         android:resource="@xml/file_paths" />
  1161. </provider><provider
  1162.     android:name="androidx.core.content.FileProvider"
  1163.     android:authorities="${applicationId}.fileprovider"
  1164.     android:exported="false"
  1165.     android:grantUriPermissions="true">
  1166.     <meta-data
  1167.         android:name="android.support.FILE_PROVIDER_PATHS"
  1168.         android:resource="@xml/file_paths" />
  1169. </provider><provider
  1170.     android:name="androidx.core.content.FileProvider"
  1171.     android:authorities="${applicationId}.fileprovider"
  1172.     android:exported="false"
  1173.     android:grantUriPermissions="true">
  1174.     <meta-data
  1175.         android:name="android.support.FILE_PROVIDER_PATHS"
  1176.         android:resource="@xml/file_paths" />
  1177. </provider>  ),<provider
  1178.     android:name="androidx.core.content.FileProvider"
  1179.     android:authorities="${applicationId}.fileprovider"
  1180.     android:exported="false"
  1181.     android:grantUriPermissions="true">
  1182.     <meta-data
  1183.         android:name="android.support.FILE_PROVIDER_PATHS"
  1184.         android:resource="@xml/file_paths" />
  1185. </provider><provider
  1186.     android:name="androidx.core.content.FileProvider"
  1187.     android:authorities="${applicationId}.fileprovider"
  1188.     android:exported="false"
  1189.     android:grantUriPermissions="true">
  1190.     <meta-data
  1191.         android:name="android.support.FILE_PROVIDER_PATHS"
  1192.         android:resource="@xml/file_paths" />
  1193. </provider><provider
  1194.     android:name="androidx.core.content.FileProvider"
  1195.     android:authorities="${applicationId}.fileprovider"
  1196.     android:exported="false"
  1197.     android:grantUriPermissions="true">
  1198.     <meta-data
  1199.         android:name="android.support.FILE_PROVIDER_PATHS"
  1200.         android:resource="@xml/file_paths" />
  1201. </provider>  child: Row(<provider
  1202.     android:name="androidx.core.content.FileProvider"
  1203.     android:authorities="${applicationId}.fileprovider"
  1204.     android:exported="false"
  1205.     android:grantUriPermissions="true">
  1206.     <meta-data
  1207.         android:name="android.support.FILE_PROVIDER_PATHS"
  1208.         android:resource="@xml/file_paths" />
  1209. </provider><provider
  1210.     android:name="androidx.core.content.FileProvider"
  1211.     android:authorities="${applicationId}.fileprovider"
  1212.     android:exported="false"
  1213.     android:grantUriPermissions="true">
  1214.     <meta-data
  1215.         android:name="android.support.FILE_PROVIDER_PATHS"
  1216.         android:resource="@xml/file_paths" />
  1217. </provider><provider
  1218.     android:name="androidx.core.content.FileProvider"
  1219.     android:authorities="${applicationId}.fileprovider"
  1220.     android:exported="false"
  1221.     android:grantUriPermissions="true">
  1222.     <meta-data
  1223.         android:name="android.support.FILE_PROVIDER_PATHS"
  1224.         android:resource="@xml/file_paths" />
  1225. </provider><provider
  1226.     android:name="androidx.core.content.FileProvider"
  1227.     android:authorities="${applicationId}.fileprovider"
  1228.     android:exported="false"
  1229.     android:grantUriPermissions="true">
  1230.     <meta-data
  1231.         android:name="android.support.FILE_PROVIDER_PATHS"
  1232.         android:resource="@xml/file_paths" />
  1233. </provider>children: [<provider
  1234.     android:name="androidx.core.content.FileProvider"
  1235.     android:authorities="${applicationId}.fileprovider"
  1236.     android:exported="false"
  1237.     android:grantUriPermissions="true">
  1238.     <meta-data
  1239.         android:name="android.support.FILE_PROVIDER_PATHS"
  1240.         android:resource="@xml/file_paths" />
  1241. </provider><provider
  1242.     android:name="androidx.core.content.FileProvider"
  1243.     android:authorities="${applicationId}.fileprovider"
  1244.     android:exported="false"
  1245.     android:grantUriPermissions="true">
  1246.     <meta-data
  1247.         android:name="android.support.FILE_PROVIDER_PATHS"
  1248.         android:resource="@xml/file_paths" />
  1249. </provider><provider
  1250.     android:name="androidx.core.content.FileProvider"
  1251.     android:authorities="${applicationId}.fileprovider"
  1252.     android:exported="false"
  1253.     android:grantUriPermissions="true">
  1254.     <meta-data
  1255.         android:name="android.support.FILE_PROVIDER_PATHS"
  1256.         android:resource="@xml/file_paths" />
  1257. </provider><provider
  1258.     android:name="androidx.core.content.FileProvider"
  1259.     android:authorities="${applicationId}.fileprovider"
  1260.     android:exported="false"
  1261.     android:grantUriPermissions="true">
  1262.     <meta-data
  1263.         android:name="android.support.FILE_PROVIDER_PATHS"
  1264.         android:resource="@xml/file_paths" />
  1265. </provider>  Icon(Icons.info, color: Colors.blue[700], size: 20),<provider
  1266.     android:name="androidx.core.content.FileProvider"
  1267.     android:authorities="${applicationId}.fileprovider"
  1268.     android:exported="false"
  1269.     android:grantUriPermissions="true">
  1270.     <meta-data
  1271.         android:name="android.support.FILE_PROVIDER_PATHS"
  1272.         android:resource="@xml/file_paths" />
  1273. </provider><provider
  1274.     android:name="androidx.core.content.FileProvider"
  1275.     android:authorities="${applicationId}.fileprovider"
  1276.     android:exported="false"
  1277.     android:grantUriPermissions="true">
  1278.     <meta-data
  1279.         android:name="android.support.FILE_PROVIDER_PATHS"
  1280.         android:resource="@xml/file_paths" />
  1281. </provider><provider
  1282.     android:name="androidx.core.content.FileProvider"
  1283.     android:authorities="${applicationId}.fileprovider"
  1284.     android:exported="false"
  1285.     android:grantUriPermissions="true">
  1286.     <meta-data
  1287.         android:name="android.support.FILE_PROVIDER_PATHS"
  1288.         android:resource="@xml/file_paths" />
  1289. </provider><provider
  1290.     android:name="androidx.core.content.FileProvider"
  1291.     android:authorities="${applicationId}.fileprovider"
  1292.     android:exported="false"
  1293.     android:grantUriPermissions="true">
  1294.     <meta-data
  1295.         android:name="android.support.FILE_PROVIDER_PATHS"
  1296.         android:resource="@xml/file_paths" />
  1297. </provider>  const SizedBox(width: 8),<provider
  1298.     android:name="androidx.core.content.FileProvider"
  1299.     android:authorities="${applicationId}.fileprovider"
  1300.     android:exported="false"
  1301.     android:grantUriPermissions="true">
  1302.     <meta-data
  1303.         android:name="android.support.FILE_PROVIDER_PATHS"
  1304.         android:resource="@xml/file_paths" />
  1305. </provider><provider
  1306.     android:name="androidx.core.content.FileProvider"
  1307.     android:authorities="${applicationId}.fileprovider"
  1308.     android:exported="false"
  1309.     android:grantUriPermissions="true">
  1310.     <meta-data
  1311.         android:name="android.support.FILE_PROVIDER_PATHS"
  1312.         android:resource="@xml/file_paths" />
  1313. </provider><provider
  1314.     android:name="androidx.core.content.FileProvider"
  1315.     android:authorities="${applicationId}.fileprovider"
  1316.     android:exported="false"
  1317.     android:grantUriPermissions="true">
  1318.     <meta-data
  1319.         android:name="android.support.FILE_PROVIDER_PATHS"
  1320.         android:resource="@xml/file_paths" />
  1321. </provider><provider
  1322.     android:name="androidx.core.content.FileProvider"
  1323.     android:authorities="${applicationId}.fileprovider"
  1324.     android:exported="false"
  1325.     android:grantUriPermissions="true">
  1326.     <meta-data
  1327.         android:name="android.support.FILE_PROVIDER_PATHS"
  1328.         android:resource="@xml/file_paths" />
  1329. </provider>  Expanded(<provider
  1330.     android:name="androidx.core.content.FileProvider"
  1331.     android:authorities="${applicationId}.fileprovider"
  1332.     android:exported="false"
  1333.     android:grantUriPermissions="true">
  1334.     <meta-data
  1335.         android:name="android.support.FILE_PROVIDER_PATHS"
  1336.         android:resource="@xml/file_paths" />
  1337. </provider><provider
  1338.     android:name="androidx.core.content.FileProvider"
  1339.     android:authorities="${applicationId}.fileprovider"
  1340.     android:exported="false"
  1341.     android:grantUriPermissions="true">
  1342.     <meta-data
  1343.         android:name="android.support.FILE_PROVIDER_PATHS"
  1344.         android:resource="@xml/file_paths" />
  1345. </provider><provider
  1346.     android:name="androidx.core.content.FileProvider"
  1347.     android:authorities="${applicationId}.fileprovider"
  1348.     android:exported="false"
  1349.     android:grantUriPermissions="true">
  1350.     <meta-data
  1351.         android:name="android.support.FILE_PROVIDER_PATHS"
  1352.         android:resource="@xml/file_paths" />
  1353. </provider><provider
  1354.     android:name="androidx.core.content.FileProvider"
  1355.     android:authorities="${applicationId}.fileprovider"
  1356.     android:exported="false"
  1357.     android:grantUriPermissions="true">
  1358.     <meta-data
  1359.         android:name="android.support.FILE_PROVIDER_PATHS"
  1360.         android:resource="@xml/file_paths" />
  1361. </provider><provider
  1362.     android:name="androidx.core.content.FileProvider"
  1363.     android:authorities="${applicationId}.fileprovider"
  1364.     android:exported="false"
  1365.     android:grantUriPermissions="true">
  1366.     <meta-data
  1367.         android:name="android.support.FILE_PROVIDER_PATHS"
  1368.         android:resource="@xml/file_paths" />
  1369. </provider>child: Text(<provider
  1370.     android:name="androidx.core.content.FileProvider"
  1371.     android:authorities="${applicationId}.fileprovider"
  1372.     android:exported="false"
  1373.     android:grantUriPermissions="true">
  1374.     <meta-data
  1375.         android:name="android.support.FILE_PROVIDER_PATHS"
  1376.         android:resource="@xml/file_paths" />
  1377. </provider><provider
  1378.     android:name="androidx.core.content.FileProvider"
  1379.     android:authorities="${applicationId}.fileprovider"
  1380.     android:exported="false"
  1381.     android:grantUriPermissions="true">
  1382.     <meta-data
  1383.         android:name="android.support.FILE_PROVIDER_PATHS"
  1384.         android:resource="@xml/file_paths" />
  1385. </provider><provider
  1386.     android:name="androidx.core.content.FileProvider"
  1387.     android:authorities="${applicationId}.fileprovider"
  1388.     android:exported="false"
  1389.     android:grantUriPermissions="true">
  1390.     <meta-data
  1391.         android:name="android.support.FILE_PROVIDER_PATHS"
  1392.         android:resource="@xml/file_paths" />
  1393. </provider><provider
  1394.     android:name="androidx.core.content.FileProvider"
  1395.     android:authorities="${applicationId}.fileprovider"
  1396.     android:exported="false"
  1397.     android:grantUriPermissions="true">
  1398.     <meta-data
  1399.         android:name="android.support.FILE_PROVIDER_PATHS"
  1400.         android:resource="@xml/file_paths" />
  1401. </provider><provider
  1402.     android:name="androidx.core.content.FileProvider"
  1403.     android:authorities="${applicationId}.fileprovider"
  1404.     android:exported="false"
  1405.     android:grantUriPermissions="true">
  1406.     <meta-data
  1407.         android:name="android.support.FILE_PROVIDER_PATHS"
  1408.         android:resource="@xml/file_paths" />
  1409. </provider>  '更新将下载APK文件并自动安装',<provider
  1410.     android:name="androidx.core.content.FileProvider"
  1411.     android:authorities="${applicationId}.fileprovider"
  1412.     android:exported="false"
  1413.     android:grantUriPermissions="true">
  1414.     <meta-data
  1415.         android:name="android.support.FILE_PROVIDER_PATHS"
  1416.         android:resource="@xml/file_paths" />
  1417. </provider><provider
  1418.     android:name="androidx.core.content.FileProvider"
  1419.     android:authorities="${applicationId}.fileprovider"
  1420.     android:exported="false"
  1421.     android:grantUriPermissions="true">
  1422.     <meta-data
  1423.         android:name="android.support.FILE_PROVIDER_PATHS"
  1424.         android:resource="@xml/file_paths" />
  1425. </provider><provider
  1426.     android:name="androidx.core.content.FileProvider"
  1427.     android:authorities="${applicationId}.fileprovider"
  1428.     android:exported="false"
  1429.     android:grantUriPermissions="true">
  1430.     <meta-data
  1431.         android:name="android.support.FILE_PROVIDER_PATHS"
  1432.         android:resource="@xml/file_paths" />
  1433. </provider><provider
  1434.     android:name="androidx.core.content.FileProvider"
  1435.     android:authorities="${applicationId}.fileprovider"
  1436.     android:exported="false"
  1437.     android:grantUriPermissions="true">
  1438.     <meta-data
  1439.         android:name="android.support.FILE_PROVIDER_PATHS"
  1440.         android:resource="@xml/file_paths" />
  1441. </provider><provider
  1442.     android:name="androidx.core.content.FileProvider"
  1443.     android:authorities="${applicationId}.fileprovider"
  1444.     android:exported="false"
  1445.     android:grantUriPermissions="true">
  1446.     <meta-data
  1447.         android:name="android.support.FILE_PROVIDER_PATHS"
  1448.         android:resource="@xml/file_paths" />
  1449. </provider>  style: TextStyle(<?xml version="1.0" encoding="utf-8"?>
  1450. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  1451. <provider
  1452.     android:name="androidx.core.content.FileProvider"
  1453.     android:authorities="${applicationId}.fileprovider"
  1454.     android:exported="false"
  1455.     android:grantUriPermissions="true">
  1456.     <meta-data
  1457.         android:name="android.support.FILE_PROVIDER_PATHS"
  1458.         android:resource="@xml/file_paths" />
  1459. </provider>
  1460. <provider
  1461.     android:name="androidx.core.content.FileProvider"
  1462.     android:authorities="${applicationId}.fileprovider"
  1463.     android:exported="false"
  1464.     android:grantUriPermissions="true">
  1465.     <meta-data
  1466.         android:name="android.support.FILE_PROVIDER_PATHS"
  1467.         android:resource="@xml/file_paths" />
  1468. </provider><cache-path name="apk_cache" path="apk/" />
  1469. <provider
  1470.     android:name="androidx.core.content.FileProvider"
  1471.     android:authorities="${applicationId}.fileprovider"
  1472.     android:exported="false"
  1473.     android:grantUriPermissions="true">
  1474.     <meta-data
  1475.         android:name="android.support.FILE_PROVIDER_PATHS"
  1476.         android:resource="@xml/file_paths" />
  1477. </provider>
  1478. <provider
  1479.     android:name="androidx.core.content.FileProvider"
  1480.     android:authorities="${applicationId}.fileprovider"
  1481.     android:exported="false"
  1482.     android:grantUriPermissions="true">
  1483.     <meta-data
  1484.         android:name="android.support.FILE_PROVIDER_PATHS"
  1485.         android:resource="@xml/file_paths" />
  1486. </provider><cache-path name="all_cache" path="." />
  1487. <provider
  1488.     android:name="androidx.core.content.FileProvider"
  1489.     android:authorities="${applicationId}.fileprovider"
  1490.     android:exported="false"
  1491.     android:grantUriPermissions="true">
  1492.     <meta-data
  1493.         android:name="android.support.FILE_PROVIDER_PATHS"
  1494.         android:resource="@xml/file_paths" />
  1495. </provider>
  1496. <provider
  1497.     android:name="androidx.core.content.FileProvider"
  1498.     android:authorities="${applicationId}.fileprovider"
  1499.     android:exported="false"
  1500.     android:grantUriPermissions="true">
  1501.     <meta-data
  1502.         android:name="android.support.FILE_PROVIDER_PATHS"
  1503.         android:resource="@xml/file_paths" />
  1504. </provider><external-files-path name="external_app_files" path="." />
  1505. </paths>fontSize: 13,<?xml version="1.0" encoding="utf-8"?>
  1506. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  1507. <provider
  1508.     android:name="androidx.core.content.FileProvider"
  1509.     android:authorities="${applicationId}.fileprovider"
  1510.     android:exported="false"
  1511.     android:grantUriPermissions="true">
  1512.     <meta-data
  1513.         android:name="android.support.FILE_PROVIDER_PATHS"
  1514.         android:resource="@xml/file_paths" />
  1515. </provider>
  1516. <provider
  1517.     android:name="androidx.core.content.FileProvider"
  1518.     android:authorities="${applicationId}.fileprovider"
  1519.     android:exported="false"
  1520.     android:grantUriPermissions="true">
  1521.     <meta-data
  1522.         android:name="android.support.FILE_PROVIDER_PATHS"
  1523.         android:resource="@xml/file_paths" />
  1524. </provider><cache-path name="apk_cache" path="apk/" />
  1525. <provider
  1526.     android:name="androidx.core.content.FileProvider"
  1527.     android:authorities="${applicationId}.fileprovider"
  1528.     android:exported="false"
  1529.     android:grantUriPermissions="true">
  1530.     <meta-data
  1531.         android:name="android.support.FILE_PROVIDER_PATHS"
  1532.         android:resource="@xml/file_paths" />
  1533. </provider>
  1534. <provider
  1535.     android:name="androidx.core.content.FileProvider"
  1536.     android:authorities="${applicationId}.fileprovider"
  1537.     android:exported="false"
  1538.     android:grantUriPermissions="true">
  1539.     <meta-data
  1540.         android:name="android.support.FILE_PROVIDER_PATHS"
  1541.         android:resource="@xml/file_paths" />
  1542. </provider><cache-path name="all_cache" path="." />
  1543. <provider
  1544.     android:name="androidx.core.content.FileProvider"
  1545.     android:authorities="${applicationId}.fileprovider"
  1546.     android:exported="false"
  1547.     android:grantUriPermissions="true">
  1548.     <meta-data
  1549.         android:name="android.support.FILE_PROVIDER_PATHS"
  1550.         android:resource="@xml/file_paths" />
  1551. </provider>
  1552. <provider
  1553.     android:name="androidx.core.content.FileProvider"
  1554.     android:authorities="${applicationId}.fileprovider"
  1555.     android:exported="false"
  1556.     android:grantUriPermissions="true">
  1557.     <meta-data
  1558.         android:name="android.support.FILE_PROVIDER_PATHS"
  1559.         android:resource="@xml/file_paths" />
  1560. </provider><external-files-path name="external_app_files" path="." />
  1561. </paths>color: Colors.blue[700],<provider
  1562.     android:name="androidx.core.content.FileProvider"
  1563.     android:authorities="${applicationId}.fileprovider"
  1564.     android:exported="false"
  1565.     android:grantUriPermissions="true">
  1566.     <meta-data
  1567.         android:name="android.support.FILE_PROVIDER_PATHS"
  1568.         android:resource="@xml/file_paths" />
  1569. </provider><provider
  1570.     android:name="androidx.core.content.FileProvider"
  1571.     android:authorities="${applicationId}.fileprovider"
  1572.     android:exported="false"
  1573.     android:grantUriPermissions="true">
  1574.     <meta-data
  1575.         android:name="android.support.FILE_PROVIDER_PATHS"
  1576.         android:resource="@xml/file_paths" />
  1577. </provider><provider
  1578.     android:name="androidx.core.content.FileProvider"
  1579.     android:authorities="${applicationId}.fileprovider"
  1580.     android:exported="false"
  1581.     android:grantUriPermissions="true">
  1582.     <meta-data
  1583.         android:name="android.support.FILE_PROVIDER_PATHS"
  1584.         android:resource="@xml/file_paths" />
  1585. </provider><provider
  1586.     android:name="androidx.core.content.FileProvider"
  1587.     android:authorities="${applicationId}.fileprovider"
  1588.     android:exported="false"
  1589.     android:grantUriPermissions="true">
  1590.     <meta-data
  1591.         android:name="android.support.FILE_PROVIDER_PATHS"
  1592.         android:resource="@xml/file_paths" />
  1593. </provider><provider
  1594.     android:name="androidx.core.content.FileProvider"
  1595.     android:authorities="${applicationId}.fileprovider"
  1596.     android:exported="false"
  1597.     android:grantUriPermissions="true">
  1598.     <meta-data
  1599.         android:name="android.support.FILE_PROVIDER_PATHS"
  1600.         android:resource="@xml/file_paths" />
  1601. </provider>  ),<provider
  1602.     android:name="androidx.core.content.FileProvider"
  1603.     android:authorities="${applicationId}.fileprovider"
  1604.     android:exported="false"
  1605.     android:grantUriPermissions="true">
  1606.     <meta-data
  1607.         android:name="android.support.FILE_PROVIDER_PATHS"
  1608.         android:resource="@xml/file_paths" />
  1609. </provider><provider
  1610.     android:name="androidx.core.content.FileProvider"
  1611.     android:authorities="${applicationId}.fileprovider"
  1612.     android:exported="false"
  1613.     android:grantUriPermissions="true">
  1614.     <meta-data
  1615.         android:name="android.support.FILE_PROVIDER_PATHS"
  1616.         android:resource="@xml/file_paths" />
  1617. </provider><provider
  1618.     android:name="androidx.core.content.FileProvider"
  1619.     android:authorities="${applicationId}.fileprovider"
  1620.     android:exported="false"
  1621.     android:grantUriPermissions="true">
  1622.     <meta-data
  1623.         android:name="android.support.FILE_PROVIDER_PATHS"
  1624.         android:resource="@xml/file_paths" />
  1625. </provider><provider
  1626.     android:name="androidx.core.content.FileProvider"
  1627.     android:authorities="${applicationId}.fileprovider"
  1628.     android:exported="false"
  1629.     android:grantUriPermissions="true">
  1630.     <meta-data
  1631.         android:name="android.support.FILE_PROVIDER_PATHS"
  1632.         android:resource="@xml/file_paths" />
  1633. </provider><provider
  1634.     android:name="androidx.core.content.FileProvider"
  1635.     android:authorities="${applicationId}.fileprovider"
  1636.     android:exported="false"
  1637.     android:grantUriPermissions="true">
  1638.     <meta-data
  1639.         android:name="android.support.FILE_PROVIDER_PATHS"
  1640.         android:resource="@xml/file_paths" />
  1641. </provider>),<provider
  1642.     android:name="androidx.core.content.FileProvider"
  1643.     android:authorities="${applicationId}.fileprovider"
  1644.     android:exported="false"
  1645.     android:grantUriPermissions="true">
  1646.     <meta-data
  1647.         android:name="android.support.FILE_PROVIDER_PATHS"
  1648.         android:resource="@xml/file_paths" />
  1649. </provider><provider
  1650.     android:name="androidx.core.content.FileProvider"
  1651.     android:authorities="${applicationId}.fileprovider"
  1652.     android:exported="false"
  1653.     android:grantUriPermissions="true">
  1654.     <meta-data
  1655.         android:name="android.support.FILE_PROVIDER_PATHS"
  1656.         android:resource="@xml/file_paths" />
  1657. </provider><provider
  1658.     android:name="androidx.core.content.FileProvider"
  1659.     android:authorities="${applicationId}.fileprovider"
  1660.     android:exported="false"
  1661.     android:grantUriPermissions="true">
  1662.     <meta-data
  1663.         android:name="android.support.FILE_PROVIDER_PATHS"
  1664.         android:resource="@xml/file_paths" />
  1665. </provider><provider
  1666.     android:name="androidx.core.content.FileProvider"
  1667.     android:authorities="${applicationId}.fileprovider"
  1668.     android:exported="false"
  1669.     android:grantUriPermissions="true">
  1670.     <meta-data
  1671.         android:name="android.support.FILE_PROVIDER_PATHS"
  1672.         android:resource="@xml/file_paths" />
  1673. </provider>  ),<provider
  1674.     android:name="androidx.core.content.FileProvider"
  1675.     android:authorities="${applicationId}.fileprovider"
  1676.     android:exported="false"
  1677.     android:grantUriPermissions="true">
  1678.     <meta-data
  1679.         android:name="android.support.FILE_PROVIDER_PATHS"
  1680.         android:resource="@xml/file_paths" />
  1681. </provider><provider
  1682.     android:name="androidx.core.content.FileProvider"
  1683.     android:authorities="${applicationId}.fileprovider"
  1684.     android:exported="false"
  1685.     android:grantUriPermissions="true">
  1686.     <meta-data
  1687.         android:name="android.support.FILE_PROVIDER_PATHS"
  1688.         android:resource="@xml/file_paths" />
  1689. </provider><provider
  1690.     android:name="androidx.core.content.FileProvider"
  1691.     android:authorities="${applicationId}.fileprovider"
  1692.     android:exported="false"
  1693.     android:grantUriPermissions="true">
  1694.     <meta-data
  1695.         android:name="android.support.FILE_PROVIDER_PATHS"
  1696.         android:resource="@xml/file_paths" />
  1697. </provider><provider
  1698.     android:name="androidx.core.content.FileProvider"
  1699.     android:authorities="${applicationId}.fileprovider"
  1700.     android:exported="false"
  1701.     android:grantUriPermissions="true">
  1702.     <meta-data
  1703.         android:name="android.support.FILE_PROVIDER_PATHS"
  1704.         android:resource="@xml/file_paths" />
  1705. </provider>],<provider
  1706.     android:name="androidx.core.content.FileProvider"
  1707.     android:authorities="${applicationId}.fileprovider"
  1708.     android:exported="false"
  1709.     android:grantUriPermissions="true">
  1710.     <meta-data
  1711.         android:name="android.support.FILE_PROVIDER_PATHS"
  1712.         android:resource="@xml/file_paths" />
  1713. </provider><provider
  1714.     android:name="androidx.core.content.FileProvider"
  1715.     android:authorities="${applicationId}.fileprovider"
  1716.     android:exported="false"
  1717.     android:grantUriPermissions="true">
  1718.     <meta-data
  1719.         android:name="android.support.FILE_PROVIDER_PATHS"
  1720.         android:resource="@xml/file_paths" />
  1721. </provider><provider
  1722.     android:name="androidx.core.content.FileProvider"
  1723.     android:authorities="${applicationId}.fileprovider"
  1724.     android:exported="false"
  1725.     android:grantUriPermissions="true">
  1726.     <meta-data
  1727.         android:name="android.support.FILE_PROVIDER_PATHS"
  1728.         android:resource="@xml/file_paths" />
  1729. </provider>  ),<provider
  1730.     android:name="androidx.core.content.FileProvider"
  1731.     android:authorities="${applicationId}.fileprovider"
  1732.     android:exported="false"
  1733.     android:grantUriPermissions="true">
  1734.     <meta-data
  1735.         android:name="android.support.FILE_PROVIDER_PATHS"
  1736.         android:resource="@xml/file_paths" />
  1737. </provider><provider
  1738.     android:name="androidx.core.content.FileProvider"
  1739.     android:authorities="${applicationId}.fileprovider"
  1740.     android:exported="false"
  1741.     android:grantUriPermissions="true">
  1742.     <meta-data
  1743.         android:name="android.support.FILE_PROVIDER_PATHS"
  1744.         android:resource="@xml/file_paths" />
  1745. </provider><provider
  1746.     android:name="androidx.core.content.FileProvider"
  1747.     android:authorities="${applicationId}.fileprovider"
  1748.     android:exported="false"
  1749.     android:grantUriPermissions="true">
  1750.     <meta-data
  1751.         android:name="android.support.FILE_PROVIDER_PATHS"
  1752.         android:resource="@xml/file_paths" />
  1753. </provider>),<provider
  1754.     android:name="androidx.core.content.FileProvider"
  1755.     android:authorities="${applicationId}.fileprovider"
  1756.     android:exported="false"
  1757.     android:grantUriPermissions="true">
  1758.     <meta-data
  1759.         android:name="android.support.FILE_PROVIDER_PATHS"
  1760.         android:resource="@xml/file_paths" />
  1761. </provider><provider
  1762.     android:name="androidx.core.content.FileProvider"
  1763.     android:authorities="${applicationId}.fileprovider"
  1764.     android:exported="false"
  1765.     android:grantUriPermissions="true">
  1766.     <meta-data
  1767.         android:name="android.support.FILE_PROVIDER_PATHS"
  1768.         android:resource="@xml/file_paths" />
  1769. </provider>  ],<provider
  1770.     android:name="androidx.core.content.FileProvider"
  1771.     android:authorities="${applicationId}.fileprovider"
  1772.     android:exported="false"
  1773.     android:grantUriPermissions="true">
  1774.     <meta-data
  1775.         android:name="android.support.FILE_PROVIDER_PATHS"
  1776.         android:resource="@xml/file_paths" />
  1777. </provider><provider
  1778.     android:name="androidx.core.content.FileProvider"
  1779.     android:authorities="${applicationId}.fileprovider"
  1780.     android:exported="false"
  1781.     android:grantUriPermissions="true">
  1782.     <meta-data
  1783.         android:name="android.support.FILE_PROVIDER_PATHS"
  1784.         android:resource="@xml/file_paths" />
  1785. </provider>),<provider
  1786.     android:name="androidx.core.content.FileProvider"
  1787.     android:authorities="${applicationId}.fileprovider"
  1788.     android:exported="false"
  1789.     android:grantUriPermissions="true">
  1790.     <meta-data
  1791.         android:name="android.support.FILE_PROVIDER_PATHS"
  1792.         android:resource="@xml/file_paths" />
  1793. </provider>  ),<provider
  1794.     android:name="androidx.core.content.FileProvider"
  1795.     android:authorities="${applicationId}.fileprovider"
  1796.     android:exported="false"
  1797.     android:grantUriPermissions="true">
  1798.     <meta-data
  1799.         android:name="android.support.FILE_PROVIDER_PATHS"
  1800.         android:resource="@xml/file_paths" />
  1801. </provider>  actions: [<provider
  1802.     android:name="androidx.core.content.FileProvider"
  1803.     android:authorities="${applicationId}.fileprovider"
  1804.     android:exported="false"
  1805.     android:grantUriPermissions="true">
  1806.     <meta-data
  1807.         android:name="android.support.FILE_PROVIDER_PATHS"
  1808.         android:resource="@xml/file_paths" />
  1809. </provider><provider
  1810.     android:name="androidx.core.content.FileProvider"
  1811.     android:authorities="${applicationId}.fileprovider"
  1812.     android:exported="false"
  1813.     android:grantUriPermissions="true">
  1814.     <meta-data
  1815.         android:name="android.support.FILE_PROVIDER_PATHS"
  1816.         android:resource="@xml/file_paths" />
  1817. </provider>if (!isForced) ...[<provider
  1818.     android:name="androidx.core.content.FileProvider"
  1819.     android:authorities="${applicationId}.fileprovider"
  1820.     android:exported="false"
  1821.     android:grantUriPermissions="true">
  1822.     <meta-data
  1823.         android:name="android.support.FILE_PROVIDER_PATHS"
  1824.         android:resource="@xml/file_paths" />
  1825. </provider><provider
  1826.     android:name="androidx.core.content.FileProvider"
  1827.     android:authorities="${applicationId}.fileprovider"
  1828.     android:exported="false"
  1829.     android:grantUriPermissions="true">
  1830.     <meta-data
  1831.         android:name="android.support.FILE_PROVIDER_PATHS"
  1832.         android:resource="@xml/file_paths" />
  1833. </provider>  OutlinedButton(<provider
  1834.     android:name="androidx.core.content.FileProvider"
  1835.     android:authorities="${applicationId}.fileprovider"
  1836.     android:exported="false"
  1837.     android:grantUriPermissions="true">
  1838.     <meta-data
  1839.         android:name="android.support.FILE_PROVIDER_PATHS"
  1840.         android:resource="@xml/file_paths" />
  1841. </provider><provider
  1842.     android:name="androidx.core.content.FileProvider"
  1843.     android:authorities="${applicationId}.fileprovider"
  1844.     android:exported="false"
  1845.     android:grantUriPermissions="true">
  1846.     <meta-data
  1847.         android:name="android.support.FILE_PROVIDER_PATHS"
  1848.         android:resource="@xml/file_paths" />
  1849. </provider><provider
  1850.     android:name="androidx.core.content.FileProvider"
  1851.     android:authorities="${applicationId}.fileprovider"
  1852.     android:exported="false"
  1853.     android:grantUriPermissions="true">
  1854.     <meta-data
  1855.         android:name="android.support.FILE_PROVIDER_PATHS"
  1856.         android:resource="@xml/file_paths" />
  1857. </provider>style: OutlinedButton.styleFrom(<provider
  1858.     android:name="androidx.core.content.FileProvider"
  1859.     android:authorities="${applicationId}.fileprovider"
  1860.     android:exported="false"
  1861.     android:grantUriPermissions="true">
  1862.     <meta-data
  1863.         android:name="android.support.FILE_PROVIDER_PATHS"
  1864.         android:resource="@xml/file_paths" />
  1865. </provider><provider
  1866.     android:name="androidx.core.content.FileProvider"
  1867.     android:authorities="${applicationId}.fileprovider"
  1868.     android:exported="false"
  1869.     android:grantUriPermissions="true">
  1870.     <meta-data
  1871.         android:name="android.support.FILE_PROVIDER_PATHS"
  1872.         android:resource="@xml/file_paths" />
  1873. </provider><provider
  1874.     android:name="androidx.core.content.FileProvider"
  1875.     android:authorities="${applicationId}.fileprovider"
  1876.     android:exported="false"
  1877.     android:grantUriPermissions="true">
  1878.     <meta-data
  1879.         android:name="android.support.FILE_PROVIDER_PATHS"
  1880.         android:resource="@xml/file_paths" />
  1881. </provider>  foregroundColor: Theme.of(context).primaryColor,<provider
  1882.     android:name="androidx.core.content.FileProvider"
  1883.     android:authorities="${applicationId}.fileprovider"
  1884.     android:exported="false"
  1885.     android:grantUriPermissions="true">
  1886.     <meta-data
  1887.         android:name="android.support.FILE_PROVIDER_PATHS"
  1888.         android:resource="@xml/file_paths" />
  1889. </provider><provider
  1890.     android:name="androidx.core.content.FileProvider"
  1891.     android:authorities="${applicationId}.fileprovider"
  1892.     android:exported="false"
  1893.     android:grantUriPermissions="true">
  1894.     <meta-data
  1895.         android:name="android.support.FILE_PROVIDER_PATHS"
  1896.         android:resource="@xml/file_paths" />
  1897. </provider><provider
  1898.     android:name="androidx.core.content.FileProvider"
  1899.     android:authorities="${applicationId}.fileprovider"
  1900.     android:exported="false"
  1901.     android:grantUriPermissions="true">
  1902.     <meta-data
  1903.         android:name="android.support.FILE_PROVIDER_PATHS"
  1904.         android:resource="@xml/file_paths" />
  1905. </provider>),<provider
  1906.     android:name="androidx.core.content.FileProvider"
  1907.     android:authorities="${applicationId}.fileprovider"
  1908.     android:exported="false"
  1909.     android:grantUriPermissions="true">
  1910.     <meta-data
  1911.         android:name="android.support.FILE_PROVIDER_PATHS"
  1912.         android:resource="@xml/file_paths" />
  1913. </provider><provider
  1914.     android:name="androidx.core.content.FileProvider"
  1915.     android:authorities="${applicationId}.fileprovider"
  1916.     android:exported="false"
  1917.     android:grantUriPermissions="true">
  1918.     <meta-data
  1919.         android:name="android.support.FILE_PROVIDER_PATHS"
  1920.         android:resource="@xml/file_paths" />
  1921. </provider><provider
  1922.     android:name="androidx.core.content.FileProvider"
  1923.     android:authorities="${applicationId}.fileprovider"
  1924.     android:exported="false"
  1925.     android:grantUriPermissions="true">
  1926.     <meta-data
  1927.         android:name="android.support.FILE_PROVIDER_PATHS"
  1928.         android:resource="@xml/file_paths" />
  1929. </provider>onPressed: () {<provider
  1930.     android:name="androidx.core.content.FileProvider"
  1931.     android:authorities="${applicationId}.fileprovider"
  1932.     android:exported="false"
  1933.     android:grantUriPermissions="true">
  1934.     <meta-data
  1935.         android:name="android.support.FILE_PROVIDER_PATHS"
  1936.         android:resource="@xml/file_paths" />
  1937. </provider><provider
  1938.     android:name="androidx.core.content.FileProvider"
  1939.     android:authorities="${applicationId}.fileprovider"
  1940.     android:exported="false"
  1941.     android:grantUriPermissions="true">
  1942.     <meta-data
  1943.         android:name="android.support.FILE_PROVIDER_PATHS"
  1944.         android:resource="@xml/file_paths" />
  1945. </provider><provider
  1946.     android:name="androidx.core.content.FileProvider"
  1947.     android:authorities="${applicationId}.fileprovider"
  1948.     android:exported="false"
  1949.     android:grantUriPermissions="true">
  1950.     <meta-data
  1951.         android:name="android.support.FILE_PROVIDER_PATHS"
  1952.         android:resource="@xml/file_paths" />
  1953. </provider>  Navigator.of(context).pop(false);<provider
  1954.     android:name="androidx.core.content.FileProvider"
  1955.     android:authorities="${applicationId}.fileprovider"
  1956.     android:exported="false"
  1957.     android:grantUriPermissions="true">
  1958.     <meta-data
  1959.         android:name="android.support.FILE_PROVIDER_PATHS"
  1960.         android:resource="@xml/file_paths" />
  1961. </provider><provider
  1962.     android:name="androidx.core.content.FileProvider"
  1963.     android:authorities="${applicationId}.fileprovider"
  1964.     android:exported="false"
  1965.     android:grantUriPermissions="true">
  1966.     <meta-data
  1967.         android:name="android.support.FILE_PROVIDER_PATHS"
  1968.         android:resource="@xml/file_paths" />
  1969. </provider><provider
  1970.     android:name="androidx.core.content.FileProvider"
  1971.     android:authorities="${applicationId}.fileprovider"
  1972.     android:exported="false"
  1973.     android:grantUriPermissions="true">
  1974.     <meta-data
  1975.         android:name="android.support.FILE_PROVIDER_PATHS"
  1976.         android:resource="@xml/file_paths" />
  1977. </provider>  onLaterPressed?.call();<provider
  1978.     android:name="androidx.core.content.FileProvider"
  1979.     android:authorities="${applicationId}.fileprovider"
  1980.     android:exported="false"
  1981.     android:grantUriPermissions="true">
  1982.     <meta-data
  1983.         android:name="android.support.FILE_PROVIDER_PATHS"
  1984.         android:resource="@xml/file_paths" />
  1985. </provider><provider
  1986.     android:name="androidx.core.content.FileProvider"
  1987.     android:authorities="${applicationId}.fileprovider"
  1988.     android:exported="false"
  1989.     android:grantUriPermissions="true">
  1990.     <meta-data
  1991.         android:name="android.support.FILE_PROVIDER_PATHS"
  1992.         android:resource="@xml/file_paths" />
  1993. </provider><provider
  1994.     android:name="androidx.core.content.FileProvider"
  1995.     android:authorities="${applicationId}.fileprovider"
  1996.     android:exported="false"
  1997.     android:grantUriPermissions="true">
  1998.     <meta-data
  1999.         android:name="android.support.FILE_PROVIDER_PATHS"
  2000.         android:resource="@xml/file_paths" />
  2001. </provider>},<provider
  2002.     android:name="androidx.core.content.FileProvider"
  2003.     android:authorities="${applicationId}.fileprovider"
  2004.     android:exported="false"
  2005.     android:grantUriPermissions="true">
  2006.     <meta-data
  2007.         android:name="android.support.FILE_PROVIDER_PATHS"
  2008.         android:resource="@xml/file_paths" />
  2009. </provider><provider
  2010.     android:name="androidx.core.content.FileProvider"
  2011.     android:authorities="${applicationId}.fileprovider"
  2012.     android:exported="false"
  2013.     android:grantUriPermissions="true">
  2014.     <meta-data
  2015.         android:name="android.support.FILE_PROVIDER_PATHS"
  2016.         android:resource="@xml/file_paths" />
  2017. </provider><provider
  2018.     android:name="androidx.core.content.FileProvider"
  2019.     android:authorities="${applicationId}.fileprovider"
  2020.     android:exported="false"
  2021.     android:grantUriPermissions="true">
  2022.     <meta-data
  2023.         android:name="android.support.FILE_PROVIDER_PATHS"
  2024.         android:resource="@xml/file_paths" />
  2025. </provider>child: const Text('稍后更新'),<provider
  2026.     android:name="androidx.core.content.FileProvider"
  2027.     android:authorities="${applicationId}.fileprovider"
  2028.     android:exported="false"
  2029.     android:grantUriPermissions="true">
  2030.     <meta-data
  2031.         android:name="android.support.FILE_PROVIDER_PATHS"
  2032.         android:resource="@xml/file_paths" />
  2033. </provider><provider
  2034.     android:name="androidx.core.content.FileProvider"
  2035.     android:authorities="${applicationId}.fileprovider"
  2036.     android:exported="false"
  2037.     android:grantUriPermissions="true">
  2038.     <meta-data
  2039.         android:name="android.support.FILE_PROVIDER_PATHS"
  2040.         android:resource="@xml/file_paths" />
  2041. </provider>  ),<provider
  2042.     android:name="androidx.core.content.FileProvider"
  2043.     android:authorities="${applicationId}.fileprovider"
  2044.     android:exported="false"
  2045.     android:grantUriPermissions="true">
  2046.     <meta-data
  2047.         android:name="android.support.FILE_PROVIDER_PATHS"
  2048.         android:resource="@xml/file_paths" />
  2049. </provider><provider
  2050.     android:name="androidx.core.content.FileProvider"
  2051.     android:authorities="${applicationId}.fileprovider"
  2052.     android:exported="false"
  2053.     android:grantUriPermissions="true">
  2054.     <meta-data
  2055.         android:name="android.support.FILE_PROVIDER_PATHS"
  2056.         android:resource="@xml/file_paths" />
  2057. </provider>],<provider
  2058.     android:name="androidx.core.content.FileProvider"
  2059.     android:authorities="${applicationId}.fileprovider"
  2060.     android:exported="false"
  2061.     android:grantUriPermissions="true">
  2062.     <meta-data
  2063.         android:name="android.support.FILE_PROVIDER_PATHS"
  2064.         android:resource="@xml/file_paths" />
  2065. </provider><provider
  2066.     android:name="androidx.core.content.FileProvider"
  2067.     android:authorities="${applicationId}.fileprovider"
  2068.     android:exported="false"
  2069.     android:grantUriPermissions="true">
  2070.     <meta-data
  2071.         android:name="android.support.FILE_PROVIDER_PATHS"
  2072.         android:resource="@xml/file_paths" />
  2073. </provider>ElevatedButton(<provider
  2074.     android:name="androidx.core.content.FileProvider"
  2075.     android:authorities="${applicationId}.fileprovider"
  2076.     android:exported="false"
  2077.     android:grantUriPermissions="true">
  2078.     <meta-data
  2079.         android:name="android.support.FILE_PROVIDER_PATHS"
  2080.         android:resource="@xml/file_paths" />
  2081. </provider><provider
  2082.     android:name="androidx.core.content.FileProvider"
  2083.     android:authorities="${applicationId}.fileprovider"
  2084.     android:exported="false"
  2085.     android:grantUriPermissions="true">
  2086.     <meta-data
  2087.         android:name="android.support.FILE_PROVIDER_PATHS"
  2088.         android:resource="@xml/file_paths" />
  2089. </provider>  onPressed: () => Navigator.of(context).pop(true),<provider
  2090.     android:name="androidx.core.content.FileProvider"
  2091.     android:authorities="${applicationId}.fileprovider"
  2092.     android:exported="false"
  2093.     android:grantUriPermissions="true">
  2094.     <meta-data
  2095.         android:name="android.support.FILE_PROVIDER_PATHS"
  2096.         android:resource="@xml/file_paths" />
  2097. </provider><provider
  2098.     android:name="androidx.core.content.FileProvider"
  2099.     android:authorities="${applicationId}.fileprovider"
  2100.     android:exported="false"
  2101.     android:grantUriPermissions="true">
  2102.     <meta-data
  2103.         android:name="android.support.FILE_PROVIDER_PATHS"
  2104.         android:resource="@xml/file_paths" />
  2105. </provider>  child: const Text('立即更新'),<provider
  2106.     android:name="androidx.core.content.FileProvider"
  2107.     android:authorities="${applicationId}.fileprovider"
  2108.     android:exported="false"
  2109.     android:grantUriPermissions="true">
  2110.     <meta-data
  2111.         android:name="android.support.FILE_PROVIDER_PATHS"
  2112.         android:resource="@xml/file_paths" />
  2113. </provider><provider
  2114.     android:name="androidx.core.content.FileProvider"
  2115.     android:authorities="${applicationId}.fileprovider"
  2116.     android:exported="false"
  2117.     android:grantUriPermissions="true">
  2118.     <meta-data
  2119.         android:name="android.support.FILE_PROVIDER_PATHS"
  2120.         android:resource="@xml/file_paths" />
  2121. </provider>),<provider
  2122.     android:name="androidx.core.content.FileProvider"
  2123.     android:authorities="${applicationId}.fileprovider"
  2124.     android:exported="false"
  2125.     android:grantUriPermissions="true">
  2126.     <meta-data
  2127.         android:name="android.support.FILE_PROVIDER_PATHS"
  2128.         android:resource="@xml/file_paths" />
  2129. </provider>  ],<provider
  2130.     android:name="androidx.core.content.FileProvider"
  2131.     android:authorities="${applicationId}.fileprovider"
  2132.     android:exported="false"
  2133.     android:grantUriPermissions="true">
  2134.     <meta-data
  2135.         android:name="android.support.FILE_PROVIDER_PATHS"
  2136.         android:resource="@xml/file_paths" />
  2137. </provider>),  );  if (shouldUpdate == true && context.mounted) {<provider
  2138.     android:name="androidx.core.content.FileProvider"
  2139.     android:authorities="${applicationId}.fileprovider"
  2140.     android:exported="false"
  2141.     android:grantUriPermissions="true">
  2142.     <meta-data
  2143.         android:name="android.support.FILE_PROVIDER_PATHS"
  2144.         android:resource="@xml/file_paths" />
  2145. </provider>// 开始下载和安装<provider
  2146.     android:name="androidx.core.content.FileProvider"
  2147.     android:authorities="${applicationId}.fileprovider"
  2148.     android:exported="false"
  2149.     android:grantUriPermissions="true">
  2150.     <meta-data
  2151.         android:name="android.support.FILE_PROVIDER_PATHS"
  2152.         android:resource="@xml/file_paths" />
  2153. </provider>await downloadAndInstallUpdate(<provider
  2154.     android:name="androidx.core.content.FileProvider"
  2155.     android:authorities="${applicationId}.fileprovider"
  2156.     android:exported="false"
  2157.     android:grantUriPermissions="true">
  2158.     <meta-data
  2159.         android:name="android.support.FILE_PROVIDER_PATHS"
  2160.         android:resource="@xml/file_paths" />
  2161. </provider>  context,<provider
  2162.     android:name="androidx.core.content.FileProvider"
  2163.     android:authorities="${applicationId}.fileprovider"
  2164.     android:exported="false"
  2165.     android:grantUriPermissions="true">
  2166.     <meta-data
  2167.         android:name="android.support.FILE_PROVIDER_PATHS"
  2168.         android:resource="@xml/file_paths" />
  2169. </provider>  result.downloadUrl!,<provider
  2170.     android:name="androidx.core.content.FileProvider"
  2171.     android:authorities="${applicationId}.fileprovider"
  2172.     android:exported="false"
  2173.     android:grantUriPermissions="true">
  2174.     <meta-data
  2175.         android:name="android.support.FILE_PROVIDER_PATHS"
  2176.         android:resource="@xml/file_paths" />
  2177. </provider>  onProgress: onProgress,<provider
  2178.     android:name="androidx.core.content.FileProvider"
  2179.     android:authorities="${applicationId}.fileprovider"
  2180.     android:exported="false"
  2181.     android:grantUriPermissions="true">
  2182.     <meta-data
  2183.         android:name="android.support.FILE_PROVIDER_PATHS"
  2184.         android:resource="@xml/file_paths" />
  2185. </provider>);  }}String _formatPublishTime(DateTime publishTime) {  final now = DateTime.now();  final difference = now.difference(publishTime);  if (difference.inDays > 0) {<provider
  2186.     android:name="androidx.core.content.FileProvider"
  2187.     android:authorities="${applicationId}.fileprovider"
  2188.     android:exported="false"
  2189.     android:grantUriPermissions="true">
  2190.     <meta-data
  2191.         android:name="android.support.FILE_PROVIDER_PATHS"
  2192.         android:resource="@xml/file_paths" />
  2193. </provider>return '${difference.inDays}天前';  } else if (difference.inHours > 0) {<provider
  2194.     android:name="androidx.core.content.FileProvider"
  2195.     android:authorities="${applicationId}.fileprovider"
  2196.     android:exported="false"
  2197.     android:grantUriPermissions="true">
  2198.     <meta-data
  2199.         android:name="android.support.FILE_PROVIDER_PATHS"
  2200.         android:resource="@xml/file_paths" />
  2201. </provider>return '${difference.inHours}小时前';  } else if (difference.inMinutes > 0) {<provider
  2202.     android:name="androidx.core.content.FileProvider"
  2203.     android:authorities="${applicationId}.fileprovider"
  2204.     android:exported="false"
  2205.     android:grantUriPermissions="true">
  2206.     <meta-data
  2207.         android:name="android.support.FILE_PROVIDER_PATHS"
  2208.         android:resource="@xml/file_paths" />
  2209. </provider>return '${difference.inMinutes}分钟前';  } else {<provider
  2210.     android:name="androidx.core.content.FileProvider"
  2211.     android:authorities="${applicationId}.fileprovider"
  2212.     android:exported="false"
  2213.     android:grantUriPermissions="true">
  2214.     <meta-data
  2215.         android:name="android.support.FILE_PROVIDER_PATHS"
  2216.         android:resource="@xml/file_paths" />
  2217. </provider>return '刚刚';  }}
复制代码
下载进度通知
  1. /// 显示下载进度通知static Future _showProgressNotification(  int progress, {  bool indeterminate = false,}) async {  try {<provider
  2.     android:name="androidx.core.content.FileProvider"
  3.     android:authorities="${applicationId}.fileprovider"
  4.     android:exported="false"
  5.     android:grantUriPermissions="true">
  6.     <meta-data
  7.         android:name="android.support.FILE_PROVIDER_PATHS"
  8.         android:resource="@xml/file_paths" />
  9. </provider>const androidDetails = AndroidNotificationDetails(<provider
  10.     android:name="androidx.core.content.FileProvider"
  11.     android:authorities="${applicationId}.fileprovider"
  12.     android:exported="false"
  13.     android:grantUriPermissions="true">
  14.     <meta-data
  15.         android:name="android.support.FILE_PROVIDER_PATHS"
  16.         android:resource="@xml/file_paths" />
  17. </provider>  'download_channel',<provider
  18.     android:name="androidx.core.content.FileProvider"
  19.     android:authorities="${applicationId}.fileprovider"
  20.     android:exported="false"
  21.     android:grantUriPermissions="true">
  22.     <meta-data
  23.         android:name="android.support.FILE_PROVIDER_PATHS"
  24.         android:resource="@xml/file_paths" />
  25. </provider>  '下载进度',<provider
  26.     android:name="androidx.core.content.FileProvider"
  27.     android:authorities="${applicationId}.fileprovider"
  28.     android:exported="false"
  29.     android:grantUriPermissions="true">
  30.     <meta-data
  31.         android:name="android.support.FILE_PROVIDER_PATHS"
  32.         android:resource="@xml/file_paths" />
  33. </provider>  channelDescription: '显示应用更新下载进度',<provider
  34.     android:name="androidx.core.content.FileProvider"
  35.     android:authorities="${applicationId}.fileprovider"
  36.     android:exported="false"
  37.     android:grantUriPermissions="true">
  38.     <meta-data
  39.         android:name="android.support.FILE_PROVIDER_PATHS"
  40.         android:resource="@xml/file_paths" />
  41. </provider>  importance: Importance.low,<provider
  42.     android:name="androidx.core.content.FileProvider"
  43.     android:authorities="${applicationId}.fileprovider"
  44.     android:exported="false"
  45.     android:grantUriPermissions="true">
  46.     <meta-data
  47.         android:name="android.support.FILE_PROVIDER_PATHS"
  48.         android:resource="@xml/file_paths" />
  49. </provider>  priority: Priority.low,<provider
  50.     android:name="androidx.core.content.FileProvider"
  51.     android:authorities="${applicationId}.fileprovider"
  52.     android:exported="false"
  53.     android:grantUriPermissions="true">
  54.     <meta-data
  55.         android:name="android.support.FILE_PROVIDER_PATHS"
  56.         android:resource="@xml/file_paths" />
  57. </provider>  showProgress: true,<provider
  58.     android:name="androidx.core.content.FileProvider"
  59.     android:authorities="${applicationId}.fileprovider"
  60.     android:exported="false"
  61.     android:grantUriPermissions="true">
  62.     <meta-data
  63.         android:name="android.support.FILE_PROVIDER_PATHS"
  64.         android:resource="@xml/file_paths" />
  65. </provider>  maxProgress: 100,<provider
  66.     android:name="androidx.core.content.FileProvider"
  67.     android:authorities="${applicationId}.fileprovider"
  68.     android:exported="false"
  69.     android:grantUriPermissions="true">
  70.     <meta-data
  71.         android:name="android.support.FILE_PROVIDER_PATHS"
  72.         android:resource="@xml/file_paths" />
  73. </provider>  progress: 0,<provider
  74.     android:name="androidx.core.content.FileProvider"
  75.     android:authorities="${applicationId}.fileprovider"
  76.     android:exported="false"
  77.     android:grantUriPermissions="true">
  78.     <meta-data
  79.         android:name="android.support.FILE_PROVIDER_PATHS"
  80.         android:resource="@xml/file_paths" />
  81. </provider>  indeterminate: false,<provider
  82.     android:name="androidx.core.content.FileProvider"
  83.     android:authorities="${applicationId}.fileprovider"
  84.     android:exported="false"
  85.     android:grantUriPermissions="true">
  86.     <meta-data
  87.         android:name="android.support.FILE_PROVIDER_PATHS"
  88.         android:resource="@xml/file_paths" />
  89. </provider>  ongoing: true,<provider
  90.     android:name="androidx.core.content.FileProvider"
  91.     android:authorities="${applicationId}.fileprovider"
  92.     android:exported="false"
  93.     android:grantUriPermissions="true">
  94.     <meta-data
  95.         android:name="android.support.FILE_PROVIDER_PATHS"
  96.         android:resource="@xml/file_paths" />
  97. </provider>  autoCancel: false,<provider
  98.     android:name="androidx.core.content.FileProvider"
  99.     android:authorities="${applicationId}.fileprovider"
  100.     android:exported="false"
  101.     android:grantUriPermissions="true">
  102.     <meta-data
  103.         android:name="android.support.FILE_PROVIDER_PATHS"
  104.         android:resource="@xml/file_paths" />
  105. </provider>);<provider
  106.     android:name="androidx.core.content.FileProvider"
  107.     android:authorities="${applicationId}.fileprovider"
  108.     android:exported="false"
  109.     android:grantUriPermissions="true">
  110.     <meta-data
  111.         android:name="android.support.FILE_PROVIDER_PATHS"
  112.         android:resource="@xml/file_paths" />
  113. </provider>const notificationDetails = NotificationDetails(android: androidDetails);<provider
  114.     android:name="androidx.core.content.FileProvider"
  115.     android:authorities="${applicationId}.fileprovider"
  116.     android:exported="false"
  117.     android:grantUriPermissions="true">
  118.     <meta-data
  119.         android:name="android.support.FILE_PROVIDER_PATHS"
  120.         android:resource="@xml/file_paths" />
  121. </provider>await _notificationsPlugin.show(<provider
  122.     android:name="androidx.core.content.FileProvider"
  123.     android:authorities="${applicationId}.fileprovider"
  124.     android:exported="false"
  125.     android:grantUriPermissions="true">
  126.     <meta-data
  127.         android:name="android.support.FILE_PROVIDER_PATHS"
  128.         android:resource="@xml/file_paths" />
  129. </provider>  _downloadNotificationId,<provider
  130.     android:name="androidx.core.content.FileProvider"
  131.     android:authorities="${applicationId}.fileprovider"
  132.     android:exported="false"
  133.     android:grantUriPermissions="true">
  134.     <meta-data
  135.         android:name="android.support.FILE_PROVIDER_PATHS"
  136.         android:resource="@xml/file_paths" />
  137. </provider>  '蜜蜂记账更新',<provider
  138.     android:name="androidx.core.content.FileProvider"
  139.     android:authorities="${applicationId}.fileprovider"
  140.     android:exported="false"
  141.     android:grantUriPermissions="true">
  142.     <meta-data
  143.         android:name="android.support.FILE_PROVIDER_PATHS"
  144.         android:resource="@xml/file_paths" />
  145. </provider>  indeterminate ? '准备下载...' : '下载进度: $progress%',<provider
  146.     android:name="androidx.core.content.FileProvider"
  147.     android:authorities="${applicationId}.fileprovider"
  148.     android:exported="false"
  149.     android:grantUriPermissions="true">
  150.     <meta-data
  151.         android:name="android.support.FILE_PROVIDER_PATHS"
  152.         android:resource="@xml/file_paths" />
  153. </provider>  notificationDetails.copyWith(<provider
  154.     android:name="androidx.core.content.FileProvider"
  155.     android:authorities="${applicationId}.fileprovider"
  156.     android:exported="false"
  157.     android:grantUriPermissions="true">
  158.     <meta-data
  159.         android:name="android.support.FILE_PROVIDER_PATHS"
  160.         android:resource="@xml/file_paths" />
  161. </provider><provider
  162.     android:name="androidx.core.content.FileProvider"
  163.     android:authorities="${applicationId}.fileprovider"
  164.     android:exported="false"
  165.     android:grantUriPermissions="true">
  166.     <meta-data
  167.         android:name="android.support.FILE_PROVIDER_PATHS"
  168.         android:resource="@xml/file_paths" />
  169. </provider>android: androidDetails.copyWith(<provider
  170.     android:name="androidx.core.content.FileProvider"
  171.     android:authorities="${applicationId}.fileprovider"
  172.     android:exported="false"
  173.     android:grantUriPermissions="true">
  174.     <meta-data
  175.         android:name="android.support.FILE_PROVIDER_PATHS"
  176.         android:resource="@xml/file_paths" />
  177. </provider><provider
  178.     android:name="androidx.core.content.FileProvider"
  179.     android:authorities="${applicationId}.fileprovider"
  180.     android:exported="false"
  181.     android:grantUriPermissions="true">
  182.     <meta-data
  183.         android:name="android.support.FILE_PROVIDER_PATHS"
  184.         android:resource="@xml/file_paths" />
  185. </provider>  progress: progress,<provider
  186.     android:name="androidx.core.content.FileProvider"
  187.     android:authorities="${applicationId}.fileprovider"
  188.     android:exported="false"
  189.     android:grantUriPermissions="true">
  190.     <meta-data
  191.         android:name="android.support.FILE_PROVIDER_PATHS"
  192.         android:resource="@xml/file_paths" />
  193. </provider><provider
  194.     android:name="androidx.core.content.FileProvider"
  195.     android:authorities="${applicationId}.fileprovider"
  196.     android:exported="false"
  197.     android:grantUriPermissions="true">
  198.     <meta-data
  199.         android:name="android.support.FILE_PROVIDER_PATHS"
  200.         android:resource="@xml/file_paths" />
  201. </provider>  indeterminate: indeterminate,<provider
  202.     android:name="androidx.core.content.FileProvider"
  203.     android:authorities="${applicationId}.fileprovider"
  204.     android:exported="false"
  205.     android:grantUriPermissions="true">
  206.     <meta-data
  207.         android:name="android.support.FILE_PROVIDER_PATHS"
  208.         android:resource="@xml/file_paths" />
  209. </provider><provider
  210.     android:name="androidx.core.content.FileProvider"
  211.     android:authorities="${applicationId}.fileprovider"
  212.     android:exported="false"
  213.     android:grantUriPermissions="true">
  214.     <meta-data
  215.         android:name="android.support.FILE_PROVIDER_PATHS"
  216.         android:resource="@xml/file_paths" />
  217. </provider>),<provider
  218.     android:name="androidx.core.content.FileProvider"
  219.     android:authorities="${applicationId}.fileprovider"
  220.     android:exported="false"
  221.     android:grantUriPermissions="true">
  222.     <meta-data
  223.         android:name="android.support.FILE_PROVIDER_PATHS"
  224.         android:resource="@xml/file_paths" />
  225. </provider>  ),<provider
  226.     android:name="androidx.core.content.FileProvider"
  227.     android:authorities="${applicationId}.fileprovider"
  228.     android:exported="false"
  229.     android:grantUriPermissions="true">
  230.     <meta-data
  231.         android:name="android.support.FILE_PROVIDER_PATHS"
  232.         android:resource="@xml/file_paths" />
  233. </provider>);  } catch (e) {<provider
  234.     android:name="androidx.core.content.FileProvider"
  235.     android:authorities="${applicationId}.fileprovider"
  236.     android:exported="false"
  237.     android:grantUriPermissions="true">
  238.     <meta-data
  239.         android:name="android.support.FILE_PROVIDER_PATHS"
  240.         android:resource="@xml/file_paths" />
  241. </provider>logE('UpdateService', '显示进度通知失败', e);  }}/// 显示下载完成通知static Future _showDownloadCompleteNotification(String filePath) async {  try {<provider
  242.     android:name="androidx.core.content.FileProvider"
  243.     android:authorities="${applicationId}.fileprovider"
  244.     android:exported="false"
  245.     android:grantUriPermissions="true">
  246.     <meta-data
  247.         android:name="android.support.FILE_PROVIDER_PATHS"
  248.         android:resource="@xml/file_paths" />
  249. </provider>const androidDetails = AndroidNotificationDetails(<provider
  250.     android:name="androidx.core.content.FileProvider"
  251.     android:authorities="${applicationId}.fileprovider"
  252.     android:exported="false"
  253.     android:grantUriPermissions="true">
  254.     <meta-data
  255.         android:name="android.support.FILE_PROVIDER_PATHS"
  256.         android:resource="@xml/file_paths" />
  257. </provider>  'download_channel',<provider
  258.     android:name="androidx.core.content.FileProvider"
  259.     android:authorities="${applicationId}.fileprovider"
  260.     android:exported="false"
  261.     android:grantUriPermissions="true">
  262.     <meta-data
  263.         android:name="android.support.FILE_PROVIDER_PATHS"
  264.         android:resource="@xml/file_paths" />
  265. </provider>  '下载完成',<provider
  266.     android:name="androidx.core.content.FileProvider"
  267.     android:authorities="${applicationId}.fileprovider"
  268.     android:exported="false"
  269.     android:grantUriPermissions="true">
  270.     <meta-data
  271.         android:name="android.support.FILE_PROVIDER_PATHS"
  272.         android:resource="@xml/file_paths" />
  273. </provider>  channelDescription: '显示应用更新下载完成',<provider
  274.     android:name="androidx.core.content.FileProvider"
  275.     android:authorities="${applicationId}.fileprovider"
  276.     android:exported="false"
  277.     android:grantUriPermissions="true">
  278.     <meta-data
  279.         android:name="android.support.FILE_PROVIDER_PATHS"
  280.         android:resource="@xml/file_paths" />
  281. </provider>  importance: Importance.high,<provider
  282.     android:name="androidx.core.content.FileProvider"
  283.     android:authorities="${applicationId}.fileprovider"
  284.     android:exported="false"
  285.     android:grantUriPermissions="true">
  286.     <meta-data
  287.         android:name="android.support.FILE_PROVIDER_PATHS"
  288.         android:resource="@xml/file_paths" />
  289. </provider>  priority: Priority.high,<provider
  290.     android:name="androidx.core.content.FileProvider"
  291.     android:authorities="${applicationId}.fileprovider"
  292.     android:exported="false"
  293.     android:grantUriPermissions="true">
  294.     <meta-data
  295.         android:name="android.support.FILE_PROVIDER_PATHS"
  296.         android:resource="@xml/file_paths" />
  297. </provider>  autoCancel: true,<provider
  298.     android:name="androidx.core.content.FileProvider"
  299.     android:authorities="${applicationId}.fileprovider"
  300.     android:exported="false"
  301.     android:grantUriPermissions="true">
  302.     <meta-data
  303.         android:name="android.support.FILE_PROVIDER_PATHS"
  304.         android:resource="@xml/file_paths" />
  305. </provider>);<provider
  306.     android:name="androidx.core.content.FileProvider"
  307.     android:authorities="${applicationId}.fileprovider"
  308.     android:exported="false"
  309.     android:grantUriPermissions="true">
  310.     <meta-data
  311.         android:name="android.support.FILE_PROVIDER_PATHS"
  312.         android:resource="@xml/file_paths" />
  313. </provider>const notificationDetails = NotificationDetails(android: androidDetails);<provider
  314.     android:name="androidx.core.content.FileProvider"
  315.     android:authorities="${applicationId}.fileprovider"
  316.     android:exported="false"
  317.     android:grantUriPermissions="true">
  318.     <meta-data
  319.         android:name="android.support.FILE_PROVIDER_PATHS"
  320.         android:resource="@xml/file_paths" />
  321. </provider>await _notificationsPlugin.show(<provider
  322.     android:name="androidx.core.content.FileProvider"
  323.     android:authorities="${applicationId}.fileprovider"
  324.     android:exported="false"
  325.     android:grantUriPermissions="true">
  326.     <meta-data
  327.         android:name="android.support.FILE_PROVIDER_PATHS"
  328.         android:resource="@xml/file_paths" />
  329. </provider>  _downloadNotificationId,<provider
  330.     android:name="androidx.core.content.FileProvider"
  331.     android:authorities="${applicationId}.fileprovider"
  332.     android:exported="false"
  333.     android:grantUriPermissions="true">
  334.     <meta-data
  335.         android:name="android.support.FILE_PROVIDER_PATHS"
  336.         android:resource="@xml/file_paths" />
  337. </provider>  '蜜蜂记账更新',<provider
  338.     android:name="androidx.core.content.FileProvider"
  339.     android:authorities="${applicationId}.fileprovider"
  340.     android:exported="false"
  341.     android:grantUriPermissions="true">
  342.     <meta-data
  343.         android:name="android.support.FILE_PROVIDER_PATHS"
  344.         android:resource="@xml/file_paths" />
  345. </provider>  '下载完成,点击安装',<provider
  346.     android:name="androidx.core.content.FileProvider"
  347.     android:authorities="${applicationId}.fileprovider"
  348.     android:exported="false"
  349.     android:grantUriPermissions="true">
  350.     <meta-data
  351.         android:name="android.support.FILE_PROVIDER_PATHS"
  352.         android:resource="@xml/file_paths" />
  353. </provider>  notificationDetails,<provider
  354.     android:name="androidx.core.content.FileProvider"
  355.     android:authorities="${applicationId}.fileprovider"
  356.     android:exported="false"
  357.     android:grantUriPermissions="true">
  358.     <meta-data
  359.         android:name="android.support.FILE_PROVIDER_PATHS"
  360.         android:resource="@xml/file_paths" />
  361. </provider>);  } catch (e) {<provider
  362.     android:name="androidx.core.content.FileProvider"
  363.     android:authorities="${applicationId}.fileprovider"
  364.     android:exported="false"
  365.     android:grantUriPermissions="true">
  366.     <meta-data
  367.         android:name="android.support.FILE_PROVIDER_PATHS"
  368.         android:resource="@xml/file_paths" />
  369. </provider>logE('UpdateService', '显示完成通知失败', e);  }}
复制代码
错误处理和用户体验

网络异常处理
  1. /// 网络重试机制class NetworkOptimizer {  static const int maxRetries = 3;  static const Duration retryDelay = Duration(seconds: 2);  static Future withRetry(Future Function() operation) async {<provider
  2.     android:name="androidx.core.content.FileProvider"
  3.     android:authorities="${applicationId}.fileprovider"
  4.     android:exported="false"
  5.     android:grantUriPermissions="true">
  6.     <meta-data
  7.         android:name="android.support.FILE_PROVIDER_PATHS"
  8.         android:resource="@xml/file_paths" />
  9. </provider>int attempts = 0;<provider
  10.     android:name="androidx.core.content.FileProvider"
  11.     android:authorities="${applicationId}.fileprovider"
  12.     android:exported="false"
  13.     android:grantUriPermissions="true">
  14.     <meta-data
  15.         android:name="android.support.FILE_PROVIDER_PATHS"
  16.         android:resource="@xml/file_paths" />
  17. </provider>while (attempts < maxRetries) {<provider
  18.     android:name="androidx.core.content.FileProvider"
  19.     android:authorities="${applicationId}.fileprovider"
  20.     android:exported="false"
  21.     android:grantUriPermissions="true">
  22.     <meta-data
  23.         android:name="android.support.FILE_PROVIDER_PATHS"
  24.         android:resource="@xml/file_paths" />
  25. </provider>  try {<provider
  26.     android:name="androidx.core.content.FileProvider"
  27.     android:authorities="${applicationId}.fileprovider"
  28.     android:exported="false"
  29.     android:grantUriPermissions="true">
  30.     <meta-data
  31.         android:name="android.support.FILE_PROVIDER_PATHS"
  32.         android:resource="@xml/file_paths" />
  33. </provider><provider
  34.     android:name="androidx.core.content.FileProvider"
  35.     android:authorities="${applicationId}.fileprovider"
  36.     android:exported="false"
  37.     android:grantUriPermissions="true">
  38.     <meta-data
  39.         android:name="android.support.FILE_PROVIDER_PATHS"
  40.         android:resource="@xml/file_paths" />
  41. </provider>return await operation();<provider
  42.     android:name="androidx.core.content.FileProvider"
  43.     android:authorities="${applicationId}.fileprovider"
  44.     android:exported="false"
  45.     android:grantUriPermissions="true">
  46.     <meta-data
  47.         android:name="android.support.FILE_PROVIDER_PATHS"
  48.         android:resource="@xml/file_paths" />
  49. </provider>  } catch (e) {<provider
  50.     android:name="androidx.core.content.FileProvider"
  51.     android:authorities="${applicationId}.fileprovider"
  52.     android:exported="false"
  53.     android:grantUriPermissions="true">
  54.     <meta-data
  55.         android:name="android.support.FILE_PROVIDER_PATHS"
  56.         android:resource="@xml/file_paths" />
  57. </provider><provider
  58.     android:name="androidx.core.content.FileProvider"
  59.     android:authorities="${applicationId}.fileprovider"
  60.     android:exported="false"
  61.     android:grantUriPermissions="true">
  62.     <meta-data
  63.         android:name="android.support.FILE_PROVIDER_PATHS"
  64.         android:resource="@xml/file_paths" />
  65. </provider>attempts++;<provider
  66.     android:name="androidx.core.content.FileProvider"
  67.     android:authorities="${applicationId}.fileprovider"
  68.     android:exported="false"
  69.     android:grantUriPermissions="true">
  70.     <meta-data
  71.         android:name="android.support.FILE_PROVIDER_PATHS"
  72.         android:resource="@xml/file_paths" />
  73. </provider><provider
  74.     android:name="androidx.core.content.FileProvider"
  75.     android:authorities="${applicationId}.fileprovider"
  76.     android:exported="false"
  77.     android:grantUriPermissions="true">
  78.     <meta-data
  79.         android:name="android.support.FILE_PROVIDER_PATHS"
  80.         android:resource="@xml/file_paths" />
  81. </provider>if (attempts >= maxRetries) {<provider
  82.     android:name="androidx.core.content.FileProvider"
  83.     android:authorities="${applicationId}.fileprovider"
  84.     android:exported="false"
  85.     android:grantUriPermissions="true">
  86.     <meta-data
  87.         android:name="android.support.FILE_PROVIDER_PATHS"
  88.         android:resource="@xml/file_paths" />
  89. </provider><provider
  90.     android:name="androidx.core.content.FileProvider"
  91.     android:authorities="${applicationId}.fileprovider"
  92.     android:exported="false"
  93.     android:grantUriPermissions="true">
  94.     <meta-data
  95.         android:name="android.support.FILE_PROVIDER_PATHS"
  96.         android:resource="@xml/file_paths" />
  97. </provider>  rethrow;<provider
  98.     android:name="androidx.core.content.FileProvider"
  99.     android:authorities="${applicationId}.fileprovider"
  100.     android:exported="false"
  101.     android:grantUriPermissions="true">
  102.     <meta-data
  103.         android:name="android.support.FILE_PROVIDER_PATHS"
  104.         android:resource="@xml/file_paths" />
  105. </provider><provider
  106.     android:name="androidx.core.content.FileProvider"
  107.     android:authorities="${applicationId}.fileprovider"
  108.     android:exported="false"
  109.     android:grantUriPermissions="true">
  110.     <meta-data
  111.         android:name="android.support.FILE_PROVIDER_PATHS"
  112.         android:resource="@xml/file_paths" />
  113. </provider>}<provider
  114.     android:name="androidx.core.content.FileProvider"
  115.     android:authorities="${applicationId}.fileprovider"
  116.     android:exported="false"
  117.     android:grantUriPermissions="true">
  118.     <meta-data
  119.         android:name="android.support.FILE_PROVIDER_PATHS"
  120.         android:resource="@xml/file_paths" />
  121. </provider><provider
  122.     android:name="androidx.core.content.FileProvider"
  123.     android:authorities="${applicationId}.fileprovider"
  124.     android:exported="false"
  125.     android:grantUriPermissions="true">
  126.     <meta-data
  127.         android:name="android.support.FILE_PROVIDER_PATHS"
  128.         android:resource="@xml/file_paths" />
  129. </provider>// 指数退避<provider
  130.     android:name="androidx.core.content.FileProvider"
  131.     android:authorities="${applicationId}.fileprovider"
  132.     android:exported="false"
  133.     android:grantUriPermissions="true">
  134.     <meta-data
  135.         android:name="android.support.FILE_PROVIDER_PATHS"
  136.         android:resource="@xml/file_paths" />
  137. </provider><provider
  138.     android:name="androidx.core.content.FileProvider"
  139.     android:authorities="${applicationId}.fileprovider"
  140.     android:exported="false"
  141.     android:grantUriPermissions="true">
  142.     <meta-data
  143.         android:name="android.support.FILE_PROVIDER_PATHS"
  144.         android:resource="@xml/file_paths" />
  145. </provider>await Future.delayed(retryDelay * (1  AlertDialog(<provider
  146.     android:name="androidx.core.content.FileProvider"
  147.     android:authorities="${applicationId}.fileprovider"
  148.     android:exported="false"
  149.     android:grantUriPermissions="true">
  150.     <meta-data
  151.         android:name="android.support.FILE_PROVIDER_PATHS"
  152.         android:resource="@xml/file_paths" />
  153. </provider>  title: Row(<provider
  154.     android:name="androidx.core.content.FileProvider"
  155.     android:authorities="${applicationId}.fileprovider"
  156.     android:exported="false"
  157.     android:grantUriPermissions="true">
  158.     <meta-data
  159.         android:name="android.support.FILE_PROVIDER_PATHS"
  160.         android:resource="@xml/file_paths" />
  161. </provider><provider
  162.     android:name="androidx.core.content.FileProvider"
  163.     android:authorities="${applicationId}.fileprovider"
  164.     android:exported="false"
  165.     android:grantUriPermissions="true">
  166.     <meta-data
  167.         android:name="android.support.FILE_PROVIDER_PATHS"
  168.         android:resource="@xml/file_paths" />
  169. </provider>children: [<provider
  170.     android:name="androidx.core.content.FileProvider"
  171.     android:authorities="${applicationId}.fileprovider"
  172.     android:exported="false"
  173.     android:grantUriPermissions="true">
  174.     <meta-data
  175.         android:name="android.support.FILE_PROVIDER_PATHS"
  176.         android:resource="@xml/file_paths" />
  177. </provider><provider
  178.     android:name="androidx.core.content.FileProvider"
  179.     android:authorities="${applicationId}.fileprovider"
  180.     android:exported="false"
  181.     android:grantUriPermissions="true">
  182.     <meta-data
  183.         android:name="android.support.FILE_PROVIDER_PATHS"
  184.         android:resource="@xml/file_paths" />
  185. </provider>  const Icon(Icons.error_outline, color: Colors.orange, size: 28),<provider
  186.     android:name="androidx.core.content.FileProvider"
  187.     android:authorities="${applicationId}.fileprovider"
  188.     android:exported="false"
  189.     android:grantUriPermissions="true">
  190.     <meta-data
  191.         android:name="android.support.FILE_PROVIDER_PATHS"
  192.         android:resource="@xml/file_paths" />
  193. </provider><provider
  194.     android:name="androidx.core.content.FileProvider"
  195.     android:authorities="${applicationId}.fileprovider"
  196.     android:exported="false"
  197.     android:grantUriPermissions="true">
  198.     <meta-data
  199.         android:name="android.support.FILE_PROVIDER_PATHS"
  200.         android:resource="@xml/file_paths" />
  201. </provider>  const SizedBox(width: 12),<provider
  202.     android:name="androidx.core.content.FileProvider"
  203.     android:authorities="${applicationId}.fileprovider"
  204.     android:exported="false"
  205.     android:grantUriPermissions="true">
  206.     <meta-data
  207.         android:name="android.support.FILE_PROVIDER_PATHS"
  208.         android:resource="@xml/file_paths" />
  209. </provider><provider
  210.     android:name="androidx.core.content.FileProvider"
  211.     android:authorities="${applicationId}.fileprovider"
  212.     android:exported="false"
  213.     android:grantUriPermissions="true">
  214.     <meta-data
  215.         android:name="android.support.FILE_PROVIDER_PATHS"
  216.         android:resource="@xml/file_paths" />
  217. </provider>  const Text('下载失败'),<provider
  218.     android:name="androidx.core.content.FileProvider"
  219.     android:authorities="${applicationId}.fileprovider"
  220.     android:exported="false"
  221.     android:grantUriPermissions="true">
  222.     <meta-data
  223.         android:name="android.support.FILE_PROVIDER_PATHS"
  224.         android:resource="@xml/file_paths" />
  225. </provider><provider
  226.     android:name="androidx.core.content.FileProvider"
  227.     android:authorities="${applicationId}.fileprovider"
  228.     android:exported="false"
  229.     android:grantUriPermissions="true">
  230.     <meta-data
  231.         android:name="android.support.FILE_PROVIDER_PATHS"
  232.         android:resource="@xml/file_paths" />
  233. </provider>],<provider
  234.     android:name="androidx.core.content.FileProvider"
  235.     android:authorities="${applicationId}.fileprovider"
  236.     android:exported="false"
  237.     android:grantUriPermissions="true">
  238.     <meta-data
  239.         android:name="android.support.FILE_PROVIDER_PATHS"
  240.         android:resource="@xml/file_paths" />
  241. </provider>  ),<provider
  242.     android:name="androidx.core.content.FileProvider"
  243.     android:authorities="${applicationId}.fileprovider"
  244.     android:exported="false"
  245.     android:grantUriPermissions="true">
  246.     <meta-data
  247.         android:name="android.support.FILE_PROVIDER_PATHS"
  248.         android:resource="@xml/file_paths" />
  249. </provider>  content: Column(<provider
  250.     android:name="androidx.core.content.FileProvider"
  251.     android:authorities="${applicationId}.fileprovider"
  252.     android:exported="false"
  253.     android:grantUriPermissions="true">
  254.     <meta-data
  255.         android:name="android.support.FILE_PROVIDER_PATHS"
  256.         android:resource="@xml/file_paths" />
  257. </provider><provider
  258.     android:name="androidx.core.content.FileProvider"
  259.     android:authorities="${applicationId}.fileprovider"
  260.     android:exported="false"
  261.     android:grantUriPermissions="true">
  262.     <meta-data
  263.         android:name="android.support.FILE_PROVIDER_PATHS"
  264.         android:resource="@xml/file_paths" />
  265. </provider>mainAxisSize: MainAxisSize.min,<provider
  266.     android:name="androidx.core.content.FileProvider"
  267.     android:authorities="${applicationId}.fileprovider"
  268.     android:exported="false"
  269.     android:grantUriPermissions="true">
  270.     <meta-data
  271.         android:name="android.support.FILE_PROVIDER_PATHS"
  272.         android:resource="@xml/file_paths" />
  273. </provider><provider
  274.     android:name="androidx.core.content.FileProvider"
  275.     android:authorities="${applicationId}.fileprovider"
  276.     android:exported="false"
  277.     android:grantUriPermissions="true">
  278.     <meta-data
  279.         android:name="android.support.FILE_PROVIDER_PATHS"
  280.         android:resource="@xml/file_paths" />
  281. </provider>crossAxisAlignment: CrossAxisAlignment.start,<provider
  282.     android:name="androidx.core.content.FileProvider"
  283.     android:authorities="${applicationId}.fileprovider"
  284.     android:exported="false"
  285.     android:grantUriPermissions="true">
  286.     <meta-data
  287.         android:name="android.support.FILE_PROVIDER_PATHS"
  288.         android:resource="@xml/file_paths" />
  289. </provider><provider
  290.     android:name="androidx.core.content.FileProvider"
  291.     android:authorities="${applicationId}.fileprovider"
  292.     android:exported="false"
  293.     android:grantUriPermissions="true">
  294.     <meta-data
  295.         android:name="android.support.FILE_PROVIDER_PATHS"
  296.         android:resource="@xml/file_paths" />
  297. </provider>children: [<provider
  298.     android:name="androidx.core.content.FileProvider"
  299.     android:authorities="${applicationId}.fileprovider"
  300.     android:exported="false"
  301.     android:grantUriPermissions="true">
  302.     <meta-data
  303.         android:name="android.support.FILE_PROVIDER_PATHS"
  304.         android:resource="@xml/file_paths" />
  305. </provider><provider
  306.     android:name="androidx.core.content.FileProvider"
  307.     android:authorities="${applicationId}.fileprovider"
  308.     android:exported="false"
  309.     android:grantUriPermissions="true">
  310.     <meta-data
  311.         android:name="android.support.FILE_PROVIDER_PATHS"
  312.         android:resource="@xml/file_paths" />
  313. </provider>  Text(<provider
  314.     android:name="androidx.core.content.FileProvider"
  315.     android:authorities="${applicationId}.fileprovider"
  316.     android:exported="false"
  317.     android:grantUriPermissions="true">
  318.     <meta-data
  319.         android:name="android.support.FILE_PROVIDER_PATHS"
  320.         android:resource="@xml/file_paths" />
  321. </provider><provider
  322.     android:name="androidx.core.content.FileProvider"
  323.     android:authorities="${applicationId}.fileprovider"
  324.     android:exported="false"
  325.     android:grantUriPermissions="true">
  326.     <meta-data
  327.         android:name="android.support.FILE_PROVIDER_PATHS"
  328.         android:resource="@xml/file_paths" />
  329. </provider><provider
  330.     android:name="androidx.core.content.FileProvider"
  331.     android:authorities="${applicationId}.fileprovider"
  332.     android:exported="false"
  333.     android:grantUriPermissions="true">
  334.     <meta-data
  335.         android:name="android.support.FILE_PROVIDER_PATHS"
  336.         android:resource="@xml/file_paths" />
  337. </provider>'下载更新文件失败:\n$errorMessage',<provider
  338.     android:name="androidx.core.content.FileProvider"
  339.     android:authorities="${applicationId}.fileprovider"
  340.     android:exported="false"
  341.     android:grantUriPermissions="true">
  342.     <meta-data
  343.         android:name="android.support.FILE_PROVIDER_PATHS"
  344.         android:resource="@xml/file_paths" />
  345. </provider><provider
  346.     android:name="androidx.core.content.FileProvider"
  347.     android:authorities="${applicationId}.fileprovider"
  348.     android:exported="false"
  349.     android:grantUriPermissions="true">
  350.     <meta-data
  351.         android:name="android.support.FILE_PROVIDER_PATHS"
  352.         android:resource="@xml/file_paths" />
  353. </provider><provider
  354.     android:name="androidx.core.content.FileProvider"
  355.     android:authorities="${applicationId}.fileprovider"
  356.     android:exported="false"
  357.     android:grantUriPermissions="true">
  358.     <meta-data
  359.         android:name="android.support.FILE_PROVIDER_PATHS"
  360.         android:resource="@xml/file_paths" />
  361. </provider>style: const TextStyle(fontSize: 16),<provider
  362.     android:name="androidx.core.content.FileProvider"
  363.     android:authorities="${applicationId}.fileprovider"
  364.     android:exported="false"
  365.     android:grantUriPermissions="true">
  366.     <meta-data
  367.         android:name="android.support.FILE_PROVIDER_PATHS"
  368.         android:resource="@xml/file_paths" />
  369. </provider><provider
  370.     android:name="androidx.core.content.FileProvider"
  371.     android:authorities="${applicationId}.fileprovider"
  372.     android:exported="false"
  373.     android:grantUriPermissions="true">
  374.     <meta-data
  375.         android:name="android.support.FILE_PROVIDER_PATHS"
  376.         android:resource="@xml/file_paths" />
  377. </provider>  ),<provider
  378.     android:name="androidx.core.content.FileProvider"
  379.     android:authorities="${applicationId}.fileprovider"
  380.     android:exported="false"
  381.     android:grantUriPermissions="true">
  382.     <meta-data
  383.         android:name="android.support.FILE_PROVIDER_PATHS"
  384.         android:resource="@xml/file_paths" />
  385. </provider><provider
  386.     android:name="androidx.core.content.FileProvider"
  387.     android:authorities="${applicationId}.fileprovider"
  388.     android:exported="false"
  389.     android:grantUriPermissions="true">
  390.     <meta-data
  391.         android:name="android.support.FILE_PROVIDER_PATHS"
  392.         android:resource="@xml/file_paths" />
  393. </provider>  const SizedBox(height: 16),<provider
  394.     android:name="androidx.core.content.FileProvider"
  395.     android:authorities="${applicationId}.fileprovider"
  396.     android:exported="false"
  397.     android:grantUriPermissions="true">
  398.     <meta-data
  399.         android:name="android.support.FILE_PROVIDER_PATHS"
  400.         android:resource="@xml/file_paths" />
  401. </provider><provider
  402.     android:name="androidx.core.content.FileProvider"
  403.     android:authorities="${applicationId}.fileprovider"
  404.     android:exported="false"
  405.     android:grantUriPermissions="true">
  406.     <meta-data
  407.         android:name="android.support.FILE_PROVIDER_PATHS"
  408.         android:resource="@xml/file_paths" />
  409. </provider>  Container(<provider
  410.     android:name="androidx.core.content.FileProvider"
  411.     android:authorities="${applicationId}.fileprovider"
  412.     android:exported="false"
  413.     android:grantUriPermissions="true">
  414.     <meta-data
  415.         android:name="android.support.FILE_PROVIDER_PATHS"
  416.         android:resource="@xml/file_paths" />
  417. </provider><provider
  418.     android:name="androidx.core.content.FileProvider"
  419.     android:authorities="${applicationId}.fileprovider"
  420.     android:exported="false"
  421.     android:grantUriPermissions="true">
  422.     <meta-data
  423.         android:name="android.support.FILE_PROVIDER_PATHS"
  424.         android:resource="@xml/file_paths" />
  425. </provider><provider
  426.     android:name="androidx.core.content.FileProvider"
  427.     android:authorities="${applicationId}.fileprovider"
  428.     android:exported="false"
  429.     android:grantUriPermissions="true">
  430.     <meta-data
  431.         android:name="android.support.FILE_PROVIDER_PATHS"
  432.         android:resource="@xml/file_paths" />
  433. </provider>padding: const EdgeInsets.all(12),<provider
  434.     android:name="androidx.core.content.FileProvider"
  435.     android:authorities="${applicationId}.fileprovider"
  436.     android:exported="false"
  437.     android:grantUriPermissions="true">
  438.     <meta-data
  439.         android:name="android.support.FILE_PROVIDER_PATHS"
  440.         android:resource="@xml/file_paths" />
  441. </provider><provider
  442.     android:name="androidx.core.content.FileProvider"
  443.     android:authorities="${applicationId}.fileprovider"
  444.     android:exported="false"
  445.     android:grantUriPermissions="true">
  446.     <meta-data
  447.         android:name="android.support.FILE_PROVIDER_PATHS"
  448.         android:resource="@xml/file_paths" />
  449. </provider><provider
  450.     android:name="androidx.core.content.FileProvider"
  451.     android:authorities="${applicationId}.fileprovider"
  452.     android:exported="false"
  453.     android:grantUriPermissions="true">
  454.     <meta-data
  455.         android:name="android.support.FILE_PROVIDER_PATHS"
  456.         android:resource="@xml/file_paths" />
  457. </provider>decoration: BoxDecoration(<provider
  458.     android:name="androidx.core.content.FileProvider"
  459.     android:authorities="${applicationId}.fileprovider"
  460.     android:exported="false"
  461.     android:grantUriPermissions="true">
  462.     <meta-data
  463.         android:name="android.support.FILE_PROVIDER_PATHS"
  464.         android:resource="@xml/file_paths" />
  465. </provider><provider
  466.     android:name="androidx.core.content.FileProvider"
  467.     android:authorities="${applicationId}.fileprovider"
  468.     android:exported="false"
  469.     android:grantUriPermissions="true">
  470.     <meta-data
  471.         android:name="android.support.FILE_PROVIDER_PATHS"
  472.         android:resource="@xml/file_paths" />
  473. </provider><provider
  474.     android:name="androidx.core.content.FileProvider"
  475.     android:authorities="${applicationId}.fileprovider"
  476.     android:exported="false"
  477.     android:grantUriPermissions="true">
  478.     <meta-data
  479.         android:name="android.support.FILE_PROVIDER_PATHS"
  480.         android:resource="@xml/file_paths" />
  481. </provider>  color: Colors.blue[50],<provider
  482.     android:name="androidx.core.content.FileProvider"
  483.     android:authorities="${applicationId}.fileprovider"
  484.     android:exported="false"
  485.     android:grantUriPermissions="true">
  486.     <meta-data
  487.         android:name="android.support.FILE_PROVIDER_PATHS"
  488.         android:resource="@xml/file_paths" />
  489. </provider><provider
  490.     android:name="androidx.core.content.FileProvider"
  491.     android:authorities="${applicationId}.fileprovider"
  492.     android:exported="false"
  493.     android:grantUriPermissions="true">
  494.     <meta-data
  495.         android:name="android.support.FILE_PROVIDER_PATHS"
  496.         android:resource="@xml/file_paths" />
  497. </provider><provider
  498.     android:name="androidx.core.content.FileProvider"
  499.     android:authorities="${applicationId}.fileprovider"
  500.     android:exported="false"
  501.     android:grantUriPermissions="true">
  502.     <meta-data
  503.         android:name="android.support.FILE_PROVIDER_PATHS"
  504.         android:resource="@xml/file_paths" />
  505. </provider>  borderRadius: BorderRadius.circular(8),<provider
  506.     android:name="androidx.core.content.FileProvider"
  507.     android:authorities="${applicationId}.fileprovider"
  508.     android:exported="false"
  509.     android:grantUriPermissions="true">
  510.     <meta-data
  511.         android:name="android.support.FILE_PROVIDER_PATHS"
  512.         android:resource="@xml/file_paths" />
  513. </provider><provider
  514.     android:name="androidx.core.content.FileProvider"
  515.     android:authorities="${applicationId}.fileprovider"
  516.     android:exported="false"
  517.     android:grantUriPermissions="true">
  518.     <meta-data
  519.         android:name="android.support.FILE_PROVIDER_PATHS"
  520.         android:resource="@xml/file_paths" />
  521. </provider><provider
  522.     android:name="androidx.core.content.FileProvider"
  523.     android:authorities="${applicationId}.fileprovider"
  524.     android:exported="false"
  525.     android:grantUriPermissions="true">
  526.     <meta-data
  527.         android:name="android.support.FILE_PROVIDER_PATHS"
  528.         android:resource="@xml/file_paths" />
  529. </provider>  border: Border.all(color: Colors.blue[200]!),<provider
  530.     android:name="androidx.core.content.FileProvider"
  531.     android:authorities="${applicationId}.fileprovider"
  532.     android:exported="false"
  533.     android:grantUriPermissions="true">
  534.     <meta-data
  535.         android:name="android.support.FILE_PROVIDER_PATHS"
  536.         android:resource="@xml/file_paths" />
  537. </provider><provider
  538.     android:name="androidx.core.content.FileProvider"
  539.     android:authorities="${applicationId}.fileprovider"
  540.     android:exported="false"
  541.     android:grantUriPermissions="true">
  542.     <meta-data
  543.         android:name="android.support.FILE_PROVIDER_PATHS"
  544.         android:resource="@xml/file_paths" />
  545. </provider><provider
  546.     android:name="androidx.core.content.FileProvider"
  547.     android:authorities="${applicationId}.fileprovider"
  548.     android:exported="false"
  549.     android:grantUriPermissions="true">
  550.     <meta-data
  551.         android:name="android.support.FILE_PROVIDER_PATHS"
  552.         android:resource="@xml/file_paths" />
  553. </provider>),<provider
  554.     android:name="androidx.core.content.FileProvider"
  555.     android:authorities="${applicationId}.fileprovider"
  556.     android:exported="false"
  557.     android:grantUriPermissions="true">
  558.     <meta-data
  559.         android:name="android.support.FILE_PROVIDER_PATHS"
  560.         android:resource="@xml/file_paths" />
  561. </provider><provider
  562.     android:name="androidx.core.content.FileProvider"
  563.     android:authorities="${applicationId}.fileprovider"
  564.     android:exported="false"
  565.     android:grantUriPermissions="true">
  566.     <meta-data
  567.         android:name="android.support.FILE_PROVIDER_PATHS"
  568.         android:resource="@xml/file_paths" />
  569. </provider><provider
  570.     android:name="androidx.core.content.FileProvider"
  571.     android:authorities="${applicationId}.fileprovider"
  572.     android:exported="false"
  573.     android:grantUriPermissions="true">
  574.     <meta-data
  575.         android:name="android.support.FILE_PROVIDER_PATHS"
  576.         android:resource="@xml/file_paths" />
  577. </provider>child: Row(<provider
  578.     android:name="androidx.core.content.FileProvider"
  579.     android:authorities="${applicationId}.fileprovider"
  580.     android:exported="false"
  581.     android:grantUriPermissions="true">
  582.     <meta-data
  583.         android:name="android.support.FILE_PROVIDER_PATHS"
  584.         android:resource="@xml/file_paths" />
  585. </provider><provider
  586.     android:name="androidx.core.content.FileProvider"
  587.     android:authorities="${applicationId}.fileprovider"
  588.     android:exported="false"
  589.     android:grantUriPermissions="true">
  590.     <meta-data
  591.         android:name="android.support.FILE_PROVIDER_PATHS"
  592.         android:resource="@xml/file_paths" />
  593. </provider><provider
  594.     android:name="androidx.core.content.FileProvider"
  595.     android:authorities="${applicationId}.fileprovider"
  596.     android:exported="false"
  597.     android:grantUriPermissions="true">
  598.     <meta-data
  599.         android:name="android.support.FILE_PROVIDER_PATHS"
  600.         android:resource="@xml/file_paths" />
  601. </provider>  crossAxisAlignment: CrossAxisAlignment.start,<provider
  602.     android:name="androidx.core.content.FileProvider"
  603.     android:authorities="${applicationId}.fileprovider"
  604.     android:exported="false"
  605.     android:grantUriPermissions="true">
  606.     <meta-data
  607.         android:name="android.support.FILE_PROVIDER_PATHS"
  608.         android:resource="@xml/file_paths" />
  609. </provider><provider
  610.     android:name="androidx.core.content.FileProvider"
  611.     android:authorities="${applicationId}.fileprovider"
  612.     android:exported="false"
  613.     android:grantUriPermissions="true">
  614.     <meta-data
  615.         android:name="android.support.FILE_PROVIDER_PATHS"
  616.         android:resource="@xml/file_paths" />
  617. </provider><provider
  618.     android:name="androidx.core.content.FileProvider"
  619.     android:authorities="${applicationId}.fileprovider"
  620.     android:exported="false"
  621.     android:grantUriPermissions="true">
  622.     <meta-data
  623.         android:name="android.support.FILE_PROVIDER_PATHS"
  624.         android:resource="@xml/file_paths" />
  625. </provider>  children: [<provider
  626.     android:name="androidx.core.content.FileProvider"
  627.     android:authorities="${applicationId}.fileprovider"
  628.     android:exported="false"
  629.     android:grantUriPermissions="true">
  630.     <meta-data
  631.         android:name="android.support.FILE_PROVIDER_PATHS"
  632.         android:resource="@xml/file_paths" />
  633. </provider><provider
  634.     android:name="androidx.core.content.FileProvider"
  635.     android:authorities="${applicationId}.fileprovider"
  636.     android:exported="false"
  637.     android:grantUriPermissions="true">
  638.     <meta-data
  639.         android:name="android.support.FILE_PROVIDER_PATHS"
  640.         android:resource="@xml/file_paths" />
  641. </provider><provider
  642.     android:name="androidx.core.content.FileProvider"
  643.     android:authorities="${applicationId}.fileprovider"
  644.     android:exported="false"
  645.     android:grantUriPermissions="true">
  646.     <meta-data
  647.         android:name="android.support.FILE_PROVIDER_PATHS"
  648.         android:resource="@xml/file_paths" />
  649. </provider><provider
  650.     android:name="androidx.core.content.FileProvider"
  651.     android:authorities="${applicationId}.fileprovider"
  652.     android:exported="false"
  653.     android:grantUriPermissions="true">
  654.     <meta-data
  655.         android:name="android.support.FILE_PROVIDER_PATHS"
  656.         android:resource="@xml/file_paths" />
  657. </provider>Icon(Icons.lightbulb, color: Colors.blue[700], size: 20),<provider
  658.     android:name="androidx.core.content.FileProvider"
  659.     android:authorities="${applicationId}.fileprovider"
  660.     android:exported="false"
  661.     android:grantUriPermissions="true">
  662.     <meta-data
  663.         android:name="android.support.FILE_PROVIDER_PATHS"
  664.         android:resource="@xml/file_paths" />
  665. </provider><provider
  666.     android:name="androidx.core.content.FileProvider"
  667.     android:authorities="${applicationId}.fileprovider"
  668.     android:exported="false"
  669.     android:grantUriPermissions="true">
  670.     <meta-data
  671.         android:name="android.support.FILE_PROVIDER_PATHS"
  672.         android:resource="@xml/file_paths" />
  673. </provider><provider
  674.     android:name="androidx.core.content.FileProvider"
  675.     android:authorities="${applicationId}.fileprovider"
  676.     android:exported="false"
  677.     android:grantUriPermissions="true">
  678.     <meta-data
  679.         android:name="android.support.FILE_PROVIDER_PATHS"
  680.         android:resource="@xml/file_paths" />
  681. </provider><provider
  682.     android:name="androidx.core.content.FileProvider"
  683.     android:authorities="${applicationId}.fileprovider"
  684.     android:exported="false"
  685.     android:grantUriPermissions="true">
  686.     <meta-data
  687.         android:name="android.support.FILE_PROVIDER_PATHS"
  688.         android:resource="@xml/file_paths" />
  689. </provider>const SizedBox(width: 8),<provider
  690.     android:name="androidx.core.content.FileProvider"
  691.     android:authorities="${applicationId}.fileprovider"
  692.     android:exported="false"
  693.     android:grantUriPermissions="true">
  694.     <meta-data
  695.         android:name="android.support.FILE_PROVIDER_PATHS"
  696.         android:resource="@xml/file_paths" />
  697. </provider><provider
  698.     android:name="androidx.core.content.FileProvider"
  699.     android:authorities="${applicationId}.fileprovider"
  700.     android:exported="false"
  701.     android:grantUriPermissions="true">
  702.     <meta-data
  703.         android:name="android.support.FILE_PROVIDER_PATHS"
  704.         android:resource="@xml/file_paths" />
  705. </provider><provider
  706.     android:name="androidx.core.content.FileProvider"
  707.     android:authorities="${applicationId}.fileprovider"
  708.     android:exported="false"
  709.     android:grantUriPermissions="true">
  710.     <meta-data
  711.         android:name="android.support.FILE_PROVIDER_PATHS"
  712.         android:resource="@xml/file_paths" />
  713. </provider><provider
  714.     android:name="androidx.core.content.FileProvider"
  715.     android:authorities="${applicationId}.fileprovider"
  716.     android:exported="false"
  717.     android:grantUriPermissions="true">
  718.     <meta-data
  719.         android:name="android.support.FILE_PROVIDER_PATHS"
  720.         android:resource="@xml/file_paths" />
  721. </provider>Expanded(<provider
  722.     android:name="androidx.core.content.FileProvider"
  723.     android:authorities="${applicationId}.fileprovider"
  724.     android:exported="false"
  725.     android:grantUriPermissions="true">
  726.     <meta-data
  727.         android:name="android.support.FILE_PROVIDER_PATHS"
  728.         android:resource="@xml/file_paths" />
  729. </provider><provider
  730.     android:name="androidx.core.content.FileProvider"
  731.     android:authorities="${applicationId}.fileprovider"
  732.     android:exported="false"
  733.     android:grantUriPermissions="true">
  734.     <meta-data
  735.         android:name="android.support.FILE_PROVIDER_PATHS"
  736.         android:resource="@xml/file_paths" />
  737. </provider><provider
  738.     android:name="androidx.core.content.FileProvider"
  739.     android:authorities="${applicationId}.fileprovider"
  740.     android:exported="false"
  741.     android:grantUriPermissions="true">
  742.     <meta-data
  743.         android:name="android.support.FILE_PROVIDER_PATHS"
  744.         android:resource="@xml/file_paths" />
  745. </provider><provider
  746.     android:name="androidx.core.content.FileProvider"
  747.     android:authorities="${applicationId}.fileprovider"
  748.     android:exported="false"
  749.     android:grantUriPermissions="true">
  750.     <meta-data
  751.         android:name="android.support.FILE_PROVIDER_PATHS"
  752.         android:resource="@xml/file_paths" />
  753. </provider>  child: Text(<provider
  754.     android:name="androidx.core.content.FileProvider"
  755.     android:authorities="${applicationId}.fileprovider"
  756.     android:exported="false"
  757.     android:grantUriPermissions="true">
  758.     <meta-data
  759.         android:name="android.support.FILE_PROVIDER_PATHS"
  760.         android:resource="@xml/file_paths" />
  761. </provider><provider
  762.     android:name="androidx.core.content.FileProvider"
  763.     android:authorities="${applicationId}.fileprovider"
  764.     android:exported="false"
  765.     android:grantUriPermissions="true">
  766.     <meta-data
  767.         android:name="android.support.FILE_PROVIDER_PATHS"
  768.         android:resource="@xml/file_paths" />
  769. </provider><provider
  770.     android:name="androidx.core.content.FileProvider"
  771.     android:authorities="${applicationId}.fileprovider"
  772.     android:exported="false"
  773.     android:grantUriPermissions="true">
  774.     <meta-data
  775.         android:name="android.support.FILE_PROVIDER_PATHS"
  776.         android:resource="@xml/file_paths" />
  777. </provider><provider
  778.     android:name="androidx.core.content.FileProvider"
  779.     android:authorities="${applicationId}.fileprovider"
  780.     android:exported="false"
  781.     android:grantUriPermissions="true">
  782.     <meta-data
  783.         android:name="android.support.FILE_PROVIDER_PATHS"
  784.         android:resource="@xml/file_paths" />
  785. </provider><provider
  786.     android:name="androidx.core.content.FileProvider"
  787.     android:authorities="${applicationId}.fileprovider"
  788.     android:exported="false"
  789.     android:grantUriPermissions="true">
  790.     <meta-data
  791.         android:name="android.support.FILE_PROVIDER_PATHS"
  792.         android:resource="@xml/file_paths" />
  793. </provider>'您可以手动前往GitHub Releases页面下载最新版本APK文件',<provider
  794.     android:name="androidx.core.content.FileProvider"
  795.     android:authorities="${applicationId}.fileprovider"
  796.     android:exported="false"
  797.     android:grantUriPermissions="true">
  798.     <meta-data
  799.         android:name="android.support.FILE_PROVIDER_PATHS"
  800.         android:resource="@xml/file_paths" />
  801. </provider><provider
  802.     android:name="androidx.core.content.FileProvider"
  803.     android:authorities="${applicationId}.fileprovider"
  804.     android:exported="false"
  805.     android:grantUriPermissions="true">
  806.     <meta-data
  807.         android:name="android.support.FILE_PROVIDER_PATHS"
  808.         android:resource="@xml/file_paths" />
  809. </provider><provider
  810.     android:name="androidx.core.content.FileProvider"
  811.     android:authorities="${applicationId}.fileprovider"
  812.     android:exported="false"
  813.     android:grantUriPermissions="true">
  814.     <meta-data
  815.         android:name="android.support.FILE_PROVIDER_PATHS"
  816.         android:resource="@xml/file_paths" />
  817. </provider><provider
  818.     android:name="androidx.core.content.FileProvider"
  819.     android:authorities="${applicationId}.fileprovider"
  820.     android:exported="false"
  821.     android:grantUriPermissions="true">
  822.     <meta-data
  823.         android:name="android.support.FILE_PROVIDER_PATHS"
  824.         android:resource="@xml/file_paths" />
  825. </provider><provider
  826.     android:name="androidx.core.content.FileProvider"
  827.     android:authorities="${applicationId}.fileprovider"
  828.     android:exported="false"
  829.     android:grantUriPermissions="true">
  830.     <meta-data
  831.         android:name="android.support.FILE_PROVIDER_PATHS"
  832.         android:resource="@xml/file_paths" />
  833. </provider>style: TextStyle(<provider
  834.     android:name="androidx.core.content.FileProvider"
  835.     android:authorities="${applicationId}.fileprovider"
  836.     android:exported="false"
  837.     android:grantUriPermissions="true">
  838.     <meta-data
  839.         android:name="android.support.FILE_PROVIDER_PATHS"
  840.         android:resource="@xml/file_paths" />
  841. </provider><provider
  842.     android:name="androidx.core.content.FileProvider"
  843.     android:authorities="${applicationId}.fileprovider"
  844.     android:exported="false"
  845.     android:grantUriPermissions="true">
  846.     <meta-data
  847.         android:name="android.support.FILE_PROVIDER_PATHS"
  848.         android:resource="@xml/file_paths" />
  849. </provider><provider
  850.     android:name="androidx.core.content.FileProvider"
  851.     android:authorities="${applicationId}.fileprovider"
  852.     android:exported="false"
  853.     android:grantUriPermissions="true">
  854.     <meta-data
  855.         android:name="android.support.FILE_PROVIDER_PATHS"
  856.         android:resource="@xml/file_paths" />
  857. </provider><provider
  858.     android:name="androidx.core.content.FileProvider"
  859.     android:authorities="${applicationId}.fileprovider"
  860.     android:exported="false"
  861.     android:grantUriPermissions="true">
  862.     <meta-data
  863.         android:name="android.support.FILE_PROVIDER_PATHS"
  864.         android:resource="@xml/file_paths" />
  865. </provider><provider
  866.     android:name="androidx.core.content.FileProvider"
  867.     android:authorities="${applicationId}.fileprovider"
  868.     android:exported="false"
  869.     android:grantUriPermissions="true">
  870.     <meta-data
  871.         android:name="android.support.FILE_PROVIDER_PATHS"
  872.         android:resource="@xml/file_paths" />
  873. </provider>  fontSize: 13,<provider
  874.     android:name="androidx.core.content.FileProvider"
  875.     android:authorities="${applicationId}.fileprovider"
  876.     android:exported="false"
  877.     android:grantUriPermissions="true">
  878.     <meta-data
  879.         android:name="android.support.FILE_PROVIDER_PATHS"
  880.         android:resource="@xml/file_paths" />
  881. </provider><provider
  882.     android:name="androidx.core.content.FileProvider"
  883.     android:authorities="${applicationId}.fileprovider"
  884.     android:exported="false"
  885.     android:grantUriPermissions="true">
  886.     <meta-data
  887.         android:name="android.support.FILE_PROVIDER_PATHS"
  888.         android:resource="@xml/file_paths" />
  889. </provider><provider
  890.     android:name="androidx.core.content.FileProvider"
  891.     android:authorities="${applicationId}.fileprovider"
  892.     android:exported="false"
  893.     android:grantUriPermissions="true">
  894.     <meta-data
  895.         android:name="android.support.FILE_PROVIDER_PATHS"
  896.         android:resource="@xml/file_paths" />
  897. </provider><provider
  898.     android:name="androidx.core.content.FileProvider"
  899.     android:authorities="${applicationId}.fileprovider"
  900.     android:exported="false"
  901.     android:grantUriPermissions="true">
  902.     <meta-data
  903.         android:name="android.support.FILE_PROVIDER_PATHS"
  904.         android:resource="@xml/file_paths" />
  905. </provider><provider
  906.     android:name="androidx.core.content.FileProvider"
  907.     android:authorities="${applicationId}.fileprovider"
  908.     android:exported="false"
  909.     android:grantUriPermissions="true">
  910.     <meta-data
  911.         android:name="android.support.FILE_PROVIDER_PATHS"
  912.         android:resource="@xml/file_paths" />
  913. </provider>  color: Colors.blue[700],<provider
  914.     android:name="androidx.core.content.FileProvider"
  915.     android:authorities="${applicationId}.fileprovider"
  916.     android:exported="false"
  917.     android:grantUriPermissions="true">
  918.     <meta-data
  919.         android:name="android.support.FILE_PROVIDER_PATHS"
  920.         android:resource="@xml/file_paths" />
  921. </provider><provider
  922.     android:name="androidx.core.content.FileProvider"
  923.     android:authorities="${applicationId}.fileprovider"
  924.     android:exported="false"
  925.     android:grantUriPermissions="true">
  926.     <meta-data
  927.         android:name="android.support.FILE_PROVIDER_PATHS"
  928.         android:resource="@xml/file_paths" />
  929. </provider><provider
  930.     android:name="androidx.core.content.FileProvider"
  931.     android:authorities="${applicationId}.fileprovider"
  932.     android:exported="false"
  933.     android:grantUriPermissions="true">
  934.     <meta-data
  935.         android:name="android.support.FILE_PROVIDER_PATHS"
  936.         android:resource="@xml/file_paths" />
  937. </provider><provider
  938.     android:name="androidx.core.content.FileProvider"
  939.     android:authorities="${applicationId}.fileprovider"
  940.     android:exported="false"
  941.     android:grantUriPermissions="true">
  942.     <meta-data
  943.         android:name="android.support.FILE_PROVIDER_PATHS"
  944.         android:resource="@xml/file_paths" />
  945. </provider><provider
  946.     android:name="androidx.core.content.FileProvider"
  947.     android:authorities="${applicationId}.fileprovider"
  948.     android:exported="false"
  949.     android:grantUriPermissions="true">
  950.     <meta-data
  951.         android:name="android.support.FILE_PROVIDER_PATHS"
  952.         android:resource="@xml/file_paths" />
  953. </provider>),<provider
  954.     android:name="androidx.core.content.FileProvider"
  955.     android:authorities="${applicationId}.fileprovider"
  956.     android:exported="false"
  957.     android:grantUriPermissions="true">
  958.     <meta-data
  959.         android:name="android.support.FILE_PROVIDER_PATHS"
  960.         android:resource="@xml/file_paths" />
  961. </provider><provider
  962.     android:name="androidx.core.content.FileProvider"
  963.     android:authorities="${applicationId}.fileprovider"
  964.     android:exported="false"
  965.     android:grantUriPermissions="true">
  966.     <meta-data
  967.         android:name="android.support.FILE_PROVIDER_PATHS"
  968.         android:resource="@xml/file_paths" />
  969. </provider><provider
  970.     android:name="androidx.core.content.FileProvider"
  971.     android:authorities="${applicationId}.fileprovider"
  972.     android:exported="false"
  973.     android:grantUriPermissions="true">
  974.     <meta-data
  975.         android:name="android.support.FILE_PROVIDER_PATHS"
  976.         android:resource="@xml/file_paths" />
  977. </provider><provider
  978.     android:name="androidx.core.content.FileProvider"
  979.     android:authorities="${applicationId}.fileprovider"
  980.     android:exported="false"
  981.     android:grantUriPermissions="true">
  982.     <meta-data
  983.         android:name="android.support.FILE_PROVIDER_PATHS"
  984.         android:resource="@xml/file_paths" />
  985. </provider>  ),<provider
  986.     android:name="androidx.core.content.FileProvider"
  987.     android:authorities="${applicationId}.fileprovider"
  988.     android:exported="false"
  989.     android:grantUriPermissions="true">
  990.     <meta-data
  991.         android:name="android.support.FILE_PROVIDER_PATHS"
  992.         android:resource="@xml/file_paths" />
  993. </provider><provider
  994.     android:name="androidx.core.content.FileProvider"
  995.     android:authorities="${applicationId}.fileprovider"
  996.     android:exported="false"
  997.     android:grantUriPermissions="true">
  998.     <meta-data
  999.         android:name="android.support.FILE_PROVIDER_PATHS"
  1000.         android:resource="@xml/file_paths" />
  1001. </provider><provider
  1002.     android:name="androidx.core.content.FileProvider"
  1003.     android:authorities="${applicationId}.fileprovider"
  1004.     android:exported="false"
  1005.     android:grantUriPermissions="true">
  1006.     <meta-data
  1007.         android:name="android.support.FILE_PROVIDER_PATHS"
  1008.         android:resource="@xml/file_paths" />
  1009. </provider><provider
  1010.     android:name="androidx.core.content.FileProvider"
  1011.     android:authorities="${applicationId}.fileprovider"
  1012.     android:exported="false"
  1013.     android:grantUriPermissions="true">
  1014.     <meta-data
  1015.         android:name="android.support.FILE_PROVIDER_PATHS"
  1016.         android:resource="@xml/file_paths" />
  1017. </provider>),<provider
  1018.     android:name="androidx.core.content.FileProvider"
  1019.     android:authorities="${applicationId}.fileprovider"
  1020.     android:exported="false"
  1021.     android:grantUriPermissions="true">
  1022.     <meta-data
  1023.         android:name="android.support.FILE_PROVIDER_PATHS"
  1024.         android:resource="@xml/file_paths" />
  1025. </provider><provider
  1026.     android:name="androidx.core.content.FileProvider"
  1027.     android:authorities="${applicationId}.fileprovider"
  1028.     android:exported="false"
  1029.     android:grantUriPermissions="true">
  1030.     <meta-data
  1031.         android:name="android.support.FILE_PROVIDER_PATHS"
  1032.         android:resource="@xml/file_paths" />
  1033. </provider><provider
  1034.     android:name="androidx.core.content.FileProvider"
  1035.     android:authorities="${applicationId}.fileprovider"
  1036.     android:exported="false"
  1037.     android:grantUriPermissions="true">
  1038.     <meta-data
  1039.         android:name="android.support.FILE_PROVIDER_PATHS"
  1040.         android:resource="@xml/file_paths" />
  1041. </provider>  ],<provider
  1042.     android:name="androidx.core.content.FileProvider"
  1043.     android:authorities="${applicationId}.fileprovider"
  1044.     android:exported="false"
  1045.     android:grantUriPermissions="true">
  1046.     <meta-data
  1047.         android:name="android.support.FILE_PROVIDER_PATHS"
  1048.         android:resource="@xml/file_paths" />
  1049. </provider><provider
  1050.     android:name="androidx.core.content.FileProvider"
  1051.     android:authorities="${applicationId}.fileprovider"
  1052.     android:exported="false"
  1053.     android:grantUriPermissions="true">
  1054.     <meta-data
  1055.         android:name="android.support.FILE_PROVIDER_PATHS"
  1056.         android:resource="@xml/file_paths" />
  1057. </provider><provider
  1058.     android:name="androidx.core.content.FileProvider"
  1059.     android:authorities="${applicationId}.fileprovider"
  1060.     android:exported="false"
  1061.     android:grantUriPermissions="true">
  1062.     <meta-data
  1063.         android:name="android.support.FILE_PROVIDER_PATHS"
  1064.         android:resource="@xml/file_paths" />
  1065. </provider>),<provider
  1066.     android:name="androidx.core.content.FileProvider"
  1067.     android:authorities="${applicationId}.fileprovider"
  1068.     android:exported="false"
  1069.     android:grantUriPermissions="true">
  1070.     <meta-data
  1071.         android:name="android.support.FILE_PROVIDER_PATHS"
  1072.         android:resource="@xml/file_paths" />
  1073. </provider><provider
  1074.     android:name="androidx.core.content.FileProvider"
  1075.     android:authorities="${applicationId}.fileprovider"
  1076.     android:exported="false"
  1077.     android:grantUriPermissions="true">
  1078.     <meta-data
  1079.         android:name="android.support.FILE_PROVIDER_PATHS"
  1080.         android:resource="@xml/file_paths" />
  1081. </provider>  ),<provider
  1082.     android:name="androidx.core.content.FileProvider"
  1083.     android:authorities="${applicationId}.fileprovider"
  1084.     android:exported="false"
  1085.     android:grantUriPermissions="true">
  1086.     <meta-data
  1087.         android:name="android.support.FILE_PROVIDER_PATHS"
  1088.         android:resource="@xml/file_paths" />
  1089. </provider><provider
  1090.     android:name="androidx.core.content.FileProvider"
  1091.     android:authorities="${applicationId}.fileprovider"
  1092.     android:exported="false"
  1093.     android:grantUriPermissions="true">
  1094.     <meta-data
  1095.         android:name="android.support.FILE_PROVIDER_PATHS"
  1096.         android:resource="@xml/file_paths" />
  1097. </provider>],<provider
  1098.     android:name="androidx.core.content.FileProvider"
  1099.     android:authorities="${applicationId}.fileprovider"
  1100.     android:exported="false"
  1101.     android:grantUriPermissions="true">
  1102.     <meta-data
  1103.         android:name="android.support.FILE_PROVIDER_PATHS"
  1104.         android:resource="@xml/file_paths" />
  1105. </provider>  ),<provider
  1106.     android:name="androidx.core.content.FileProvider"
  1107.     android:authorities="${applicationId}.fileprovider"
  1108.     android:exported="false"
  1109.     android:grantUriPermissions="true">
  1110.     <meta-data
  1111.         android:name="android.support.FILE_PROVIDER_PATHS"
  1112.         android:resource="@xml/file_paths" />
  1113. </provider>  actions: [<provider
  1114.     android:name="androidx.core.content.FileProvider"
  1115.     android:authorities="${applicationId}.fileprovider"
  1116.     android:exported="false"
  1117.     android:grantUriPermissions="true">
  1118.     <meta-data
  1119.         android:name="android.support.FILE_PROVIDER_PATHS"
  1120.         android:resource="@xml/file_paths" />
  1121. </provider><provider
  1122.     android:name="androidx.core.content.FileProvider"
  1123.     android:authorities="${applicationId}.fileprovider"
  1124.     android:exported="false"
  1125.     android:grantUriPermissions="true">
  1126.     <meta-data
  1127.         android:name="android.support.FILE_PROVIDER_PATHS"
  1128.         android:resource="@xml/file_paths" />
  1129. </provider>TextButton(<provider
  1130.     android:name="androidx.core.content.FileProvider"
  1131.     android:authorities="${applicationId}.fileprovider"
  1132.     android:exported="false"
  1133.     android:grantUriPermissions="true">
  1134.     <meta-data
  1135.         android:name="android.support.FILE_PROVIDER_PATHS"
  1136.         android:resource="@xml/file_paths" />
  1137. </provider><provider
  1138.     android:name="androidx.core.content.FileProvider"
  1139.     android:authorities="${applicationId}.fileprovider"
  1140.     android:exported="false"
  1141.     android:grantUriPermissions="true">
  1142.     <meta-data
  1143.         android:name="android.support.FILE_PROVIDER_PATHS"
  1144.         android:resource="@xml/file_paths" />
  1145. </provider>  onPressed: () => Navigator.of(context).pop(false),<provider
  1146.     android:name="androidx.core.content.FileProvider"
  1147.     android:authorities="${applicationId}.fileprovider"
  1148.     android:exported="false"
  1149.     android:grantUriPermissions="true">
  1150.     <meta-data
  1151.         android:name="android.support.FILE_PROVIDER_PATHS"
  1152.         android:resource="@xml/file_paths" />
  1153. </provider><provider
  1154.     android:name="androidx.core.content.FileProvider"
  1155.     android:authorities="${applicationId}.fileprovider"
  1156.     android:exported="false"
  1157.     android:grantUriPermissions="true">
  1158.     <meta-data
  1159.         android:name="android.support.FILE_PROVIDER_PATHS"
  1160.         android:resource="@xml/file_paths" />
  1161. </provider>  child: const Text('取消'),<provider
  1162.     android:name="androidx.core.content.FileProvider"
  1163.     android:authorities="${applicationId}.fileprovider"
  1164.     android:exported="false"
  1165.     android:grantUriPermissions="true">
  1166.     <meta-data
  1167.         android:name="android.support.FILE_PROVIDER_PATHS"
  1168.         android:resource="@xml/file_paths" />
  1169. </provider><provider
  1170.     android:name="androidx.core.content.FileProvider"
  1171.     android:authorities="${applicationId}.fileprovider"
  1172.     android:exported="false"
  1173.     android:grantUriPermissions="true">
  1174.     <meta-data
  1175.         android:name="android.support.FILE_PROVIDER_PATHS"
  1176.         android:resource="@xml/file_paths" />
  1177. </provider>),<provider
  1178.     android:name="androidx.core.content.FileProvider"
  1179.     android:authorities="${applicationId}.fileprovider"
  1180.     android:exported="false"
  1181.     android:grantUriPermissions="true">
  1182.     <meta-data
  1183.         android:name="android.support.FILE_PROVIDER_PATHS"
  1184.         android:resource="@xml/file_paths" />
  1185. </provider><provider
  1186.     android:name="androidx.core.content.FileProvider"
  1187.     android:authorities="${applicationId}.fileprovider"
  1188.     android:exported="false"
  1189.     android:grantUriPermissions="true">
  1190.     <meta-data
  1191.         android:name="android.support.FILE_PROVIDER_PATHS"
  1192.         android:resource="@xml/file_paths" />
  1193. </provider>ElevatedButton.icon(<provider
  1194.     android:name="androidx.core.content.FileProvider"
  1195.     android:authorities="${applicationId}.fileprovider"
  1196.     android:exported="false"
  1197.     android:grantUriPermissions="true">
  1198.     <meta-data
  1199.         android:name="android.support.FILE_PROVIDER_PATHS"
  1200.         android:resource="@xml/file_paths" />
  1201. </provider><provider
  1202.     android:name="androidx.core.content.FileProvider"
  1203.     android:authorities="${applicationId}.fileprovider"
  1204.     android:exported="false"
  1205.     android:grantUriPermissions="true">
  1206.     <meta-data
  1207.         android:name="android.support.FILE_PROVIDER_PATHS"
  1208.         android:resource="@xml/file_paths" />
  1209. </provider>  onPressed: () => Navigator.of(context).pop(true),<provider
  1210.     android:name="androidx.core.content.FileProvider"
  1211.     android:authorities="${applicationId}.fileprovider"
  1212.     android:exported="false"
  1213.     android:grantUriPermissions="true">
  1214.     <meta-data
  1215.         android:name="android.support.FILE_PROVIDER_PATHS"
  1216.         android:resource="@xml/file_paths" />
  1217. </provider><provider
  1218.     android:name="androidx.core.content.FileProvider"
  1219.     android:authorities="${applicationId}.fileprovider"
  1220.     android:exported="false"
  1221.     android:grantUriPermissions="true">
  1222.     <meta-data
  1223.         android:name="android.support.FILE_PROVIDER_PATHS"
  1224.         android:resource="@xml/file_paths" />
  1225. </provider>  icon: const Icon(Icons.open_in_new),<provider
  1226.     android:name="androidx.core.content.FileProvider"
  1227.     android:authorities="${applicationId}.fileprovider"
  1228.     android:exported="false"
  1229.     android:grantUriPermissions="true">
  1230.     <meta-data
  1231.         android:name="android.support.FILE_PROVIDER_PATHS"
  1232.         android:resource="@xml/file_paths" />
  1233. </provider><provider
  1234.     android:name="androidx.core.content.FileProvider"
  1235.     android:authorities="${applicationId}.fileprovider"
  1236.     android:exported="false"
  1237.     android:grantUriPermissions="true">
  1238.     <meta-data
  1239.         android:name="android.support.FILE_PROVIDER_PATHS"
  1240.         android:resource="@xml/file_paths" />
  1241. </provider>  label: const Text('前往GitHub'),<provider
  1242.     android:name="androidx.core.content.FileProvider"
  1243.     android:authorities="${applicationId}.fileprovider"
  1244.     android:exported="false"
  1245.     android:grantUriPermissions="true">
  1246.     <meta-data
  1247.         android:name="android.support.FILE_PROVIDER_PATHS"
  1248.         android:resource="@xml/file_paths" />
  1249. </provider><provider
  1250.     android:name="androidx.core.content.FileProvider"
  1251.     android:authorities="${applicationId}.fileprovider"
  1252.     android:exported="false"
  1253.     android:grantUriPermissions="true">
  1254.     <meta-data
  1255.         android:name="android.support.FILE_PROVIDER_PATHS"
  1256.         android:resource="@xml/file_paths" />
  1257. </provider>),<provider
  1258.     android:name="androidx.core.content.FileProvider"
  1259.     android:authorities="${applicationId}.fileprovider"
  1260.     android:exported="false"
  1261.     android:grantUriPermissions="true">
  1262.     <meta-data
  1263.         android:name="android.support.FILE_PROVIDER_PATHS"
  1264.         android:resource="@xml/file_paths" />
  1265. </provider>  ],<provider
  1266.     android:name="androidx.core.content.FileProvider"
  1267.     android:authorities="${applicationId}.fileprovider"
  1268.     android:exported="false"
  1269.     android:grantUriPermissions="true">
  1270.     <meta-data
  1271.         android:name="android.support.FILE_PROVIDER_PATHS"
  1272.         android:resource="@xml/file_paths" />
  1273. </provider>),  );  if (result == true && context.mounted) {<provider
  1274.     android:name="androidx.core.content.FileProvider"
  1275.     android:authorities="${applicationId}.fileprovider"
  1276.     android:exported="false"
  1277.     android:grantUriPermissions="true">
  1278.     <meta-data
  1279.         android:name="android.support.FILE_PROVIDER_PATHS"
  1280.         android:resource="@xml/file_paths" />
  1281. </provider>await _launchGitHubReleases(context);  }}/// 打开GitHub Releases页面static Future _launchGitHubReleases(BuildContext context) async {  const url = 'https://github.com/TNT-Likely/BeeCount/releases';  try {<provider
  1282.     android:name="androidx.core.content.FileProvider"
  1283.     android:authorities="${applicationId}.fileprovider"
  1284.     android:exported="false"
  1285.     android:grantUriPermissions="true">
  1286.     <meta-data
  1287.         android:name="android.support.FILE_PROVIDER_PATHS"
  1288.         android:resource="@xml/file_paths" />
  1289. </provider>final uri = Uri.parse(url);<provider
  1290.     android:name="androidx.core.content.FileProvider"
  1291.     android:authorities="${applicationId}.fileprovider"
  1292.     android:exported="false"
  1293.     android:grantUriPermissions="true">
  1294.     <meta-data
  1295.         android:name="android.support.FILE_PROVIDER_PATHS"
  1296.         android:resource="@xml/file_paths" />
  1297. </provider>if (await canLaunchUrl(uri)) {<provider
  1298.     android:name="androidx.core.content.FileProvider"
  1299.     android:authorities="${applicationId}.fileprovider"
  1300.     android:exported="false"
  1301.     android:grantUriPermissions="true">
  1302.     <meta-data
  1303.         android:name="android.support.FILE_PROVIDER_PATHS"
  1304.         android:resource="@xml/file_paths" />
  1305. </provider>  await launchUrl(uri, mode: LaunchMode.externalApplication);<provider
  1306.     android:name="androidx.core.content.FileProvider"
  1307.     android:authorities="${applicationId}.fileprovider"
  1308.     android:exported="false"
  1309.     android:grantUriPermissions="true">
  1310.     <meta-data
  1311.         android:name="android.support.FILE_PROVIDER_PATHS"
  1312.         android:resource="@xml/file_paths" />
  1313. </provider>} else {<provider
  1314.     android:name="androidx.core.content.FileProvider"
  1315.     android:authorities="${applicationId}.fileprovider"
  1316.     android:exported="false"
  1317.     android:grantUriPermissions="true">
  1318.     <meta-data
  1319.         android:name="android.support.FILE_PROVIDER_PATHS"
  1320.         android:resource="@xml/file_paths" />
  1321. </provider>  throw Exception('无法打开链接');<provider
  1322.     android:name="androidx.core.content.FileProvider"
  1323.     android:authorities="${applicationId}.fileprovider"
  1324.     android:exported="false"
  1325.     android:grantUriPermissions="true">
  1326.     <meta-data
  1327.         android:name="android.support.FILE_PROVIDER_PATHS"
  1328.         android:resource="@xml/file_paths" />
  1329. </provider>}  } catch (e) {<provider
  1330.     android:name="androidx.core.content.FileProvider"
  1331.     android:authorities="${applicationId}.fileprovider"
  1332.     android:exported="false"
  1333.     android:grantUriPermissions="true">
  1334.     <meta-data
  1335.         android:name="android.support.FILE_PROVIDER_PATHS"
  1336.         android:resource="@xml/file_paths" />
  1337. </provider>if (context.mounted) {<provider
  1338.     android:name="androidx.core.content.FileProvider"
  1339.     android:authorities="${applicationId}.fileprovider"
  1340.     android:exported="false"
  1341.     android:grantUriPermissions="true">
  1342.     <meta-data
  1343.         android:name="android.support.FILE_PROVIDER_PATHS"
  1344.         android:resource="@xml/file_paths" />
  1345. </provider>  ScaffoldMessenger.of(context).showSnackBar(<provider
  1346.     android:name="androidx.core.content.FileProvider"
  1347.     android:authorities="${applicationId}.fileprovider"
  1348.     android:exported="false"
  1349.     android:grantUriPermissions="true">
  1350.     <meta-data
  1351.         android:name="android.support.FILE_PROVIDER_PATHS"
  1352.         android:resource="@xml/file_paths" />
  1353. </provider><provider
  1354.     android:name="androidx.core.content.FileProvider"
  1355.     android:authorities="${applicationId}.fileprovider"
  1356.     android:exported="false"
  1357.     android:grantUriPermissions="true">
  1358.     <meta-data
  1359.         android:name="android.support.FILE_PROVIDER_PATHS"
  1360.         android:resource="@xml/file_paths" />
  1361. </provider>SnackBar(<provider
  1362.     android:name="androidx.core.content.FileProvider"
  1363.     android:authorities="${applicationId}.fileprovider"
  1364.     android:exported="false"
  1365.     android:grantUriPermissions="true">
  1366.     <meta-data
  1367.         android:name="android.support.FILE_PROVIDER_PATHS"
  1368.         android:resource="@xml/file_paths" />
  1369. </provider><provider
  1370.     android:name="androidx.core.content.FileProvider"
  1371.     android:authorities="${applicationId}.fileprovider"
  1372.     android:exported="false"
  1373.     android:grantUriPermissions="true">
  1374.     <meta-data
  1375.         android:name="android.support.FILE_PROVIDER_PATHS"
  1376.         android:resource="@xml/file_paths" />
  1377. </provider>  content: Text('打开链接失败: $e'),<provider
  1378.     android:name="androidx.core.content.FileProvider"
  1379.     android:authorities="${applicationId}.fileprovider"
  1380.     android:exported="false"
  1381.     android:grantUriPermissions="true">
  1382.     <meta-data
  1383.         android:name="android.support.FILE_PROVIDER_PATHS"
  1384.         android:resource="@xml/file_paths" />
  1385. </provider><provider
  1386.     android:name="androidx.core.content.FileProvider"
  1387.     android:authorities="${applicationId}.fileprovider"
  1388.     android:exported="false"
  1389.     android:grantUriPermissions="true">
  1390.     <meta-data
  1391.         android:name="android.support.FILE_PROVIDER_PATHS"
  1392.         android:resource="@xml/file_paths" />
  1393. </provider>  action: SnackBarAction(<provider
  1394.     android:name="androidx.core.content.FileProvider"
  1395.     android:authorities="${applicationId}.fileprovider"
  1396.     android:exported="false"
  1397.     android:grantUriPermissions="true">
  1398.     <meta-data
  1399.         android:name="android.support.FILE_PROVIDER_PATHS"
  1400.         android:resource="@xml/file_paths" />
  1401. </provider><provider
  1402.     android:name="androidx.core.content.FileProvider"
  1403.     android:authorities="${applicationId}.fileprovider"
  1404.     android:exported="false"
  1405.     android:grantUriPermissions="true">
  1406.     <meta-data
  1407.         android:name="android.support.FILE_PROVIDER_PATHS"
  1408.         android:resource="@xml/file_paths" />
  1409. </provider><provider
  1410.     android:name="androidx.core.content.FileProvider"
  1411.     android:authorities="${applicationId}.fileprovider"
  1412.     android:exported="false"
  1413.     android:grantUriPermissions="true">
  1414.     <meta-data
  1415.         android:name="android.support.FILE_PROVIDER_PATHS"
  1416.         android:resource="@xml/file_paths" />
  1417. </provider>label: '复制链接',<provider
  1418.     android:name="androidx.core.content.FileProvider"
  1419.     android:authorities="${applicationId}.fileprovider"
  1420.     android:exported="false"
  1421.     android:grantUriPermissions="true">
  1422.     <meta-data
  1423.         android:name="android.support.FILE_PROVIDER_PATHS"
  1424.         android:resource="@xml/file_paths" />
  1425. </provider><provider
  1426.     android:name="androidx.core.content.FileProvider"
  1427.     android:authorities="${applicationId}.fileprovider"
  1428.     android:exported="false"
  1429.     android:grantUriPermissions="true">
  1430.     <meta-data
  1431.         android:name="android.support.FILE_PROVIDER_PATHS"
  1432.         android:resource="@xml/file_paths" />
  1433. </provider><provider
  1434.     android:name="androidx.core.content.FileProvider"
  1435.     android:authorities="${applicationId}.fileprovider"
  1436.     android:exported="false"
  1437.     android:grantUriPermissions="true">
  1438.     <meta-data
  1439.         android:name="android.support.FILE_PROVIDER_PATHS"
  1440.         android:resource="@xml/file_paths" />
  1441. </provider>onPressed: () {<provider
  1442.     android:name="androidx.core.content.FileProvider"
  1443.     android:authorities="${applicationId}.fileprovider"
  1444.     android:exported="false"
  1445.     android:grantUriPermissions="true">
  1446.     <meta-data
  1447.         android:name="android.support.FILE_PROVIDER_PATHS"
  1448.         android:resource="@xml/file_paths" />
  1449. </provider><provider
  1450.     android:name="androidx.core.content.FileProvider"
  1451.     android:authorities="${applicationId}.fileprovider"
  1452.     android:exported="false"
  1453.     android:grantUriPermissions="true">
  1454.     <meta-data
  1455.         android:name="android.support.FILE_PROVIDER_PATHS"
  1456.         android:resource="@xml/file_paths" />
  1457. </provider><provider
  1458.     android:name="androidx.core.content.FileProvider"
  1459.     android:authorities="${applicationId}.fileprovider"
  1460.     android:exported="false"
  1461.     android:grantUriPermissions="true">
  1462.     <meta-data
  1463.         android:name="android.support.FILE_PROVIDER_PATHS"
  1464.         android:resource="@xml/file_paths" />
  1465. </provider>  Clipboard.setData(const ClipboardData(text: url));<provider
  1466.     android:name="androidx.core.content.FileProvider"
  1467.     android:authorities="${applicationId}.fileprovider"
  1468.     android:exported="false"
  1469.     android:grantUriPermissions="true">
  1470.     <meta-data
  1471.         android:name="android.support.FILE_PROVIDER_PATHS"
  1472.         android:resource="@xml/file_paths" />
  1473. </provider><provider
  1474.     android:name="androidx.core.content.FileProvider"
  1475.     android:authorities="${applicationId}.fileprovider"
  1476.     android:exported="false"
  1477.     android:grantUriPermissions="true">
  1478.     <meta-data
  1479.         android:name="android.support.FILE_PROVIDER_PATHS"
  1480.         android:resource="@xml/file_paths" />
  1481. </provider><provider
  1482.     android:name="androidx.core.content.FileProvider"
  1483.     android:authorities="${applicationId}.fileprovider"
  1484.     android:exported="false"
  1485.     android:grantUriPermissions="true">
  1486.     <meta-data
  1487.         android:name="android.support.FILE_PROVIDER_PATHS"
  1488.         android:resource="@xml/file_paths" />
  1489. </provider>},<provider
  1490.     android:name="androidx.core.content.FileProvider"
  1491.     android:authorities="${applicationId}.fileprovider"
  1492.     android:exported="false"
  1493.     android:grantUriPermissions="true">
  1494.     <meta-data
  1495.         android:name="android.support.FILE_PROVIDER_PATHS"
  1496.         android:resource="@xml/file_paths" />
  1497. </provider><provider
  1498.     android:name="androidx.core.content.FileProvider"
  1499.     android:authorities="${applicationId}.fileprovider"
  1500.     android:exported="false"
  1501.     android:grantUriPermissions="true">
  1502.     <meta-data
  1503.         android:name="android.support.FILE_PROVIDER_PATHS"
  1504.         android:resource="@xml/file_paths" />
  1505. </provider>  ),<provider
  1506.     android:name="androidx.core.content.FileProvider"
  1507.     android:authorities="${applicationId}.fileprovider"
  1508.     android:exported="false"
  1509.     android:grantUriPermissions="true">
  1510.     <meta-data
  1511.         android:name="android.support.FILE_PROVIDER_PATHS"
  1512.         android:resource="@xml/file_paths" />
  1513. </provider><provider
  1514.     android:name="androidx.core.content.FileProvider"
  1515.     android:authorities="${applicationId}.fileprovider"
  1516.     android:exported="false"
  1517.     android:grantUriPermissions="true">
  1518.     <meta-data
  1519.         android:name="android.support.FILE_PROVIDER_PATHS"
  1520.         android:resource="@xml/file_paths" />
  1521. </provider>),<provider
  1522.     android:name="androidx.core.content.FileProvider"
  1523.     android:authorities="${applicationId}.fileprovider"
  1524.     android:exported="false"
  1525.     android:grantUriPermissions="true">
  1526.     <meta-data
  1527.         android:name="android.support.FILE_PROVIDER_PATHS"
  1528.         android:resource="@xml/file_paths" />
  1529. </provider>  );<provider
  1530.     android:name="androidx.core.content.FileProvider"
  1531.     android:authorities="${applicationId}.fileprovider"
  1532.     android:exported="false"
  1533.     android:grantUriPermissions="true">
  1534.     <meta-data
  1535.         android:name="android.support.FILE_PROVIDER_PATHS"
  1536.         android:resource="@xml/file_paths" />
  1537. </provider>}  }}
复制代码
性能优化和最佳实践

版本检查优化
  1. /// 静默检查更新(应用启动时调用)static Future silentCheckForUpdates(BuildContext context) async {  try {<provider
  2.     android:name="androidx.core.content.FileProvider"
  3.     android:authorities="${applicationId}.fileprovider"
  4.     android:exported="false"
  5.     android:grantUriPermissions="true">
  6.     <meta-data
  7.         android:name="android.support.FILE_PROVIDER_PATHS"
  8.         android:resource="@xml/file_paths" />
  9. </provider>// 避免频繁检查,每天最多检查一次<provider
  10.     android:name="androidx.core.content.FileProvider"
  11.     android:authorities="${applicationId}.fileprovider"
  12.     android:exported="false"
  13.     android:grantUriPermissions="true">
  14.     <meta-data
  15.         android:name="android.support.FILE_PROVIDER_PATHS"
  16.         android:resource="@xml/file_paths" />
  17. </provider>final prefs = await SharedPreferences.getInstance();<provider
  18.     android:name="androidx.core.content.FileProvider"
  19.     android:authorities="${applicationId}.fileprovider"
  20.     android:exported="false"
  21.     android:grantUriPermissions="true">
  22.     <meta-data
  23.         android:name="android.support.FILE_PROVIDER_PATHS"
  24.         android:resource="@xml/file_paths" />
  25. </provider>final lastCheck = prefs.getString('last_update_check');<provider
  26.     android:name="androidx.core.content.FileProvider"
  27.     android:authorities="${applicationId}.fileprovider"
  28.     android:exported="false"
  29.     android:grantUriPermissions="true">
  30.     <meta-data
  31.         android:name="android.support.FILE_PROVIDER_PATHS"
  32.         android:resource="@xml/file_paths" />
  33. </provider>final now = DateTime.now();<provider
  34.     android:name="androidx.core.content.FileProvider"
  35.     android:authorities="${applicationId}.fileprovider"
  36.     android:exported="false"
  37.     android:grantUriPermissions="true">
  38.     <meta-data
  39.         android:name="android.support.FILE_PROVIDER_PATHS"
  40.         android:resource="@xml/file_paths" />
  41. </provider>if (lastCheck != null) {<provider
  42.     android:name="androidx.core.content.FileProvider"
  43.     android:authorities="${applicationId}.fileprovider"
  44.     android:exported="false"
  45.     android:grantUriPermissions="true">
  46.     <meta-data
  47.         android:name="android.support.FILE_PROVIDER_PATHS"
  48.         android:resource="@xml/file_paths" />
  49. </provider>  final lastCheckTime = DateTime.parse(lastCheck);<provider
  50.     android:name="androidx.core.content.FileProvider"
  51.     android:authorities="${applicationId}.fileprovider"
  52.     android:exported="false"
  53.     android:grantUriPermissions="true">
  54.     <meta-data
  55.         android:name="android.support.FILE_PROVIDER_PATHS"
  56.         android:resource="@xml/file_paths" />
  57. </provider>  if (now.difference(lastCheckTime).inHours < 24) {<provider
  58.     android:name="androidx.core.content.FileProvider"
  59.     android:authorities="${applicationId}.fileprovider"
  60.     android:exported="false"
  61.     android:grantUriPermissions="true">
  62.     <meta-data
  63.         android:name="android.support.FILE_PROVIDER_PATHS"
  64.         android:resource="@xml/file_paths" />
  65. </provider><provider
  66.     android:name="androidx.core.content.FileProvider"
  67.     android:authorities="${applicationId}.fileprovider"
  68.     android:exported="false"
  69.     android:grantUriPermissions="true">
  70.     <meta-data
  71.         android:name="android.support.FILE_PROVIDER_PATHS"
  72.         android:resource="@xml/file_paths" />
  73. </provider>logI('UpdateService', '距离上次检查不足24小时,跳过静默检查');<provider
  74.     android:name="androidx.core.content.FileProvider"
  75.     android:authorities="${applicationId}.fileprovider"
  76.     android:exported="false"
  77.     android:grantUriPermissions="true">
  78.     <meta-data
  79.         android:name="android.support.FILE_PROVIDER_PATHS"
  80.         android:resource="@xml/file_paths" />
  81. </provider><provider
  82.     android:name="androidx.core.content.FileProvider"
  83.     android:authorities="${applicationId}.fileprovider"
  84.     android:exported="false"
  85.     android:grantUriPermissions="true">
  86.     <meta-data
  87.         android:name="android.support.FILE_PROVIDER_PATHS"
  88.         android:resource="@xml/file_paths" />
  89. </provider>return;<provider
  90.     android:name="androidx.core.content.FileProvider"
  91.     android:authorities="${applicationId}.fileprovider"
  92.     android:exported="false"
  93.     android:grantUriPermissions="true">
  94.     <meta-data
  95.         android:name="android.support.FILE_PROVIDER_PATHS"
  96.         android:resource="@xml/file_paths" />
  97. </provider>  }<provider
  98.     android:name="androidx.core.content.FileProvider"
  99.     android:authorities="${applicationId}.fileprovider"
  100.     android:exported="false"
  101.     android:grantUriPermissions="true">
  102.     <meta-data
  103.         android:name="android.support.FILE_PROVIDER_PATHS"
  104.         android:resource="@xml/file_paths" />
  105. </provider>}<provider
  106.     android:name="androidx.core.content.FileProvider"
  107.     android:authorities="${applicationId}.fileprovider"
  108.     android:exported="false"
  109.     android:grantUriPermissions="true">
  110.     <meta-data
  111.         android:name="android.support.FILE_PROVIDER_PATHS"
  112.         android:resource="@xml/file_paths" />
  113. </provider>logI('UpdateService', '开始静默检查更新');<provider
  114.     android:name="androidx.core.content.FileProvider"
  115.     android:authorities="${applicationId}.fileprovider"
  116.     android:exported="false"
  117.     android:grantUriPermissions="true">
  118.     <meta-data
  119.         android:name="android.support.FILE_PROVIDER_PATHS"
  120.         android:resource="@xml/file_paths" />
  121. </provider>final result = await checkUpdate();<provider
  122.     android:name="androidx.core.content.FileProvider"
  123.     android:authorities="${applicationId}.fileprovider"
  124.     android:exported="false"
  125.     android:grantUriPermissions="true">
  126.     <meta-data
  127.         android:name="android.support.FILE_PROVIDER_PATHS"
  128.         android:resource="@xml/file_paths" />
  129. </provider>// 记录检查时间<provider
  130.     android:name="androidx.core.content.FileProvider"
  131.     android:authorities="${applicationId}.fileprovider"
  132.     android:exported="false"
  133.     android:grantUriPermissions="true">
  134.     <meta-data
  135.         android:name="android.support.FILE_PROVIDER_PATHS"
  136.         android:resource="@xml/file_paths" />
  137. </provider>await prefs.setString('last_update_check', now.toIso8601String());<provider
  138.     android:name="androidx.core.content.FileProvider"
  139.     android:authorities="${applicationId}.fileprovider"
  140.     android:exported="false"
  141.     android:grantUriPermissions="true">
  142.     <meta-data
  143.         android:name="android.support.FILE_PROVIDER_PATHS"
  144.         android:resource="@xml/file_paths" />
  145. </provider>if (result.hasUpdate && context.mounted) {<provider
  146.     android:name="androidx.core.content.FileProvider"
  147.     android:authorities="${applicationId}.fileprovider"
  148.     android:exported="false"
  149.     android:grantUriPermissions="true">
  150.     <meta-data
  151.         android:name="android.support.FILE_PROVIDER_PATHS"
  152.         android:resource="@xml/file_paths" />
  153. </provider>  // 显示轻量级的更新提示<provider
  154.     android:name="androidx.core.content.FileProvider"
  155.     android:authorities="${applicationId}.fileprovider"
  156.     android:exported="false"
  157.     android:grantUriPermissions="true">
  158.     <meta-data
  159.         android:name="android.support.FILE_PROVIDER_PATHS"
  160.         android:resource="@xml/file_paths" />
  161. </provider>  ScaffoldMessenger.of(context).showSnackBar(<provider
  162.     android:name="androidx.core.content.FileProvider"
  163.     android:authorities="${applicationId}.fileprovider"
  164.     android:exported="false"
  165.     android:grantUriPermissions="true">
  166.     <meta-data
  167.         android:name="android.support.FILE_PROVIDER_PATHS"
  168.         android:resource="@xml/file_paths" />
  169. </provider><provider
  170.     android:name="androidx.core.content.FileProvider"
  171.     android:authorities="${applicationId}.fileprovider"
  172.     android:exported="false"
  173.     android:grantUriPermissions="true">
  174.     <meta-data
  175.         android:name="android.support.FILE_PROVIDER_PATHS"
  176.         android:resource="@xml/file_paths" />
  177. </provider>SnackBar(<provider
  178.     android:name="androidx.core.content.FileProvider"
  179.     android:authorities="${applicationId}.fileprovider"
  180.     android:exported="false"
  181.     android:grantUriPermissions="true">
  182.     <meta-data
  183.         android:name="android.support.FILE_PROVIDER_PATHS"
  184.         android:resource="@xml/file_paths" />
  185. </provider><provider
  186.     android:name="androidx.core.content.FileProvider"
  187.     android:authorities="${applicationId}.fileprovider"
  188.     android:exported="false"
  189.     android:grantUriPermissions="true">
  190.     <meta-data
  191.         android:name="android.support.FILE_PROVIDER_PATHS"
  192.         android:resource="@xml/file_paths" />
  193. </provider>  content: Text('发现新版本 ${result.version}'),<provider
  194.     android:name="androidx.core.content.FileProvider"
  195.     android:authorities="${applicationId}.fileprovider"
  196.     android:exported="false"
  197.     android:grantUriPermissions="true">
  198.     <meta-data
  199.         android:name="android.support.FILE_PROVIDER_PATHS"
  200.         android:resource="@xml/file_paths" />
  201. </provider><provider
  202.     android:name="androidx.core.content.FileProvider"
  203.     android:authorities="${applicationId}.fileprovider"
  204.     android:exported="false"
  205.     android:grantUriPermissions="true">
  206.     <meta-data
  207.         android:name="android.support.FILE_PROVIDER_PATHS"
  208.         android:resource="@xml/file_paths" />
  209. </provider>  action: SnackBarAction(<provider
  210.     android:name="androidx.core.content.FileProvider"
  211.     android:authorities="${applicationId}.fileprovider"
  212.     android:exported="false"
  213.     android:grantUriPermissions="true">
  214.     <meta-data
  215.         android:name="android.support.FILE_PROVIDER_PATHS"
  216.         android:resource="@xml/file_paths" />
  217. </provider><provider
  218.     android:name="androidx.core.content.FileProvider"
  219.     android:authorities="${applicationId}.fileprovider"
  220.     android:exported="false"
  221.     android:grantUriPermissions="true">
  222.     <meta-data
  223.         android:name="android.support.FILE_PROVIDER_PATHS"
  224.         android:resource="@xml/file_paths" />
  225. </provider><provider
  226.     android:name="androidx.core.content.FileProvider"
  227.     android:authorities="${applicationId}.fileprovider"
  228.     android:exported="false"
  229.     android:grantUriPermissions="true">
  230.     <meta-data
  231.         android:name="android.support.FILE_PROVIDER_PATHS"
  232.         android:resource="@xml/file_paths" />
  233. </provider>label: '立即更新',<provider
  234.     android:name="androidx.core.content.FileProvider"
  235.     android:authorities="${applicationId}.fileprovider"
  236.     android:exported="false"
  237.     android:grantUriPermissions="true">
  238.     <meta-data
  239.         android:name="android.support.FILE_PROVIDER_PATHS"
  240.         android:resource="@xml/file_paths" />
  241. </provider><provider
  242.     android:name="androidx.core.content.FileProvider"
  243.     android:authorities="${applicationId}.fileprovider"
  244.     android:exported="false"
  245.     android:grantUriPermissions="true">
  246.     <meta-data
  247.         android:name="android.support.FILE_PROVIDER_PATHS"
  248.         android:resource="@xml/file_paths" />
  249. </provider><provider
  250.     android:name="androidx.core.content.FileProvider"
  251.     android:authorities="${applicationId}.fileprovider"
  252.     android:exported="false"
  253.     android:grantUriPermissions="true">
  254.     <meta-data
  255.         android:name="android.support.FILE_PROVIDER_PATHS"
  256.         android:resource="@xml/file_paths" />
  257. </provider>onPressed: () {<provider
  258.     android:name="androidx.core.content.FileProvider"
  259.     android:authorities="${applicationId}.fileprovider"
  260.     android:exported="false"
  261.     android:grantUriPermissions="true">
  262.     <meta-data
  263.         android:name="android.support.FILE_PROVIDER_PATHS"
  264.         android:resource="@xml/file_paths" />
  265. </provider><provider
  266.     android:name="androidx.core.content.FileProvider"
  267.     android:authorities="${applicationId}.fileprovider"
  268.     android:exported="false"
  269.     android:grantUriPermissions="true">
  270.     <meta-data
  271.         android:name="android.support.FILE_PROVIDER_PATHS"
  272.         android:resource="@xml/file_paths" />
  273. </provider><provider
  274.     android:name="androidx.core.content.FileProvider"
  275.     android:authorities="${applicationId}.fileprovider"
  276.     android:exported="false"
  277.     android:grantUriPermissions="true">
  278.     <meta-data
  279.         android:name="android.support.FILE_PROVIDER_PATHS"
  280.         android:resource="@xml/file_paths" />
  281. </provider>  showUpdateDialog(context, isForced: false);<provider
  282.     android:name="androidx.core.content.FileProvider"
  283.     android:authorities="${applicationId}.fileprovider"
  284.     android:exported="false"
  285.     android:grantUriPermissions="true">
  286.     <meta-data
  287.         android:name="android.support.FILE_PROVIDER_PATHS"
  288.         android:resource="@xml/file_paths" />
  289. </provider><provider
  290.     android:name="androidx.core.content.FileProvider"
  291.     android:authorities="${applicationId}.fileprovider"
  292.     android:exported="false"
  293.     android:grantUriPermissions="true">
  294.     <meta-data
  295.         android:name="android.support.FILE_PROVIDER_PATHS"
  296.         android:resource="@xml/file_paths" />
  297. </provider><provider
  298.     android:name="androidx.core.content.FileProvider"
  299.     android:authorities="${applicationId}.fileprovider"
  300.     android:exported="false"
  301.     android:grantUriPermissions="true">
  302.     <meta-data
  303.         android:name="android.support.FILE_PROVIDER_PATHS"
  304.         android:resource="@xml/file_paths" />
  305. </provider>},<provider
  306.     android:name="androidx.core.content.FileProvider"
  307.     android:authorities="${applicationId}.fileprovider"
  308.     android:exported="false"
  309.     android:grantUriPermissions="true">
  310.     <meta-data
  311.         android:name="android.support.FILE_PROVIDER_PATHS"
  312.         android:resource="@xml/file_paths" />
  313. </provider><provider
  314.     android:name="androidx.core.content.FileProvider"
  315.     android:authorities="${applicationId}.fileprovider"
  316.     android:exported="false"
  317.     android:grantUriPermissions="true">
  318.     <meta-data
  319.         android:name="android.support.FILE_PROVIDER_PATHS"
  320.         android:resource="@xml/file_paths" />
  321. </provider>  ),<provider
  322.     android:name="androidx.core.content.FileProvider"
  323.     android:authorities="${applicationId}.fileprovider"
  324.     android:exported="false"
  325.     android:grantUriPermissions="true">
  326.     <meta-data
  327.         android:name="android.support.FILE_PROVIDER_PATHS"
  328.         android:resource="@xml/file_paths" />
  329. </provider><provider
  330.     android:name="androidx.core.content.FileProvider"
  331.     android:authorities="${applicationId}.fileprovider"
  332.     android:exported="false"
  333.     android:grantUriPermissions="true">
  334.     <meta-data
  335.         android:name="android.support.FILE_PROVIDER_PATHS"
  336.         android:resource="@xml/file_paths" />
  337. </provider>  duration: const Duration(seconds: 8),<provider
  338.     android:name="androidx.core.content.FileProvider"
  339.     android:authorities="${applicationId}.fileprovider"
  340.     android:exported="false"
  341.     android:grantUriPermissions="true">
  342.     <meta-data
  343.         android:name="android.support.FILE_PROVIDER_PATHS"
  344.         android:resource="@xml/file_paths" />
  345. </provider><provider
  346.     android:name="androidx.core.content.FileProvider"
  347.     android:authorities="${applicationId}.fileprovider"
  348.     android:exported="false"
  349.     android:grantUriPermissions="true">
  350.     <meta-data
  351.         android:name="android.support.FILE_PROVIDER_PATHS"
  352.         android:resource="@xml/file_paths" />
  353. </provider>),<provider
  354.     android:name="androidx.core.content.FileProvider"
  355.     android:authorities="${applicationId}.fileprovider"
  356.     android:exported="false"
  357.     android:grantUriPermissions="true">
  358.     <meta-data
  359.         android:name="android.support.FILE_PROVIDER_PATHS"
  360.         android:resource="@xml/file_paths" />
  361. </provider>  );<provider
  362.     android:name="androidx.core.content.FileProvider"
  363.     android:authorities="${applicationId}.fileprovider"
  364.     android:exported="false"
  365.     android:grantUriPermissions="true">
  366.     <meta-data
  367.         android:name="android.support.FILE_PROVIDER_PATHS"
  368.         android:resource="@xml/file_paths" />
  369. </provider>}  } catch (e) {<provider
  370.     android:name="androidx.core.content.FileProvider"
  371.     android:authorities="${applicationId}.fileprovider"
  372.     android:exported="false"
  373.     android:grantUriPermissions="true">
  374.     <meta-data
  375.         android:name="android.support.FILE_PROVIDER_PATHS"
  376.         android:resource="@xml/file_paths" />
  377. </provider>logE('UpdateService', '静默检查更新失败', e);  }}
复制代码
缓存管理
  1. /// 清理旧的APK文件static Future _cleanupOldApkFiles() async {  try {<provider
  2.     android:name="androidx.core.content.FileProvider"
  3.     android:authorities="${applicationId}.fileprovider"
  4.     android:exported="false"
  5.     android:grantUriPermissions="true">
  6.     <meta-data
  7.         android:name="android.support.FILE_PROVIDER_PATHS"
  8.         android:resource="@xml/file_paths" />
  9. </provider>final downloadDir = await getExternalStorageDirectory() ??<provider
  10.     android:name="androidx.core.content.FileProvider"
  11.     android:authorities="${applicationId}.fileprovider"
  12.     android:exported="false"
  13.     android:grantUriPermissions="true">
  14.     <meta-data
  15.         android:name="android.support.FILE_PROVIDER_PATHS"
  16.         android:resource="@xml/file_paths" />
  17. </provider><provider
  18.     android:name="androidx.core.content.FileProvider"
  19.     android:authorities="${applicationId}.fileprovider"
  20.     android:exported="false"
  21.     android:grantUriPermissions="true">
  22.     <meta-data
  23.         android:name="android.support.FILE_PROVIDER_PATHS"
  24.         android:resource="@xml/file_paths" />
  25. </provider><provider
  26.     android:name="androidx.core.content.FileProvider"
  27.     android:authorities="${applicationId}.fileprovider"
  28.     android:exported="false"
  29.     android:grantUriPermissions="true">
  30.     <meta-data
  31.         android:name="android.support.FILE_PROVIDER_PATHS"
  32.         android:resource="@xml/file_paths" />
  33. </provider><provider
  34.     android:name="androidx.core.content.FileProvider"
  35.     android:authorities="${applicationId}.fileprovider"
  36.     android:exported="false"
  37.     android:grantUriPermissions="true">
  38.     <meta-data
  39.         android:name="android.support.FILE_PROVIDER_PATHS"
  40.         android:resource="@xml/file_paths" />
  41. </provider><provider
  42.     android:name="androidx.core.content.FileProvider"
  43.     android:authorities="${applicationId}.fileprovider"
  44.     android:exported="false"
  45.     android:grantUriPermissions="true">
  46.     <meta-data
  47.         android:name="android.support.FILE_PROVIDER_PATHS"
  48.         android:resource="@xml/file_paths" />
  49. </provider>   await getApplicationDocumentsDirectory();<provider
  50.     android:name="androidx.core.content.FileProvider"
  51.     android:authorities="${applicationId}.fileprovider"
  52.     android:exported="false"
  53.     android:grantUriPermissions="true">
  54.     <meta-data
  55.         android:name="android.support.FILE_PROVIDER_PATHS"
  56.         android:resource="@xml/file_paths" />
  57. </provider>final apkFiles = downloadDir<provider
  58.     android:name="androidx.core.content.FileProvider"
  59.     android:authorities="${applicationId}.fileprovider"
  60.     android:exported="false"
  61.     android:grantUriPermissions="true">
  62.     <meta-data
  63.         android:name="android.support.FILE_PROVIDER_PATHS"
  64.         android:resource="@xml/file_paths" />
  65. </provider><provider
  66.     android:name="androidx.core.content.FileProvider"
  67.     android:authorities="${applicationId}.fileprovider"
  68.     android:exported="false"
  69.     android:grantUriPermissions="true">
  70.     <meta-data
  71.         android:name="android.support.FILE_PROVIDER_PATHS"
  72.         android:resource="@xml/file_paths" />
  73. </provider>.listSync()<provider
  74.     android:name="androidx.core.content.FileProvider"
  75.     android:authorities="${applicationId}.fileprovider"
  76.     android:exported="false"
  77.     android:grantUriPermissions="true">
  78.     <meta-data
  79.         android:name="android.support.FILE_PROVIDER_PATHS"
  80.         android:resource="@xml/file_paths" />
  81. </provider><provider
  82.     android:name="androidx.core.content.FileProvider"
  83.     android:authorities="${applicationId}.fileprovider"
  84.     android:exported="false"
  85.     android:grantUriPermissions="true">
  86.     <meta-data
  87.         android:name="android.support.FILE_PROVIDER_PATHS"
  88.         android:resource="@xml/file_paths" />
  89. </provider>.where((file) => file.path.toLowerCase().endsWith('.apk'))<provider
  90.     android:name="androidx.core.content.FileProvider"
  91.     android:authorities="${applicationId}.fileprovider"
  92.     android:exported="false"
  93.     android:grantUriPermissions="true">
  94.     <meta-data
  95.         android:name="android.support.FILE_PROVIDER_PATHS"
  96.         android:resource="@xml/file_paths" />
  97. </provider><provider
  98.     android:name="androidx.core.content.FileProvider"
  99.     android:authorities="${applicationId}.fileprovider"
  100.     android:exported="false"
  101.     android:grantUriPermissions="true">
  102.     <meta-data
  103.         android:name="android.support.FILE_PROVIDER_PATHS"
  104.         android:resource="@xml/file_paths" />
  105. </provider>.cast();<provider
  106.     android:name="androidx.core.content.FileProvider"
  107.     android:authorities="${applicationId}.fileprovider"
  108.     android:exported="false"
  109.     android:grantUriPermissions="true">
  110.     <meta-data
  111.         android:name="android.support.FILE_PROVIDER_PATHS"
  112.         android:resource="@xml/file_paths" />
  113. </provider>final currentVersion = await _getCurrentVersion();<provider
  114.     android:name="androidx.core.content.FileProvider"
  115.     android:authorities="${applicationId}.fileprovider"
  116.     android:exported="false"
  117.     android:grantUriPermissions="true">
  118.     <meta-data
  119.         android:name="android.support.FILE_PROVIDER_PATHS"
  120.         android:resource="@xml/file_paths" />
  121. </provider>for (final file in apkFiles) {<provider
  122.     android:name="androidx.core.content.FileProvider"
  123.     android:authorities="${applicationId}.fileprovider"
  124.     android:exported="false"
  125.     android:grantUriPermissions="true">
  126.     <meta-data
  127.         android:name="android.support.FILE_PROVIDER_PATHS"
  128.         android:resource="@xml/file_paths" />
  129. </provider>  try {<provider
  130.     android:name="androidx.core.content.FileProvider"
  131.     android:authorities="${applicationId}.fileprovider"
  132.     android:exported="false"
  133.     android:grantUriPermissions="true">
  134.     <meta-data
  135.         android:name="android.support.FILE_PROVIDER_PATHS"
  136.         android:resource="@xml/file_paths" />
  137. </provider><provider
  138.     android:name="androidx.core.content.FileProvider"
  139.     android:authorities="${applicationId}.fileprovider"
  140.     android:exported="false"
  141.     android:grantUriPermissions="true">
  142.     <meta-data
  143.         android:name="android.support.FILE_PROVIDER_PATHS"
  144.         android:resource="@xml/file_paths" />
  145. </provider>// 保留当前版本和更新版本的APK,删除其他版本<provider
  146.     android:name="androidx.core.content.FileProvider"
  147.     android:authorities="${applicationId}.fileprovider"
  148.     android:exported="false"
  149.     android:grantUriPermissions="true">
  150.     <meta-data
  151.         android:name="android.support.FILE_PROVIDER_PATHS"
  152.         android:resource="@xml/file_paths" />
  153. </provider><provider
  154.     android:name="androidx.core.content.FileProvider"
  155.     android:authorities="${applicationId}.fileprovider"
  156.     android:exported="false"
  157.     android:grantUriPermissions="true">
  158.     <meta-data
  159.         android:name="android.support.FILE_PROVIDER_PATHS"
  160.         android:resource="@xml/file_paths" />
  161. </provider>if (!file.path.contains(currentVersion) &&<provider
  162.     android:name="androidx.core.content.FileProvider"
  163.     android:authorities="${applicationId}.fileprovider"
  164.     android:exported="false"
  165.     android:grantUriPermissions="true">
  166.     <meta-data
  167.         android:name="android.support.FILE_PROVIDER_PATHS"
  168.         android:resource="@xml/file_paths" />
  169. </provider><provider
  170.     android:name="androidx.core.content.FileProvider"
  171.     android:authorities="${applicationId}.fileprovider"
  172.     android:exported="false"
  173.     android:grantUriPermissions="true">
  174.     <meta-data
  175.         android:name="android.support.FILE_PROVIDER_PATHS"
  176.         android:resource="@xml/file_paths" />
  177. </provider><provider
  178.     android:name="androidx.core.content.FileProvider"
  179.     android:authorities="${applicationId}.fileprovider"
  180.     android:exported="false"
  181.     android:grantUriPermissions="true">
  182.     <meta-data
  183.         android:name="android.support.FILE_PROVIDER_PATHS"
  184.         android:resource="@xml/file_paths" />
  185. </provider>!file.path.contains('BeeCount_')) {<provider
  186.     android:name="androidx.core.content.FileProvider"
  187.     android:authorities="${applicationId}.fileprovider"
  188.     android:exported="false"
  189.     android:grantUriPermissions="true">
  190.     <meta-data
  191.         android:name="android.support.FILE_PROVIDER_PATHS"
  192.         android:resource="@xml/file_paths" />
  193. </provider><provider
  194.     android:name="androidx.core.content.FileProvider"
  195.     android:authorities="${applicationId}.fileprovider"
  196.     android:exported="false"
  197.     android:grantUriPermissions="true">
  198.     <meta-data
  199.         android:name="android.support.FILE_PROVIDER_PATHS"
  200.         android:resource="@xml/file_paths" />
  201. </provider>  await file.delete();<provider
  202.     android:name="androidx.core.content.FileProvider"
  203.     android:authorities="${applicationId}.fileprovider"
  204.     android:exported="false"
  205.     android:grantUriPermissions="true">
  206.     <meta-data
  207.         android:name="android.support.FILE_PROVIDER_PATHS"
  208.         android:resource="@xml/file_paths" />
  209. </provider><provider
  210.     android:name="androidx.core.content.FileProvider"
  211.     android:authorities="${applicationId}.fileprovider"
  212.     android:exported="false"
  213.     android:grantUriPermissions="true">
  214.     <meta-data
  215.         android:name="android.support.FILE_PROVIDER_PATHS"
  216.         android:resource="@xml/file_paths" />
  217. </provider>  logI('UpdateService', '清理旧APK文件: ${file.path}');<provider
  218.     android:name="androidx.core.content.FileProvider"
  219.     android:authorities="${applicationId}.fileprovider"
  220.     android:exported="false"
  221.     android:grantUriPermissions="true">
  222.     <meta-data
  223.         android:name="android.support.FILE_PROVIDER_PATHS"
  224.         android:resource="@xml/file_paths" />
  225. </provider><provider
  226.     android:name="androidx.core.content.FileProvider"
  227.     android:authorities="${applicationId}.fileprovider"
  228.     android:exported="false"
  229.     android:grantUriPermissions="true">
  230.     <meta-data
  231.         android:name="android.support.FILE_PROVIDER_PATHS"
  232.         android:resource="@xml/file_paths" />
  233. </provider>}<provider
  234.     android:name="androidx.core.content.FileProvider"
  235.     android:authorities="${applicationId}.fileprovider"
  236.     android:exported="false"
  237.     android:grantUriPermissions="true">
  238.     <meta-data
  239.         android:name="android.support.FILE_PROVIDER_PATHS"
  240.         android:resource="@xml/file_paths" />
  241. </provider>  } catch (e) {<provider
  242.     android:name="androidx.core.content.FileProvider"
  243.     android:authorities="${applicationId}.fileprovider"
  244.     android:exported="false"
  245.     android:grantUriPermissions="true">
  246.     <meta-data
  247.         android:name="android.support.FILE_PROVIDER_PATHS"
  248.         android:resource="@xml/file_paths" />
  249. </provider><provider
  250.     android:name="androidx.core.content.FileProvider"
  251.     android:authorities="${applicationId}.fileprovider"
  252.     android:exported="false"
  253.     android:grantUriPermissions="true">
  254.     <meta-data
  255.         android:name="android.support.FILE_PROVIDER_PATHS"
  256.         android:resource="@xml/file_paths" />
  257. </provider>logW('UpdateService', '清理APK文件失败: ${file.path}', e);<provider
  258.     android:name="androidx.core.content.FileProvider"
  259.     android:authorities="${applicationId}.fileprovider"
  260.     android:exported="false"
  261.     android:grantUriPermissions="true">
  262.     <meta-data
  263.         android:name="android.support.FILE_PROVIDER_PATHS"
  264.         android:resource="@xml/file_paths" />
  265. </provider>  }<provider
  266.     android:name="androidx.core.content.FileProvider"
  267.     android:authorities="${applicationId}.fileprovider"
  268.     android:exported="false"
  269.     android:grantUriPermissions="true">
  270.     <meta-data
  271.         android:name="android.support.FILE_PROVIDER_PATHS"
  272.         android:resource="@xml/file_paths" />
  273. </provider>}  } catch (e) {<provider
  274.     android:name="androidx.core.content.FileProvider"
  275.     android:authorities="${applicationId}.fileprovider"
  276.     android:exported="false"
  277.     android:grantUriPermissions="true">
  278.     <meta-data
  279.         android:name="android.support.FILE_PROVIDER_PATHS"
  280.         android:resource="@xml/file_paths" />
  281. </provider>logE('UpdateService', '清理APK文件异常', e);  }}
复制代码
实际应用效果

在BeeCount项目中,完善的自动更新系统带来了显著的价值:

  • 用户体验提升:一键式更新流程,用户升级率从30%提升至85%
  • 问题快速修复:重要bug修复可以在24小时内推送给所有用户
  • 开发效率提升:无需依赖应用商店审核,快速迭代功能
  • 技术债务解决:R8混淆问题的彻底解决,确保生产环境稳定性
通过深入的系统集成和细致的错误处理,BeeCount的自动更新功能在各种设备和网络环境下都能稳定工作,为用户提供了可靠的版本升级体验。
结语

构建可靠的移动应用自动更新系统是一个涉及多个技术领域的复杂工程。从GitHub API集成、APK下载管理,到Android系统权限处理、R8代码混淆兼容性,每个环节都需要深入理解和精心设计。
BeeCount的实践经验表明,技术问题的解决往往需要系统性思考和持续优化。特别是生产环境下的R8混淆问题,这类底层系统兼容性问题需要通过详细的日志分析和深入的源码研究才能找到根本原因。
这套自动更新方案不仅适用于个人开发者的独立应用,对于任何需要绕过应用商店进行直接分发的应用都具有重要的参考价值。通过合理的架构设计、完善的错误处理和优质的用户体验,我们可以为用户提供便捷可靠的应用更新服务。
关于BeeCount项目

项目特色

<ul>
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

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