iOS照片库读取访问

iOS照片库读取访问,ios,photokit,Ios,Photokit,在用户允许我们访问他的相机卷之后。我们想从我们的应用程序中获取数据并上传到我们的服务中。 有没有办法从文件中访问视频数据?打开视频文件的唯一方法是创建一个AVAsset。但这对我来说还不够 我知道了 func requestExportSessionForVideo(_ asset: PHAsset!, options options: PHVideoRequestOptions!, exportPreset expo

在用户允许我们访问他的相机卷之后。我们想从我们的应用程序中获取数据并上传到我们的服务中。 有没有办法从文件中访问视频数据?打开视频文件的唯一方法是创建一个AVAsset。但这对我来说还不够

我知道了

func requestExportSessionForVideo(_ asset: PHAsset!,
                      options options: PHVideoRequestOptions!,
                 exportPreset exportPreset: String!,
                resultHandler resultHandler: ((AVAssetExportSession!,
                    [NSObject : AnyObject]!) -> Void)!) -> PHImageRequestID
但就我而言,我只想将视频上传到我们的服务,我不想这样做:

  • 首先将视频导出到我的本地应用程序数据中,复制视频
  • 然后将数据发送到我们的服务
  • 删除数据
  • 上述方法占用了大量额外的空间和时间,使用16GB完整iPhone的用户无法正常工作

    好的,这就是我到目前为止尝试使用的URL

    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相同的错误消息:“未能为文件发布沙盒扩展名…”。有什么解决方案吗?