获取相册和照片信息的PHPhotoLibrary

时间:2016-01-20 16:55:34

标签: objective-c photokit phphotolibrary

我正在尝试使用PHPhotoLibrary获取所有相册/照片的信息。我几乎不知道目标C,我看了一些教程/样本但找不到我需要的所有内容。

以下是基于我的代码的示例代码的链接。 https://developer.apple.com/library/ios/samplecode/UsingPhotosFramework/Introduction/Intro.html#//apple_ref/doc/uid/TP40014575-Intro-DontLinkElementID_2

到目前为止,我能够获得专辑名称和标识符。我得到了一张照片列表,我也可以获得他们的标识符,但不是文件名。但是如果我在我的函数中设置一个断点并查看我的PHAsset指针值,我可以在那里看到文件名(在_filename中),但是如果我尝试调用带有文件名的变量,则该变量不存在。 / p>

因此,如果任何人都可以提供示例代码来获取相册/照片/缩略图上的所有信息,这将非常棒。或者只是获取文件名将是一个很好的帮助。

这是我到目前为止尝试过的代码:

-(void)awakeFromNib{
    NSMutableArray *allPhotos = self.getAllPhotos;
    for (int x = 0; x < allPhotos.count; x ++)
    {
        PHAsset *photo = [self getPhotoAtIndex:x];
        PHAssetSourceType source = photo.sourceType;
        NSString *id = photo.localIdentifier;
        NSString *description = photo.description;
        NSUInteger height = photo.pixelHeight;
        NSUInteger width = photo.pixelWidth;
        NSLog(@"Test photo info");
    }
}

-(PHAsset*) getPhotoAtIndex:(NSInteger) index
{
    return [self.getAllPhotos objectAtIndex:index];
}

-(NSMutableArray *) getAllPhotos
{
    NSMutableArray *photos = [[NSMutableArray alloc] init];
    PHFetchOptions *allPhotosOptions = [[PHFetchOptions alloc] init];
    allPhotosOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
    PHFetchResult *allPhotos = [PHAsset fetchAssetsWithOptions:allPhotosOptions];
    PHFetchResult *fetchResult = @[allPhotos][0];

    for (int x = 0; x < fetchResult.count; x ++) {

        PHAsset *asset = fetchResult[x];
        photos[x] = asset;
    }

    return photos;
}

正如您所看到的,我可以获取图像的高度和宽度,它的ID,但无法获取它的URL。

2 个答案:

答案 0 :(得分:0)

我找到了一种获取照片网址的方法。

-(void)getImageURL:(PHAsset*) asset
{    
    PHContentEditingInputRequestOptions *options = [[PHContentEditingInputRequestOptions alloc] init];
    [options setCanHandleAdjustmentData:^BOOL(PHAdjustmentData *adjustmentData) {
        return [adjustmentData.formatIdentifier isEqualToString:AdjustmentFormatIdentifier] && [adjustmentData.formatVersion isEqualToString:@"1.0"];
    }];
    [asset requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info)
    {
        NSURL* url = contentEditingInput.fullSizeImageURL;
    }];
}

答案 1 :(得分:0)

照片库中的文件名是一个实现细节,可能会有所变化。有各种用于发现它们的私有API(或使用valueForKey或其他公共内省API的方法来查找它们隐藏的位置),它们不是可依赖的东西。特别是,已编辑的资源可能与原始文件的文件名不同。

您需要什么文件名/网址?如果您只是在应用启动时唯一标识资产,请使用localIdentifier。如果您向用户显示...为什么?像IMG_0234.jpg和IMG_5672.jpg这样的东西对普通用户来说没什么意义。

要获取特定相册中的资源,请使用fetchAssetsInAssetCollection:options:。要获取包含特定资产的相册,请使用fetchAssetCollectionsContainingAsset:withType:options:。要发现相册列表,请使用this post及其超类PHAssetCollection上的其他API。