一、概述
AssetsLibrary框架:从iOS4.0开始提供,可以通过它获取设备里的图片和视频等资料,以API的方式提供,而且界面式的,比UIImagePickerViewController灵活很多。既可以读又可以写。
二、读取资料库中的全部资料
1.大概步骤,首先通过ALAssetsLibrary获取group,然后再获取每个group中的每个ALAsset,通过ALAsset获取图片或者视频链接。
2.获取全部资料(ALAsset)以及链接:
NSMutableArray *assetGroups = [[NSMutableArray alloc] init];
void (^assetGroupEnumerator) (struct ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop{
if(group != nil) {
[assetGroups addObject:group];
}
};
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
NSUInteger groupTypes = ALAssetsGroupAll;
[library enumerateGroupsWithTypes:groupTypes usingBlock:assetGroupEnumerator failureBlock:nil];
[library release];
NSMutableArray *assets = [[NSMutableArray alloc] init];
NSMutableArray *assetURLArray = [[NSMutableArray alloc] init];
void (^assetEnumerator) (struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
if(result != nil) {
if(![assetURLArray containsObject:[result valueForProperty:ALAssetPropertyURLs]]) {
if(![[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo]) {
[assetURLArray addObject:[result valueForProperty:ALAssetPropertyURLs]];
[assets addObject:result];
}
}
}
};
for (ALAssetsGroup *group in assetGroups) {
[group enumerateAssetsUsingBlock:assetEnumerator];
}
3.通过ALAsset链接获取图片或者视频内容
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *returnAsset){
//获取资料的缩略图,图片视频通用
UIImage *image = [UIImage imageWithCGImage:returnAsset.defaultRepresentation.fullResolutionImage];
//针对图片或者视频做自定义处理
NSString *type = [returnAsset valueForProperty:ALAssetPropertyType];
if([type isEqualToString:ALAssetTypePhoto]){
}else if([type isEqualToString:ALAssetTypeVideo]){
//获取视频时长
NSNumber *duration = [returnAsset valueForProperty:ALAssetPropertyDuration]
}
};
NSString *assetURL = [assetURLArray objectAtIndex:0];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:[NSURL URLWithString:assetURL] resultBlock:resultblock failureBlock:nil];
[library release];
4.有时候有些视频资料没有写入资料库,但是我们仍然需要获取视频的时长。这时候我们就不能用第3条中提到的API来获取视频长度,我们可以采用AVFoundation框架中的一个类:AVURLAsset。
代码如下:
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
CMTime ctTime = asset.duration;
[asset release];
NSInteger totalSeconds = ctTime.value / ctTime.timescale;
三、将本地图片或者视频写入资料库
1.步骤:调用ALAssetsLibrary将视频或者图片写入资料库,写入成功之后,返回一个URL链接。
2.代码:
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
if([cacheFilePath rangeOfString:@"jpg" options:NSCaseInsensitiveSearch].length > 0 ||
[cacheFilePath rangeOfString:@"png" options:NSCaseInsensitiveSearch].length > 0)
{
UIImage *image = [UIImage imageWithContentsOfFile:cacheFilePath];
[library writeImageToSavedPhotosAlbum:image.CGImage metadata:nil completionBlock:^(NSURL *assetURL, NSError *error){
NSString *assetUrlString = assetURL.absoluteString;
//根据需求做相应动作,比如保存这个链接
}];
}else{
NSURL *cacheURL = [NSURL URLWithString:cacheFilePath];
[library writeVideoAtPathToSavedPhotosAlbum:cacheURL completionBlock:^(NSURL *assetURL, NSError *error){
NSString *assetUrlString = assetURL.absoluteString;
//根据需求做相应动作,比如保存这个链接
}];
}
[library release];