使用照片框架获取带有本地标识符的相册

Posted

技术标签:

【中文标题】使用照片框架获取带有本地标识符的相册【英文标题】:Fetch Album with local Identifier using Photos Framework 【发布时间】:2015-02-09 17:37:14 【问题描述】:

我正在跟踪用户从哪个相册中选择了一张照片,并将其作为字符串 (albumName) 传递给下一个 VC。

我只想获取该相册中的照片以供进一步选择和处理。

这是我认为可以解决问题的方法,但我一定错过了一些东西:

-(void) fetchImages
    self.assets = [[PHFetchResult alloc]init];
        NSLog(@"Album Name:%@",self.albumName);

    if (self.fromAlbum) 


        PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[self.albumName]    options:nil];
        PHAssetCollection *collection = userAlbums[0];

        PHFetchOptions *onlyImagesOptions = [PHFetchOptions new];
        onlyImagesOptions.predicate = [NSPredicate predicateWithFormat:@"mediaType = %i", PHAssetMediaTypeImage];

        NSLog(@"Collection:%@", collection.localIdentifier);

        self.assets = [PHAsset fetchAssetsInAssetCollection:collection options:onlyImagesOptions];

.....

当我登录collection.localIdentifier 时,我得到null,因此没有获取任何收藏/专辑。

我错过了什么/搞砸了什么?

谢谢

【问题讨论】:

【参考方案1】:

专辑名称不是本地标识符,这就是 fetchAssetCollectionsWithLocalIdentifiers 方法返回 nil 的原因。 此外,相册的名称不是唯一的,并且可以创建多个同名的相册,因此在这种情况下,您的应用可能无法正常运行。 我猜您之前已获取资产集合并将其'localizedTitle 保存在字符串albumName 中。 我建议您保留并使用资产集合的localIdentifier 而不是localizedTitle 并将其传递给VC。然后,您将能够使用该标识符轻松获取资产。

 //Assume we have previously done this to fetch album name and identifier
 PHFetchResult * myFirstFetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil];
 PHAssetCollection * myFirstAssetCollection = myFirstFetchResult.firstObject;
 NSString * albumName = myFirstAssetCollection.localizedTitle;
 NSString * albumIdentifier = myFirstAssetCollection.localIdentifier;    //<-Add this...

 //Pass albumIdentifier to VC...

 //Inside your 'fetchImages' method use this to get assetcollection from passed albumIdentifier
 PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[self.albumIdentifier] options:nil];
 PHAssetCollection *collection = userAlbums.firstObject;
 //Now you have successfully passed and got asset collection and you can use

【讨论】:

【参考方案2】:

如果您尝试按专辑名称获取收藏,请使用下面的代码

    PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
    fetchOptions.predicate = [NSPredicate predicateWithFormat:@"title = %@", albumNamed];
    PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum
                                                           subtype:PHAssetCollectionSubtypeAny
                                                           options:fetchOptions];

PHAssetCollection *collection = fetchResult.firstObject;

【讨论】:

title 属性是什么?看起来像私有 API

以上是关于使用照片框架获取带有本地标识符的相册的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IOS 中查找照片资产的标识符

在不加载 PHAsset us 照片库的情况下获取所有图像本地标识符/文件路径

如何正确使用带有本地标识符的获取资产?

安卓从手机相册获取照片作为头像缓存地址

带有 PHAsset 的 SDWebImage

iPhone:照片框架:如何仅获取由我的应用程序创建的那些相册/图像,而不是由其他人创建的?