我同时使用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
。此操作无效后将其删除。cdvfile:
AndroidManifest.xml
同时拥有android.permission.WRITE_EXTERNAL_STORAGE
和android.permission.READ_EXTERNAL_STORAGE
使用Moto G6在Android 8上进行测试。
谢谢。
答案 0 :(得分:0)
调试cordova-plugin-file
后,我发现报告的NOT_FOUND_ERR
具有误导性,因为事实证明存在权限问题。
我认为在清单中放置读取外部存储的权限就足够了,但事实并非如此。 Android需要运行时权限:https://developer.android.com/training/permissions/requesting.html
添加运行时权限后,视频捕获过程将按预期方式工作。