0

无论如何我可以使用从返回的路径"PHImageFileURLKey"进入照片库并检索图像吗?

返回的路径格式如下:

"file:///var/mobile/Media/DCIM/102APPLE/IMG_2607.JPG"

我的计划是将此路径存储在数据库中,并在需要取回图像时使用它来获取图像。

任何帮助表示赞赏。谢谢!

4

2 回答 2

9

我认为您从 URL 中检索 Photo Kit 资产的解决方案是错误的。

这是我要做的(假设您可以访问 PHAsset):

存储本地标识符:

PHAsset *asset = /*Your asset */
NSString *localIdentifier = asset.localIdentifier;

//Now save this local identifier, or an array of them

当需要检索它们时,您只需执行以下操作:

PHFetchResult *savedAssets = [PHAsset fetchAssetsWithLocalIdentifiers:savedLocalIdentifiers options:nil];
[savedAssets enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
    //this gets called for every asset from its localIdentifier you saved
}];

如果您只能访问“PHImageFileURLKey”,请忽略此答案。

于 2015-03-05T12:21:26.313 回答
2

这没有记录,所以我强烈建议不要将该 URL 用于原型应用程序以外的任何内容。也就是说,这似乎确实有效:

dispatch_queue_t queue = dispatch_queue_create("photoLoadQueue", 0);
dispatch_async(queue, ^{
    NSURL *privateUrl = [NSURL URLWithString:@"file:///var/mobile/Media/DCIM/102APPLE/IMG_2607.JPG";
    NSData *imageData = [NSData dataWithContentsOfURL:privateUrl];
    dispatch_async(dispatch_get_main_queue(), ^{
        self.imageView.image = [UIImage imageWithData:imageData];
    });
});

当然,您需要将用于启动 url 的字符串替换为对您的手机有效的字符串。

这样做可能会有很多问题——这不是框架的使用方式。以下是我的一些想法:

  1. 在模拟器中运行时,根路径会在应用程序启动之间定期更改,因此如果您像这样存储 absoluteUrls,您的数据库将很快充满死 URL。这至少可以说是不方便的。
  2. 更糟糕的是,图像的 URL 可能会在真实设备上发生变化——你无法控制它,一旦它们发生变化,让用户重新选择它们或其他什么都是你的应用程序的错。
  3. 您永远不会发现PHAsset照片来源的变化。
  4. 这可能会绕过用户访问照片的权限 - 如果您的应用访问照片的权限被撤销会怎样?然而,这可能是许多存储照片供以后使用的方法的问题。
  5. 你不控制文件——如果用户删除它怎么办?

如果我是你,我会从照片框架中正确检索图像,使用PHImageManager requestImageForAsset: targetSize: contentMode: options: resultHandler:,并将其存储在你的应用程序目录中的一个文件中,无论你用它做什么,都以合理的分辨率存储它。这仍然不会给您带来资产更改,但这是一个很好的解决方案。

如果您想自己存储资产并仅在实际需要时才请求图像,则可能值得研究瞬态资产集合,尽管我没有使用它们,因此可能无法满足您的需求。

于 2014-11-23T08:56:38.667 回答