博客 RSS 订阅

相机插件 8.0.0 发布!
作者:Norman Breau
2024 年 11 月 2 日

我们很高兴地宣布,我们刚刚发布了 cordova-plugin-camera 的重大更新!

升级方法

cordova plugin remove cordova-plugin-camera
cordova plugin add [email protected]

版本亮点

这是一个重大更新,因为它包含了一些突破性的公共 API 机制,为了更好!

重大变更包括

此外,allowEdit 功能现已弃用。查看更多详情

getPicture

相机插件在使用 getPicture API 时,之前的返回路径非常不一致。有时是 file:// uri,有时是原始文件路径。应用程序必须检查并通常自行为路径添加前缀才能使用它们。因此,我们将返回的数据精简为 URI。

现在所有平台都一致地返回 <scheme>:...

对于所有平台,当使用 DATA_URL 选项时,返回的 base64 编码图像过去只返回 base64 编码部分。从 v8.0.0 开始,返回的字符串现在包含 data: uri 标头,包括 base64 数据表示的 MIME 类型。

对于 iOS,之前总是返回一致的 file:// uris,因此这里没有做任何更改。

对于 Android,API 的行为取决于内容的底层来源。大多数情况下,返回的是原始文件路径。现在它总是会返回某种 URI,尽管与 iOS 不同,假设它是 file:// uri 是不安全的。

如果您正在测试并为文件路径添加前缀,则不再需要这样做。所有使用 FILE_URI 选项返回的 URI 都可以通过 [email protected] 及更高版本解析。

有关如何使用结果的示例,请参阅 相机插件文档

URI 持久性

对于所有使用 FILE_URI 选项的平台,返回的 URI 仅是临时访问的。

当从相机获取内容时,该文件存储在应用程序的临时目录中,当磁盘空间不足时,操作系统可能会随时清除该目录。

当从用户图库获取内容时,返回的 URI 具有操作系统提供的临时读取权限,该权限通常在应用程序退出后过期。

这意味着不应该存储 getPicture 返回的 URI。应用程序应根据自身的需求和要求决定如何处理它。

示例 1: 应用程序正在接收用户个人资料图片,并且需要对该内容进行持久访问。

解决方案:应用程序应将内容复制到应用程序的数据目录,并存储和使用复制的 URI。

示例 2: 应用程序正在接收要编辑或操作的图像。它只需要一次读取即可加载到内存中,以便将数据放入图像编辑器中。

解决方案:应用程序可以安全地使用临时 URI 来读取和显示内容,并在稍后保存操作后的数据。

可选的 WRITE_EXTERNAL_STORAGE 权限

对于 Android 7 - 12,此插件过去总是包含 WRITE_EXTERNAL_STORAGE 权限,并且由于实现原因,它是运行所必需的。

从 v8.0.0 开始,相机插件不再自动包含权限声明,因为在大多数情况下不再需要它。

如果您的应用程序启用了 saveToPhotoAlbum 选项,则需要在 config.xml 文件中添加以下内容

<platform name="android">
    <config-file target="AndroidManifest.xml" parent="/*" xmlns:android="http://schemas.android.com/apk/res/android">
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
    </config-file>
</platform>

如果您的应用程序不使用 saveToPhotoAlbum,则您的应用程序不需要任何权限即可操作相机或从用户图库中选择。

在 Android 7、Android 8 和 Android 9 设备上,尝试使用 saveToPhotoAlbum 而不声明 WRITE_EXTERNAL_STORAGE 将导致返回错误。

弃用:allowEdit

现在已弃用从相机拍摄图像或从图库中选择图像时的 allowEdit 功能。此功能的行为在各个平台上不一致,并且由于依赖于底层相机应用程序的支持(这不是标准),因此通常不可靠。

该功能目前仍然存在,并且应该按照其文档中的警告工作,但 Apache Cordova 将不再为使用该功能引起的问题提供支持。 allowEdit 选项计划在稍后完全删除,并且没有直接替代方案。

使用 allowEdit 功能的用户应迁移到专用的图像操作库。

已知问题

iOS

在 iOS 上,当应用程序配置为使用 scheme 时,FileEntry.toURL 方法不会生成可供 DOM 使用的 uri。此问题的修复将在稍后提供。在此期间,可以使用以下作为解决方法

// TODO: Remove when https://github.com/apache/cordova-plugin-file/pull/642 is released
function toDomURL(fileEntry) {
    if (cordova.platform === "ios") {
        return window.WkWebView.convertFilePath(fileEntry.nativeUrl);
    }
    else {
        return fileEntry.toURL();
    }
}

如果您的应用程序仍然托管在 iOS 上的 file:// 协议上,则不需要此解决方法。

Android

当从用户图库中选择图像时,Android 将开始返回 content:// 而不是 file:// URI,以便利用底层的 MediaStore API。为了使这些路径可解析为可供 DOM 使用的 URL,AndroidInsecureFileModeEnabled 首选项必须为 "false"(默认值)。

请按照 如何提交错误 指南报告您发现的任何问题!

更改包括

重大变更

  • GH-902 fix(android): 始终返回 uris (#902)
  • GH-909 refactor(android): 使 WRITE_EXTERNAL_STORAGE 成为可选 (#909)
  • GH-910 fix(android): 将数据 uris 作为 URI 返回 (#910)
  • GH-911 fix(ios): 同步相机 API 返回以匹配 Android 更改 (#911)
  • GH-912 fix(browser): 使数据 uri 作为实际 URI 字符串返回 (#912)
  • GH-915 fix(android): 删除 WRITE_EXTERNAL_PERMISSION (#915)

改进

  • GH-901 fix(android): 将提供程序访问隔离到子目录 (#901)
  • GH-904 fix(android): 使用 VERSION_CODES 而不是硬编码的 API 字面量 (#904)
  • GH-906 refactor(android): 用图像 uris 替换图像路径用法
  • GH-907 refactor(android): 删除查询图像用法 (#907)

修复

  • GH-903 fix(android): 在保存实例状态时图像 uri 的不正确序列化 (#903)
  • GH-905 fix(android): 图像操作期间不正确的缓存路径构造 (#905)

弃用

  • GH-914 deprecation: allowEdit (#914)

文档

  • GH-913 docs: 对 v8 公共 API 更改进行修订,包括 getPicture 的返回字符串格式 (#913)