我们很高兴地宣布,我们刚刚发布了 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-914 deprecation: allowEdit (#914)
文档
- GH-913 docs: 对 v8 公共 API 更改进行修订,包括 getPicture 的返回字符串格式 (#913)