zjf
2023-03-06 392b76515f40376b6d36f40a114850ef63650384
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
//
//  XFPhotoLibraryManager.m
//  WeChatVideoDemo
//
//  Created by xf-ling on 2017/6/15.
//  Copyright © 2017年 LXF. All rights reserved.
//
 
#import "LXFPhotoLibraryManager.h"
#import <Photos/Photos.h>
#import <AssetsLibrary/AssetsLibrary.h>
 
@implementation LXFPhotoLibraryManager
 
/**
 *  请求照片权限,注意,强烈要求用户获得照片权限,否则视频写入照片会有崩溃
 */
+ (void)requestALAssetsLibraryAuthorizationWithCompletion:(RequestAssetsLibraryAuthCompletion)requestAssetsLibraryAuthCompletion
{
    PHAuthorizationStatus authStatus = [PHPhotoLibrary authorizationStatus];
    if (authStatus != PHAuthorizationStatusAuthorized) // 未授权
    {
        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
            if (status != PHAuthorizationStatusAuthorized)  //已授权
            {
                NSLog(@"用户拒绝访问相册!");
                if (requestAssetsLibraryAuthCompletion)
                {
                    requestAssetsLibraryAuthCompletion(NO);
                }
            }
            else
            {
                NSLog(@"用户允许访问相册!");
                if (requestAssetsLibraryAuthCompletion)
                {
                    requestAssetsLibraryAuthCompletion(YES);
                }
            }
        }];
    }
    else
    {
        // nothing
    }
}
 
/**
 *  保存照片
 *
 *  @param image                UImage
 *  @param assetCollectionName  相册名字,不填默认为app名字+相册
 */
+ (void)savePhotoWithImage:(UIImage *)image andAssetCollectionName:(NSString *)assetCollectionName withCompletion:(SavePhotoCompletionBlock)savePhotoCompletionBlock
{
    if (assetCollectionName == nil)
    {
        NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
        
        assetCollectionName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
        
        if (assetCollectionName == nil)
        {
            assetCollectionName = @"管理平台";
        }
    }
    __block NSString *blockAssetCollectionName = assetCollectionName;
    __block UIImage *blockImage = image;
    PHPhotoLibrary *library = [PHPhotoLibrary sharedPhotoLibrary];
    dispatch_async(dispatch_get_main_queue(), ^{
        NSError *error = nil;
        __block NSString *assetId = nil;
        __block NSString *assetCollectionId = nil;
        // 1. 存储图片到"相机胶卷"管理平台
        [library performChangesAndWait:^{
            assetId = [PHAssetCreationRequest creationRequestForAssetFromImage:blockImage].placeholderForCreatedAsset.localIdentifier;
        } error:&error];
        NSLog(@"error1: %@", error);
        
        // 2. 获得相册对象
        // 获取曾经创建过的自定义视频相册名字
        PHAssetCollection *createdAssetCollection = nil;
        PHFetchResult <PHAssetCollection*> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
        for (PHAssetCollection *assetCollection in assetCollections)
        {
            if ([assetCollection.localizedTitle isEqualToString:blockAssetCollectionName])
            {
                createdAssetCollection = assetCollection;
                break;
            }
        }
        //如果这个自定义框架没有创建过
        if (createdAssetCollection == nil)
        {
            //创建新的[自定义的 Album](相簿\相册)
            [library performChangesAndWait:^{
                
                assetCollectionId = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:blockAssetCollectionName].placeholderForCreatedAssetCollection.localIdentifier;
                
            } error:&error];
            
            NSLog(@"error2: %@", error);
            
            //抓取刚创建完的视频相册对象
            createdAssetCollection = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[assetCollectionId] options:nil].firstObject;
        }
        // 将【Camera Roll】(相机胶卷)的视频 添加到【自定义Album】(相簿\相册)中
        [library performChangesAndWait:^{
            PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdAssetCollection];
            
            [request addAssets:[PHAsset fetchAssetsWithLocalIdentifiers:@[assetId] options:nil]];
            
        } error:&error];
        NSLog(@"error3: %@", error);
        // 提示信息
        if (savePhotoCompletionBlock)
        {
            if (error)
            {
                NSLog(@"保存照片失败!");
                
                savePhotoCompletionBlock(nil, error);
            }
            else
            {
                NSLog(@"保存照片成功!");
                
                savePhotoCompletionBlock(blockImage, nil);
            }
        }
    });
}
//+ (void)savePhotoWithImage:(UIImage *)image andAssetCollectionName:(NSString *)assetCollectionName withCompletion:(SavePhotoCompletionBlock)savePhotoCompletionBlock
//{
//    if (assetCollectionName == nil)
//    {
//        NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
//
//        assetCollectionName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
//
//        if (assetCollectionName == nil)
//        {
//            assetCollectionName = @"视频相册";
//        }
//    }
//
//    __block NSString *blockAssetCollectionName = assetCollectionName;
//    __block UIImage *blockImage = image;
//    __block NSString *assetId = nil;
//
//    PHPhotoLibrary *library = [PHPhotoLibrary sharedPhotoLibrary];
//
//    // 1. 存储图片到"相机胶卷"
//    [library performChanges:^{ // 这个block里保存一些"修改"性质的代码
//        // 新建一个PHAssetCreationRequest对象, 保存图片到"相机胶卷"
//        // 返回PHAsset(图片)的字符串标识
//        assetId = [PHAssetCreationRequest creationRequestForAssetFromImage:blockImage].placeholderForCreatedAsset.localIdentifier;
//    } completionHandler:^(BOOL success, NSError * _Nullable error) {
//        if (error) {
//            NSLog(@"error1%@", error);
//            return;
//        }
//
//        NSLog(@"成功保存图片到相机胶卷中");
//
//        // 2. 获得相册对象
//        // 获取曾经创建过的自定义视频相册名字
//        PHAssetCollection *createdAssetCollection = nil;
//        PHFetchResult <PHAssetCollection*> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
//        for (PHAssetCollection *assetCollection in assetCollections)
//        {
//            if ([assetCollection.localizedTitle isEqualToString:blockAssetCollectionName])
//            {
//                createdAssetCollection = assetCollection;
//                break;
//            }
//        }
//
//        //如果这个自定义框架没有创建过
//        if (createdAssetCollection == nil)
//        {
//            //创建新的[自定义的 Album](相簿\相册)
//            [library performChangesAndWait:^{
//
//                assetId = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:blockAssetCollectionName].placeholderForCreatedAssetCollection.localIdentifier;
//
//            } error:&error];
//
//            NSLog(@"error2: %@", error);
//
//            //抓取刚创建完的视频相册对象
//            createdAssetCollection = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[assetId] options:nil].firstObject;
//
//        }
//
//        // 3. 将“相机胶卷”中的图片添加到新的相册
////        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
////            PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdAssetCollection];
////
////            // 根据唯一标示获得相片对象
////            PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetId] options:nil].firstObject;
////            // 添加图片到相册中
////            [request addAssets:@[asset]];
////        } completionHandler:^(BOOL success, NSError * _Nullable error) {
////            if (error)
////            {
////                NSLog(@"添加图片到相册中失败");
////                return;
////            }
////
////            NSLog(@"成功添加图片到相册中");
////        }];
//
//        // 将【Camera Roll】(相机胶卷)的视频 添加到【自定义Album】(相簿\相册)中
//        [library performChangesAndWait:^{
//            PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdAssetCollection];
//
//            [request addAssets:[PHAsset fetchAssetsWithLocalIdentifiers:@[assetId] options:nil]];
//
//        } error:&error];
//        NSLog(@"error3: %@", error);
//        // 提示信息
//        if (savePhotoCompletionBlock)
//        {
//            if (error)
//            {
//                NSLog(@"保存照片失败!");
//
//                savePhotoCompletionBlock(nil, error);
//            }
//            else
//            {
//                NSLog(@"保存照片成功!");
//
//                savePhotoCompletionBlock(blockImage, nil);
//            }
//        }
//
//    }];
//}
 
/**
 *  保存视频
 *
 *  @param videoUrl             视频地址
 *  @param assetCollectionName  相册名字,不填默认为app名字+视频
 */
+ (void)saveVideoWithVideoUrl:(NSURL *)videoUrl andAssetCollectionName:(NSString *)assetCollectionName withCompletion:(SaveVideoCompletionBlock)saveVideoCompletionBlock
{
    if (assetCollectionName == nil)
    {
        NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
        
        assetCollectionName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
        
        if (assetCollectionName == nil)
        {
            assetCollectionName = @"管理平台";
        }
    }
    
    __block NSString *blockAssetCollectionName = assetCollectionName;
    __block NSURL *blockVideoUrl = videoUrl;
    PHPhotoLibrary *library = [PHPhotoLibrary sharedPhotoLibrary];
    
    dispatch_async(dispatch_get_main_queue(), ^{
    
        NSError *error = nil;
        __block NSString *assetId = nil;
        __block NSString *assetCollectionId = nil;
        
        // 保存视频到【Camera Roll】(相机胶卷)
        [library performChangesAndWait:^{
            
            assetId = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:blockVideoUrl].placeholderForCreatedAsset.localIdentifier;
            
        } error:&error];
        
        NSLog(@"error1: %@", error);
        
        // 获取曾经创建过的自定义视频相册名字
        PHAssetCollection *createdAssetCollection = nil;
        PHFetchResult <PHAssetCollection*> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
        for (PHAssetCollection *assetCollection in assetCollections)
        {
            if ([assetCollection.localizedTitle isEqualToString:blockAssetCollectionName])
            {
                createdAssetCollection = assetCollection;
                break;
            }
        }
        
        //如果这个自定义框架没有创建过
        if (createdAssetCollection == nil)
        {
            //创建新的[自定义的 Album](相簿\相册)
            [library performChangesAndWait:^{
                
                assetCollectionId = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:blockAssetCollectionName].placeholderForCreatedAssetCollection.localIdentifier;
                
            } error:&error];
            
            NSLog(@"error2: %@", error);
            
            //抓取刚创建完的视频相册对象
            createdAssetCollection = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[assetCollectionId] options:nil].firstObject;
            
        }
        
        // 将【Camera Roll】(相机胶卷)的视频 添加到【自定义Album】(相簿\相册)中
        [library performChangesAndWait:^{
            PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdAssetCollection];
            
            [request addAssets:[PHAsset fetchAssetsWithLocalIdentifiers:@[assetId] options:nil]];
            
        } error:&error];
        NSLog(@"error3: %@", error);
        
        // 提示信息
        if (saveVideoCompletionBlock)
        {
            if (error)
            {
                NSLog(@"保存视频失败!");
                
                saveVideoCompletionBlock(nil, error);
            }
            else
            {
                NSLog(@"保存视频成功!");
                
                saveVideoCompletionBlock(blockVideoUrl, nil);
            }
        }
        
    });
}
 
 
@end