如何为 flutter 中的资产创建 APK 扩展文件

2023-12-20

我创建了一个 flutter 应用程序,其中包含大小约为 450mb 的视频资源。我已经在Apple应用商店中成功发布了该应用程序。但 Google Play 不接受我的 APK,因为它超过了 200mb 的限制。我尝试采用创建 APK 扩展文件的方法作为推荐的工作流程。我已经阅读了所有关于扩展文件的可用 Android 文档,但我仍然不知道如何使用 flutter 来实现它们。

如何在 flutter 应用程序中实现和访问 APK 扩展文件中的资源?


你会从中得到一些乐趣。基本上,在有人实现插件来访问 APK 扩展文件之前,您将不得不编写 java 代码来连接到 Flutter。

这并不是太难,只是意味着你必须学习平台渠道 https://flutter.dev/docs/development/platform-integration/platform-channels并编写一些本机 Android 代码。该文档在解释平台通道方面可能比我做得更好,但基本上最简单的方法是使用 MethodChannel 将数据从 dart 传递到本机,反之亦然。

您首先要做的是设置一个方法通道来启动此过程并使用类似的内容调用它getObbFolder.


在 Android 方面,您需要做的第一件事是确保您的应用程序确实已下载文件。根据安卓文档 https://developer.android.com/google/play/expansion-files#Downloading,您不能保证它们会是这样,因此您需要编写逻辑来下载它们。我建议使用下载库 https://developer.android.com/google/play/expansion-files#AboutLibraries他们提供了各种需要担心的事情,例如设备存储空间不足、网络连接、显示进度等。我认为这方面的文档相当简单(如果您有问题,我建议您询问新的问题)特定于它的问题。


完成此操作后,您需要获取该文件的路径,并在需要时请求读取该文件的权限。某些 Android 版本和其他版本的某些设备(说实话,这听起来有点冒险),您需要读取文件的权限,而在其他版本中则不需要。因此,如果尝试失败,最好只是尝试并请求许可。

获取正在使用的保存目录context.getObbDir() https://developer.android.com/reference/android/content/Context.html#getObbDir()

然后这是从 android 文档中执行此操作的一种方法:

 File obb = new File(obb_filename);
 boolean open_failed = false;

 try {
     BufferedReader br = new BufferedReader(new FileReader(obb));
     open_failed = false;
     ReadObbFile(br);
 } catch (IOException e) {
     open_failed = true;
 }

 if (open_failed) {
     // request READ_EXTERNAL_STORAGE permission before reading OBB file
     ReadObbFileWithPermission();
 }

对于不执行运行时权限检查的版本,请将其添加到您的应用程序清单中:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Android 不建议总是请求权限,因为有时 Obb 文件夹不需要 READ_EXTERNAL_STORAGE 权限。


现在你有两个选择。一是你可以将该路径传递回 flutter,然后使用 flutter 的文件读取 https://flutter.dev/docs/cookbook/persistence/reading-writing-files#4-read-data-from-the-file如果文件是您可以直接读取的内容,则可以对数据执行某些操作。如果不是,您可以使用 flutter 或使用 java/kotlin 解压它,然后将路径传回解压文件。

如果您选择从 android 解压文件,您应该将其解压到 flutter 知道的目录之一(例如使用 path_provider 插件),或者写入您想要的任何位置(并有权),然后简单地将路径传回扑动。

希望有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为 flutter 中的资产创建 APK 扩展文件 的相关文章

随机推荐

  • C++ 编译时一个类的子类列表

    我正在考虑如何创建从模板基类派生的所有类的列表 首先我想要一个模板基类 template
  • Cygwin64 上的 Python 2.7.5:请求安装失败

    我们的项目主要是基于 J2EE 的开发 并使用 Python 编写的自动功能和集成测试 测试环境是Linux 但开发人员使用Windows 7 64位 我们希望也能够在开发人员机器上执行功能测试 在提交之前 不幸的是pexpect wind
  • JavaScript 变量的生命周期

    JavaScript 中用 var 声明的变量的生命周期是多少 我确信 这绝对不符合预期 JavaScript 如何以及何时垃圾收集变量a Since a是内部函数闭包的一部分 理想情况下它永远不应该被垃圾收集 因为内部函数fun 可以作为
  • .NET MAUI 中的页眉和页脚

    我想做与这个问题相同的事情 但是对于 NET MAUI 所有 WPF 窗口中的页眉和页脚相同 https stackoverflow com questions 20113405 same header footer in all wpf
  • 如何使用WebRTC停止屏幕共享?

    我在用着获取用户媒体 https developer mozilla org en US docs Web API Navigator getUserMedia访问屏幕共享 当用户单击停止按钮时 我想停止屏幕共享 根据媒体流API http
  • 如何在div上创建不均匀的圆角?

    我一直在尝试制作一个具有不均匀圆边的 DIV 如下所示 我检查了一些解决方案 最接近的解决方案是使用 border radius 我用过 border bottom left radius 80 50px border bottom rig
  • 无法将 Intellij 与生成的源文件夹一起使用

    相关问题如何配置 IntelliJ IDEA 和 或 Maven 自动添加包含使用 jaxb2 maven plugin 生成的 Java 源代码的目录 https stackoverflow com questions 2644609 h
  • 在 gmail 中通过 PHP 登录时电子邮件尝试失败

    我需要用 PHP 发送电子邮件的帮助 我实际上正在尝试使用 PHP 邮件程序发送电子邮件 不知何故 某些邮件 ID 能够发送电子邮件 但其他一些电子邮件 ID 无法发送 我在 Gmail 中收到一封电子邮件 指出 登录尝试被阻止 有人可以帮
  • 需要 ANSI 92 递归 SQL 语句

    我目前正在将 SQL Server SQL 语句转换为其 ANSI 通用等效项 并且一直坚持使用WITH 语句的递归语句 为了集中讨论这个问题 我将问题简化如下 如果我有两张桌子 报告单位 col1 关键 col2 ParentReport
  • 有终结器但没有 IDisposable 的单例

    这是我从 CLR via C Effective C 和其他资源中对 IDisposable 和终结器的理解 IDisposable 用于确定性地清理托管和非托管资源 负责非托管资源 例如文件句柄 的类应该实现 IDisposable 并提
  • 在视图下方显示 toast 小部件

    对于那些之前在这个项目上帮助过我的人 非常感谢 我的代码不再有任何问题 并且我做了额外的调整 现在该应用程序实际上已经很强大了 我还想做一件事 请参阅屏幕截图layout https i stack imgur com NJW9Y jpg
  • 从 Windows C 函数返回字符串

    我对 C 和 C 中的纯 Windows API 级函数完全是新手 最近一直在尝试 NET 互操作性 我已经构建了一个简单的库 它已成功地将数值 int float 等 返回给 NET 调用者 但我在字符串方面没有那么幸运 我尝试了各种不同
  • jQuery Mobile 重用标题和导航

    我是 jQuery Mobile 的新手 在理解重用标题和常规导航时遇到问题 所以我创建了一个标题 其右侧有一个菜单按钮 单击此菜单栏时 会出现一个弹出窗口 其中包含其他页面的链接 div h1 Home h1 a href popupMe
  • 使用带有 '\xae' 的元素转义列表并打印结果

    我有一个清单L u steve u micheal u pedro xae 当我尝试阅读它时 出现错误 我相信它与 xae 有关 gt gt gt L u steve u micheal u pedro xae gt gt gt gt gt
  • 从java voip开始[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我必须编写一个聊天应用程序 能够使用
  • 无法 npm 安装 canvas [Windows 上的 NodeJs]?

    我正在尝试使用 ag psd 包来操作 psd 文件 它仅适用于结构 但如果您也想读取图像数据 则会遇到错误 错误如下 Cannot find module canvas code MODULE NOT FOUND 但如果我尝试安装画布 我
  • 每个派生表必须有自己的别名 - 来自组合降序 MySQL 的错误

    我想通过来自两个不同列的两个 strtotime 时间戳对一个 mysql 表进行排序 我有以下 mysql 命令 SELECT FROM SELECT 1 AS table vid req timestamp AS timestamp t
  • 失败 [INSTALL_FAILED_INVALID_APK]

    当我单击运行刚刚在 Android Studio 0 2 10 中创建的项目并选择我的 Android 通过 USB 连接并通过 USB 进行调试 时 出现以下错误 Waiting for device Target device 0123
  • Twilio 未通过 AWS Lambda 实时发送 WhatsApp 消息

    很抱歉这篇文章很长 但这只是为了更好地解释 因为英语不是我的母语 我正在使用 API Gateway Lambda 通过 POST 请求发送 WhatsApp 消息 我遇到过这种奇怪的行为 看起来 Twilio 需要在 2 个请求或一段时间
  • 如何为 flutter 中的资产创建 APK 扩展文件

    我创建了一个 flutter 应用程序 其中包含大小约为 450mb 的视频资源 我已经在Apple应用商店中成功发布了该应用程序 但 Google Play 不接受我的 APK 因为它超过了 200mb 的限制 我尝试采用创建 APK 扩