iOS 照片库读取权限
Posted
技术标签:
【中文标题】iOS 照片库读取权限【英文标题】:iOS Photo Library read access 【发布时间】:2015-02-08 18:55:56 【问题描述】:在用户允许我们访问他的相机胶卷之后。我们想从我们的应用程序中获取数据并将其上传到我们的服务。 有没有办法从文件中访问视频数据?打开视频文件的唯一方法是创建一个 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"
【问题讨论】:
您应该能够从 AVAsset 获取 URL,然后将其传递给您的上传者。我已经有一段时间没有看过这个了。看看我的问题/答案。我认为有人提出了一些可能对你有用的建议。 我用我用来尝试访问 URL 的代码更新了我的问题。我尝试了 2 种技术:NSFileManager 和 NSFileCoordinator 见***.com/a/26144019/1050482 据我所知,这并不能解决问题。我可以从 PHAsset 中检索 AVURLAsset 并从生成的 URL 中读取(例如,读入 NSData 对象)。但是尝试从该 URL 创建 NSURLSessionUploadTask 会引发错误:Failed to issue sandbox extension for file file:///var/mobile/Media/DCIM/100APPLE/IMG_0730.MOV, errno = 1
。这是问题的核心。 @mvo 介意将这个细节添加到问题中吗?有人有解决方法吗?我的共享应用组设置正确...
【参考方案1】:
感谢保罗的建议,我想通了:
您必须在该块中创建一个 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.")
【讨论】:
查看对上述问题的评论...读入 NSData 对象有效,但尝试从 AVURLAsset 的 URL 创建 NSURLSessionUploadTask 会引发错误:Failed to issue sandbox extension for file file:///var/mobile/Media/DCIM/100APPLE/IMG_0730.MOV, errno = 1
。关于如何解决这个问题或为什么会发生的任何想法?
Tumblr 看到了类似的错误,尽管 URL 构造不同:github.com/tumblr/ios-extension-issues/blob/master/samples/…
我收到与 Alfie 相同的错误消息:“无法为文件发出沙盒扩展...”。有什么解决办法吗?【参考方案2】:
关于问题:
Failed to issue sandbox extension for file file:///var/mobile/Media/DCIM/100APPLE/IMG_0730.MOV, errno = 1
我解决此问题的方法是创建一个临时路径,以便我能够访问媒体文件:
Future<void> loadAssets() async
List<Asset> resultList = <Asset>[];
String error = 'No Error Detected';
final temp = await Directory.systemTemp.create();
List<File> imagesFileList = [];
try
resultList = await MultiImagePicker.pickImages(
maxImages: 300,
enableCamera: true,
selectedAssets: imagesAssetsList,
cupertinoOptions: CupertinoOptions(takePhotoIcon: "chat"),
materialOptions: MaterialOptions(
actionBarColor: "#abcdef",
actionBarTitle: "Example App",
allViewTitle: "All Photos",
useDetailsView: false,
selectCircleStrokeColor: "#000000",
),
);
on Exception catch (e)
error = e.toString();
if (!mounted) return;
for (int i = 0; i < resultList.length; i++)
final data = await resultList[i].getByteData();
imagesFileList.add(await File('$temp.path/img$i').writeAsBytes(
data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes)));
print('pathnew: $imagesFileList[i].path');
await uploadFileToStorage(imagesFileList[i].path);
setState(()
imagesAssetsList = resultList;
_error = error;
);
我希望它会起作用!
【讨论】:
以上是关于iOS 照片库读取权限的主要内容,如果未能解决你的问题,请参考以下文章
那些手机app后台读取用户相册,是人工读取还是系统读取?我刚拍了些照片,就给我推相关的视频跟内容
读取权限后直接请求发布权限 - 适用于 iOS 6 的 Facebook SDK
Android7.0调用系统相机拍照读取系统相册照片+CropImageView剪裁照片