概述
在iOS中如果想要獲取手機相冊裏面的圖片或者視頻的話就要用到系統自帶的AssetsLibrary
框架,AssetsLibrary.framework
中包含以下文件
#import <AssetsLibrary/ALAsset.h>
#import <AssetsLibrary/ALAssetsFilter.h>
#import <AssetsLibrary/ALAssetsGroup.h>
#import <AssetsLibrary/ALAssetsLibrary.h>
#import <AssetsLibrary/ALAssetRepresentation.h>
ALAsset.h
從本地相冊獲取的圖片或者視頻的對象都是ALAsset
類型的對象。ALAssetsFilter
顧名思義是對本地所有資源的過濾篩選,可以選擇只獲取照片,只獲取視頻,或者獲取所有的資源。ALAssetsGroup
本地相冊分組對象,本地有多少個相薄就會有幾個ALAssetsGroup
類型的對象。ALAssetsLibrary
本地資源庫對象ALAssetRepresentation
ALAssetRepresentation
對象來獲取視頻或者圖片的url,文件名,二進制數據,封面縮略圖等
AssetsLibrary使用
使用前導入AssetsLibrary.framework
#import <AssetsLibrary/AssetsLibrary.h>
獲取本地所有相薄
初始化ALAssetsLibrary
對象並使用下面的方法來獲取本地所有相薄
- (void)enumerateGroupsWithTypes:(ALAssetsGroupType)types usingBlock:(ALAssetsLibraryGroupsEnumerationResultsBlock)enumerationBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock
types
相薄分組類型
ALAssetsGroupType
蘋果官方文檔定義如下
enum {
ALAssetsGroupLibrary NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = (1 << 0),
// The Library group that includes all assets.
ALAssetsGroupAlbum NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = (1 << 1),
// All the albums synced from iTunes or created on the device.
ALAssetsGroupEvent NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = (1 << 2),
// All the events synced from iTunes.
ALAssetsGroupFaces NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = (1 << 3),
// All the faces albums synced from iTunes.
ALAssetsGroupSavedPhotos NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = (1 << 4),
// The Saved Photos album.
#if __IPHONE_5_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED
ALAssetsGroupPhotoStream NS_ENUM_DEPRECATED_IOS(5_0, 9_0) = (1 << 5),
// The PhotoStream album.
#endif
ALAssetsGroupAll NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = 0xFFFFFFFF,
// The same as ORing together all the available group types,
};
enumerationBlock
對本地相薄進行遍歷並返回遍歷結果
ALAssetsLibraryGroupsEnumerationResultsBlock
定義如下
ALAssetsLibraryGroupsEnumerationResultsBlock resultBlock = ^(ALAssetsGroup *group,BOOL *stop) {};
failureBlock
遍歷失敗
ALAssetsLibraryAccessFailureBlock
定義如下
ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) {};
代碼示例
typedef void (^albumGroupsBlock)(NSMutableArray *groups);
-(void)setupAlbumGroups:(albumGroupsBlock)albumGroups //獲取所有相薄成功後回調
{
NSMutableArray *groups = @[].mutableCopy; //所有相薄數組
ALAssetsFilter* assstsFilter = [ALAssetsFilter allAssets]; //篩選器獲取所有資源
ALAssetsLibraryGroupsEnumerationResultsBlock resultBlock = ^(ALAssetsGroup *group, BOOL *stop){ //每次遍歷成功後回調
if (group) {
[group setAssetsFilter:assstsFilter];
NSInteger groupType = [[group valueForProperty:ALAssetsGroupPropertyType] integerValue];
if (groupType == ALAssetsGroupSavedPhotos) {
[groups insertObject:group atIndex:0]; //默認相機膠捲放入數組第一位
}
else
{
if (group.numberOfAssets>0) {
[groups addObject:group];
}
}
}
else //當返回的group爲nil表示已經遍歷結束
{
if (albumGroups) {
albumGroups([groups copy]);
}
}
};
ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) {
if (albumGroups) { //遍歷失敗回調
albumGroups([groups copy]);
}
};
;
[[[ALAssetsLibrary alloc] init] enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:resultBlock failureBlock:failureBlock]; //開始遍歷
}
獲取本地每個相薄中的資源
初始化ALAssetsGroup
對象並使用下面的方法來獲取相薄中的資源
- (void)enumerateAssetsWithOptions:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock
options
遍歷相薄中資源的順序
NSEnumerationOptions
定義如下
typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions) {
NSEnumerationConcurrent = (1UL << 0), // 併發讀取相冊中的資源,順序不確定
NSEnumerationReverse = (1UL << 1), //倒序讀取相冊中的資源
};
enumerationBlock
對相薄裏資源進行遍歷並返回遍歷結果
ALAssetsGroupEnumerationResultsBlock resultBlock = ^(ALAsset *asset, NSUInteger index, BOOL *stop) {};
代碼示例
typedef void (^albumAssetsBlock)(NSMutableArray *assets);
-(void)setupAlbumAssets:(ALAssetsGroup *)group withAssets:(albumAssetsBlock)albumAssets
{
NSMutableArray *assets = @[].mutableCopy; //相薄中所有資源數組
ALAssetsFilter* assstsFilter = [ALAssetsFilter allAssets]; //篩選器獲取所有資源
[group setAssetsFilter:assstsFilter]; //相冊內資源總數
NSInteger assetCount = [group numberOfAssets]; //相薄中資源總數
ALAssetsGroupEnumerationResultsBlock resultBlock = ^(ALAsset *asset, NSUInteger index, BOOL *stop) { //資源爲ALAsset類型對象
if (asset) {
[assets addObject:asset];
NSString *assetType = [asset valueForProperty:ALAssetPropertyType];
if ([assetType isEqualToString:ALAssetTypePhoto]) {
//資源類型爲圖片
}
else if ([assetType isEqualToString:ALAssetTypeVideo]) {
//資源類型爲視頻
}
}
else if (assets.count >= assetCount)
{
if (albumAssets) {
albumAssets([assets copy]);
}
};
};
[group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:resultBlock];
//開始遍歷相薄中資源
}