【发布时间】:2019-02-08 17:57:40
【问题描述】:
在我的应用中,显示照片中的所有视频。选择视频后,将使用 avplayer 播放。但是当我试图获取所选视频文件的大小(kb)时,它显示错误。当我尝试复制视频文件时出现同样的错误。
我已取得这些权限:
<key>NSCameraUsageDescription</key>
<string>App needs to access camera</string>
<key>NSMicrophoneUsageDescription</key>
<string>App need to access microphone</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>App needs to access photos and videos</string>
获取尺寸的代码:
func fileSize(forURL url: Any) -> Double {
var fileURL: URL?
var fileSize: Double = 0.0
if url is URL || url is String {
if url is URL {
fileURL = url as? URL
}
else {
fileURL = URL(fileURLWithPath: url as! String)
}
var fileSizeValue = 0.0
do{
try fileSizeValue = (fileURL?.resourceValues(forKeys: [URLResourceKey.fileSizeKey]).allValues.first?.value as! Double?)!
if fileSizeValue > 0.0 {
fileSize = (Double(fileSizeValue) / (1024 * 1024))
}
} catch {
print("file size error: \(error)")
}
}
return fileSize
}
let fileSize = fileSize(forURL: selectedVideos[0] as Any)
视频文件网址:“file:///var/mobile/Media/DCIM/107APPLE/IMG_7728.MOV”
错误: Error Domain=NSCocoaErrorDomain Code=257 "无法打开文件“IMG_7728.MOV”,因为您没有权限 看看吧。” UserInfo={NSURL=file:///var/mobile/Media/DCIM/107APPLE/IMG_7728.MOV, NSFilePath=/var/mobile/Media/DCIM/107APPLE/IMG_7728.MOV, NSUnderlyingError=0x1c445ef90 {错误域=NSPOSIXErrorDomain 代码=1 "不允许操作"}}
编辑: 我已将 url 更改为路径。但仍然显示错误:
let selectedFilePath = (selectedVideos[0] as! URL).path
print("video path: \(selectedFilePath)")
do{
let attributes = try FileManager.default.attributesOfItem(atPath: selectedFilePath)
let fileSize = attributes[.size] as! NSNumber
print("file size: \(fileSize)")
} catch {
print("file size error: \(error)")
}
let filePath = get_directory().appendingPathComponent("video\(CACurrentMediaTime()).MOV")
print("copy to path: \(filePath.path)")
do {
try FileManager.default.copyItem(atPath: selectedFilePath, toPath: filePath.path)
} catch {
print("copy error: \(error)")
}
错误:
视频路径:/var/mobile/Media/DCIM/107APPLE/IMG_7789.MOV
文件大小错误:Error Domain=NSCocoaErrorDomain Code=257 “无法打开文件“IMG_7789.MOV”,因为您没有查看权限。” UserInfo={NSFilePath=/var/mobile/Media/DCIM/107APPLE/IMG_7789.MOV, NSUnderlyingError=0x1c0259530 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not allowed"}}
复制到路径:/var/mobile/Containers/Data/Application/5AAD29BD-489D-4737-AA98-E6131EFBA94D/Documents/addMusicToVideos/voices/video1171047.69338271.MOV
复制错误:Error Domain=NSCocoaErrorDomain Code=257 “无法打开文件“IMG_7789.MOV”,因为您没有查看权限。” UserInfo={NSFilePath=/var/mobile/Media/DCIM/107APPLE/IMG_7789.MOV, NSUnderlyingError=0x1c4859830 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not allowed"}}
【问题讨论】:
-
你必须使用
url.path -
谢谢兄弟,我已经改了,但仍然显示错误。我已添加有关此问题的信息。
-
不相关,但为什么
urlAny虽然只有URL或String是预期的?那太糟了。在设计时做好功课并将类型声明为URL。然后编译器会告诉您要传递字符串(或其他内容)的所有位置,您可以通过在调用函数之前创建 URL 来修复代码。这避免了不必要且昂贵的运行时检查。即使是第二个函数,它接受一个字符串,创建 URL 并调用该函数也更有效。 -
@vadian 是的,同意你的看法。但是为了我的应用程序的目的,我必须保留它。 :(
-
你用什么来选择电影?是 UIDocumentPickerController 吗?