得闲记录并回顾一下本地资源获取方式,有不正确的地方,还望指正。
需求:获取并展示iOS设备内存储的图片、音频、视频
环境:Xcode10
库:PHPhotos.h,MediaPlayer
说明:设备内图片来自于相册,视频来自于相册和媒体库,音频来于自媒体库。
头文件引用:
#import
1.判断相册权限
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
//status == PHAuthorizationStatusDenied 用户已经明确否认了权限的访问
//status == PHAuthorizationStatusRestricted 此应用程序没有被授权访问的照片数据。可能是家长控制权限
//status == PHAuthorizationStatusNotDetermined 用户尚未做出选择这个应用程序的问候
//status == PHAuthorizationStatusAuthorized 用户已经授权应用访问照片数据
}];
1.如果想获取系统创建的相册:
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
如果想获取自定义的相册:
PHFetchResult *albums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
如果二者都要,则要分别获取以上两类相册,再分别遍历;
2.遍历相册里的资源,即图片或视频
for (PHAssetCollection *collection in smartAlbums) {
//遍历获取相册
if ([collection numberOfAssets] > 0) {
//获取当前相册里所有的PHAsset,也就是图片或者视频
PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:collection options:nil];
for (NSInteger j = 0; j < fetchResult.count; j++) {
//从相册中取出照片
asset = fetchResult[j];
if (asset.mediaType == PHAssetMediaTypeImage) {
//得到一个图片类型资源
}else if (asset.mediaType == PHAssetMediaTypeVideo) {
//得到一个视频类型资源
}else if (asset.mediaType == PHAssetMediaTypeAudio) {
//音频,PHAsset的mediaType属性有三个枚举值,笔者对PHAssetMediaTypeAudio暂时没有进行处理
}
}
}
}
1.遍历媒体库中的音频;媒体库中的音频一般为音乐,可以获取专辑列表,也可以获取音频列表,下面获取的是音频列表,
- (void)browseMPMediaAudio
{
NSArray *collections = [[MPMediaQuery songsQuery] collections];
NSMutableArray *musics = [NSMutableArray array];
for (MPMediaItemCollection *collection in collections)
{
//每个collection是一个专辑,专辑里包含若干个音频
for (MPMediaItem *item in [collection items])
{
//每个item就是一个音频
}
}
}
2.遍历媒体库中的视频,
- (void)browseMPMediaVideo:(void(^)(NSArray *))videoBlock
{
MPMediaPropertyPredicate *filterPre = [MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithInt:MPMediaTypeAnyVideo] forProperty:MPMediaItemPropertyMediaType];
MPMediaQuery *query = [[MPMediaQuery alloc] init];
[query addFilterPredicate:filterPre];
NSMutableArray *temp = [NSMutableArray arrayWithCapacity:0];
for (MPMediaItem *item in [query items])
{
//每个item就是一个视频
}
}
通过以上三步,便可以获取到iOS设备本地存储的图片、音频、视频。在获取成功之后,便需要展示这些资源了。
1.相册里的图片、视频
注意:有的iPhone用户会将相册里的文件备份到iCloud上(可以在“设置”里查看“使用iCloud的应用“,”照片“开关是否打开),这时要想获取图片文件或播放视频,就需要通过网络从iCloud上拉取,代码里的networkAccessAllowed一定要设置为YES,
获取图片和视频的缩略图都可以用下面的方法
PHImageRequestOptions *opt = [[PHImageRequestOptions alloc]init];
opt.networkAccessAllowed = YES;
opt.resizeMode = PHImageRequestOptionsResizeModeExact;
//targetSize可以设置为你想要的大小
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:imageSize contentMode:PHImageContentModeDefault options:opt resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
//如果没写opt.networkAccessAllowed = YES;,这里得到的result==nil
}];
播放相册里的视频使用AVPlayer即可,播放之前要先获取视频,networkAccessAllowed 也要设置为YES
PHVideoRequestOptions *option = [[PHVideoRequestOptions alloc] init];
option.networkAccessAllowed = YES;
option.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info) {
dispatch_async(dispatch_get_main_queue(), ^{
if (progressHandler) {
progressHandler(progress, error, stop, info);
}
});
};
[[PHImageManager defaultManager] requestPlayerItemForVideo:asset options:option resultHandler:^(AVPlayerItem *playerItem, NSDictionary *info) {
//获取到的可以用于播放的视频playerItem
}];
2.播放媒体库里的视频和音频
播放媒体库的视频和视频,可以通过获取MPMediaItem对象的地址,再用AVPlayer播放
NSString* filePath = [[mediaItem valueForProperty:MPMediaItemPropertyAssetURL] absoluteString];
注意:以上获取资源的过程都应放在子线程操作