android - Cordova Android FileReader.readAsDataURL NOT_FOUND_ERR
问题描述
我同时使用cordova-plugin-file
和cordova-plugin-media-capture
在 iOS 和 Android 上捕获视频。此实现在 iOS 上完美运行,但在 Android 上却不行。我已将问题追溯到FileReader
无法找到cordova-plugin-media-capture
已记录文件的实例。这是代码块:
if (navigator && navigator.device.capture && window.cordova.file) {
navigator.device.capture.captureVideo((mediaFiles: MediaFile[]) => {
if (mediaFiles.length > 0) {
const mediaFile = mediaFiles[0];
const type = mediaFile.type;
window.resolveLocalFileSystemURL((mediaFile as any).localURL, (fileEntry: Entry) => {
(fileEntry as FileEntry).file((file: File) => {
// "file" is a valid file with a local URL (cdvfile://localhost/sdcard/DCIM/....)
const fileReader = new FileReader();
fileReader.onloadend = (event: ProgressEvent) => {
console.log(event);
// event.target.error = 1 here which according to the docs is NOT_FOUND_ERR
success({ data: (event.target as any).result, type });
};
fileReader.readAsDataURL(file);
}, (_error: FileError) => {
console.log(_error);
});
}, (_error: FileError) => {
console.log(_error);
});
}
}, (_error: CaptureError) => {
console.log(_error);
}, { limit: 1, duration: 10, quality: 1 });
}
关于可能导致这种情况的任何想法?以下是我尝试过的事情:
- 添加
<preference name="AndroidPersistentFileLocation" value="Compatibility" />
到config.xml
. 在这种方法不起作用后删除。 - 添加
<access origin="cdvfile://*"/>
到config.xml
. 删除后这不起作用。 - 确保 CSP 包括
cdvfile:
- 确保同时
AndroidManifest.xml
具有android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_EXTERNAL_STORAGE
- 通过浏览文件应用程序验证视频确实存在于手机上。视频播放得很好。
使用 Moto G6 在 Android 8 上进行测试。
提前致谢。
解决方案
调试后cordova-plugin-file
发现报告NOT_FOUND_ERR
有误导性,因为原来是权限问题。
我认为将读取外部存储的权限放在清单中就足够了,但事实并非如此。Android 需要运行时权限:https ://developer.android.com/training/permissions/requesting.html
添加运行时权限后,视频捕获过程按预期工作。
推荐阅读
- azure-data-factory - 无法打开 ADFv2 映射数据流的调试
- javascript - 将对象数组拆分为 2 小时跨度组
- python - 熊猫数据框根据另一列的值填充一列的数组值
- r - 单击 r shiny 中的禁用按钮时弹出
- openid-connect - 发送 responseType = 'id_token' 时在 OIDC 中将 id_token 设为 null
- ruby-on-rails - Rails 和 Razorpay Webhook 设置
- amazon-web-services - 为什么重启后我无法通过 SSH 访问我的 AWS 实例?
- snowflake-cloud-data-platform - 通过自定义验证将临时表数据传输到 Snowflake 中的事实表的过程是什么
- appium - 无法使用 UIAutomator2 向后滚动
- swift - 如何通过 URLSession 下载 USDZ?