iOS照片库读取访问
在用户允许我们访问他的相机卷之后。我们想从我们的应用程序中获取数据并上传到我们的服务中。 有没有办法从文件中访问视频数据?打开视频文件的唯一方法是创建一个AVAsset。但这对我来说还不够 我知道了iOS照片库读取访问,ios,photokit,Ios,Photokit,在用户允许我们访问他的相机卷之后。我们想从我们的应用程序中获取数据并上传到我们的服务中。 有没有办法从文件中访问视频数据?打开视频文件的唯一方法是创建一个AVAsset。但这对我来说还不够 我知道了 func requestExportSessionForVideo(_ asset: PHAsset!, options options: PHVideoRequestOptions!, exportPreset expo
func requestExportSessionForVideo(_ asset: PHAsset!,
options options: PHVideoRequestOptions!,
exportPreset exportPreset: String!,
resultHandler resultHandler: ((AVAssetExportSession!,
[NSObject : AnyObject]!) -> Void)!) -> PHImageRequestID
但就我而言,我只想将视频上传到我们的服务,我不想这样做:
var anAcces = sourceURL?.startAccessingSecurityScopedResource
if !NSFileManager.defaultManager().fileExistsAtPath(sourceURL!.path!) {
NSLog("not exist")
}
var aFileCoordinator = NSFileCoordinator(filePresenter:nil)
var anError: NSError?
aFileCoordinator.coordinateReadingItemAtURL(sourceURL!, options:.ForUploading, error:&anError, byAccessor: { (newURL: NSURL!) -> Void in
var data = NSData(contentsOfURL: newURL)
})
if let unError = anError {
NSLog("Error \(unError)")
}
sourceURL?.stopAccessingSecurityScopedResource
这将记录以下内容:
2015-02-08 16:20:01.947 Cameo[15706:2288691] not exist
2015-02-08 16:20:01.991 Cameo[15706:2288691] Error Error Domain=NSCocoaErrorDomain Code=257 "The operation couldn’t be completed. (Cocoa error 257.)" UserInfo=0x170876480 {NSURL=file:///var/mobile/Media/DCIM/100APPLE/IMG_0155.MOV, NSFilePath=/var/mobile/Media/DCIM/100APPLE/IMG_0155.MOV, NSUnderlyingError=0x17005a9a0 "The operation couldn’t be completed. Operation not permitted"}
多亏了保罗的建议,我才明白: 您必须在该块中创建PHImageManager requestAVAssetForVideo会话—您可以访问该文件并从url读取其数据
let imageManager = PHImageManager.defaultManager()
let videoRequestOptions = PHVideoRequestOptions()
videoRequestOptions.deliveryMode = .HighQualityFormat
videoRequestOptions.version = .Current
videoRequestOptions.networkAccessAllowed = true
videoRequestOptions.progressHandler = { (progress: Double, error: NSError!, stop: UnsafeMutablePointer<ObjCBool>, [NSObject : AnyObject]!) -> Void in
NSLog("Progress: %@", progress.description)
}
videoRequestOptions.progressHandler = { (progress: Double, error: NSError!, stop: UnsafeMutablePointer<ObjCBool>, [NSObject : AnyObject]!) -> Void in
NSLog("Progress: %@", progress.description)
}
imageManager.requestAVAssetForVideo(nextAsset, options: videoRequestOptions, resultHandler: { (avAsset: AVAsset!, avAudioMix: AVAudioMix!, info: [NSObject : AnyObject]!) -> Void in
if let nextURLAsset = avAsset as? AVURLAsset {
let sourceURL = nextURLAsset.URL
if NSFileManager.defaultManager().fileExistsAtPath(sourceURL.path!) {
NSLog("exist file")
}
var data = NSData(contentsOfURL: sourceURL)
if let aData = data {
NSLog("length : <\(aData.length)")
}
else {
NSLog("no data read.")
}
}
}
let-imageManager=PHImageManager.defaultManager()
让videoRequestOptions=PHVideoRequestOptions()
videoRequestOptions.deliveryMode=.HighQualityFormat
videoRequestOptions.version=.Current
videoRequestOptions.networkAccessAllowed=true
videoRequestOptions.progressHandler={(进度:双精度,错误:NSError!,停止:UnsafeMutablePointer,[NSObject:AnyObject]!)->Void in
NSLog(“进度:%@”,进度说明)
}
videoRequestOptions.progressHandler={(进度:双精度,错误:NSError!,停止:UnsafeMutablePointer,[NSObject:AnyObject]!)->Void in
NSLog(“进度:%@”,进度说明)
}
imageManager.requestAVAssetForVideo(下一集,选项:videoRequestOptions,结果文件夹:{(avAsset:avAsset!,avAudioMix:avAudioMix!,信息:[NSObject:AnyObject]!)->
如果让Nexturasset=avAsset为?AVURLAsset{
让sourceURL=nexturasset.URL
如果NSFileManager.defaultManager().fileExistsAtPath(sourceURL.path!){
NSLog(“存在文件”)
}
var data=NSData(contentsofull:sourceURL)
如果让aData=数据{
NSLog(“长度:关于问题:
未能为文件颁发沙盒扩展名file:///var/mobile/Media/DCIM/100APPLE/IMG_0730.MOV,errno=1
我解决此问题的方法是创建一个临时路径,以便访问媒体文件:
Future loadAssets()异步{
列表结果列表=[];
字符串错误='未检测到错误';
final temp=wait Directory.systemTemp.create();
列表图像文件列表=[];
试一试{
结果列表=等待MultiImagePicker.pickImages(
最高限额:300,
启用摄像头:正确,
所选资产:图像资产列表,
cupertinoOptions:cupertinoOptions(takePhotoIcon:“聊天”),
材质选项:材质选项(
actionBarColor:#abcdef“,
actionBarTitle:“示例应用程序”,
allViewTitle:“所有照片”,
useDetailsView:false,
选择CircleStrokeColor:#000000,
),
);
}关于异常捕获(e){
错误=e.toString();
}
如果(!已安装)返回;
for(int i=0;i
我希望它能起作用!你应该能够从AVAsset获得一个URL,然后将其传递给你的上传程序。我已经有一段时间没有看到这个了。看看我的问题/答案。我想有人提出了一些可能对你有用的建议。我用尝试访问URL的代码更新了我的问题。我尝试了两种技术:NSFileManager and NSFileCoordinator据我所知,这并不能解决问题。我可以从PHAsset中检索AVURLSete并从结果URL中读取(例如,读入NSData对象)。但尝试从该URL创建NSURLSessionUploadTask会引发错误:未能为文件发出沙盒扩展名file:///var/mobile/Media/DCIM/100APPLE/IMG_0730.MOV,errno=1
。这是问题的核心。@mvo介意将此细节添加到问题中吗?有人对此有解决方法吗?我的共享应用程序组已设置为操作性…请参阅以上问题的评论…读取NSData对象有效,但尝试从AVURLAsset的URL创建NSURLSessionUploadTask会引发错误:未能为文件发出沙盒扩展名file:///var/mobile/Media/DCIM/100APPLE/IMG_0730.MOV,errno=1
。有没有关于如何解决这个问题或为什么会这样的想法urring?Tumblr也看到了类似的错误,尽管URL的构造不同:我收到了与Alfie相同的错误消息:“未能为文件发布沙盒扩展名…”。有什么解决方案吗?