应用程序崩溃:当 writeVideoAtPathToSavedPhotosAlbum 使用 ALAssetsLibrary

Posted

技术标签:

【中文标题】应用程序崩溃:当 writeVideoAtPathToSavedPhotosAlbum 使用 ALAssetsLibrary【英文标题】:App crash: when writeVideoAtPathToSavedPhotosAlbum using ALAssetsLibrary 【发布时间】:2019-01-30 14:40:13 【问题描述】:

我们正在制作一个聊天应用程序,对于视频缩略图,我们使用以下代码。但它会在随机情况下崩溃。

NSArray *arrjid = [jid componentsSeparatedByString:@"@"];
NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *strdate = [dateFormatter stringFromDate:[NSDate date]];
NSString *strname = [NSString stringWithFormat:@"%@_%@_file.mov",arrjid[0],strdate];
NSString *videoPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:strname];
[videoData writeToFile:videoPath atomically:YES];

if([[NSFileManager defaultManager] fileExistsAtPath:videoPath])

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:videoPath] completionBlock:^(NSURL *assetURL, NSError *error) 
    ];

每次它在writeVideoAtPathToSavedPhotosAlbum 行崩溃并且只给出“错误访问错误”。

有人有这方面的想法吗?

【问题讨论】:

控制台有错误信息吗? 你检查你的 ios 部署目标了吗? writeVideoAtPathToSavedPhotosAlbum:completionBlock: 仅适用于 ios 4.0-9.0 使用 phphotoLibrary 框架代替 你好,jabson,我尝试使用 PHPhotoLibrary 库但没有生成视频的缩略图,这就是我使用描述的 ALAssetsLibrary 方法的原因。我的部署目标是 iOS 10.0。因此,如果您对生成视频的 HTTP URL 缩略图有任何想法,请帮助我。 你好 Larme,不显示错误消息只会给出错误的访问权限。我们启用僵尸对象但不显示任何类型的消息。 我已经更新了我的答案,您可以使用 AVAssetImageGenerator 类从视频中生成缩略图。没有办法从 http url 生成缩略图视频应该在 iPhone 存储中 【参考方案1】:

ALAssetsLibrary 库方法 writeVideoAtPathToSavedPhotosAlbum:completionBlock: 已弃用,您可以改用 PHPhotoLibrary。

试试这个

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^
    [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL: yourVideoURlHere];
 completionHandler:^(BOOL success, NSError *error) 
    if (success) 
        //Do Something   
    
];

同时检查您是否在 info plist 中使用以下键检查您是否有照片库使用说明

NSPhotoLibraryUsageDescription

更新

要从视频中获取缩略图,您可以使用 AVFoundation 框架中的 AVAssetImageGenerator 类

- (UIImage *) thumbnailFromVideoAtURL:(NSURL *) contentURL 
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:contentURL options:nil];
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    generator.appliesPreferredTrackTransform = YES;
    NSError *err = NULL;
    CMTime time = CMTimeMake(1, 60);
    CGImageRef imgRef = [generator copyCGImageAtTime:time actualTime:NULL error:&err];
    UIImage *thumbnail = [[UIImage alloc] initWithCGImage:imgRef];
    CGImageRelease(imgRef);

    return thumbnail;

【讨论】:

您好,jabson,您的代码正在运行,但如何将视频保存在特定相册中?我们创建了相册“videosAPP”,但视频未保存在相册中。 您好,这是另一个问题,下次尝试创建另一个问题。请查看问题的第一个答案:***.com/questions/30249135/…【参考方案2】:

确保您有权保存到照片库。

导入照片类:

#import <Photos/Photos.h>

然后检查照片库授权

PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];

if (status == PHAuthorizationStatusAuthorized) 
    //OK to save your video
    [self ContinueDownload];

else if (status == PHAuthorizationStatusDenied) 
    // Access has been denied.
    [self ShowAlert];

else if (status == PHAuthorizationStatusNotDetermined) 

    // Access has not been determined.
    [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) 

        if (status == PHAuthorizationStatusAuthorized) 
             //OK to save your video
            [self ContinueDownload];
        
        else 
            // Access has been denied.
            [self ShowAlert];
        
    ];

else if (status == PHAuthorizationStatusRestricted) 
    // Restricted access


//Show an alert if access is denied
-(void)ShowAlert 
    UIAlertController * alert = [UIAlertController
                                 alertControllerWithTitle:@"Gallery Access denied"
                                 message:@"You can grant access in\nSettings/Privacy/Photos\nif you change your mind."
                                 preferredStyle:UIAlertControllerStyleAlert];



    UIAlertAction* OKButton = [UIAlertAction
                               actionWithTitle:@"OK"
                               style:UIAlertActionStyleDefault
                               handler:^(UIAlertAction * action) 
                                   //[self dismissViewControllerAnimated:YES completion:nil];
                               ];

    [alert addAction:OKButton];

    [self presentViewController:alert animated:YES completion:nil];


【讨论】:

以上是关于应用程序崩溃:当 writeVideoAtPathToSavedPhotosAlbum 使用 ALAssetsLibrary的主要内容,如果未能解决你的问题,请参考以下文章

iOS:当应用程序因任何崩溃而退出时,是不是有任何委托方法

应用程序崩溃:当 writeVideoAtPathToSavedPhotosAlbum 使用 ALAssetsLibrary

当内存不足时,c ++分配器使应用程序崩溃[重复]

当 UISearchBar 处于活动状态时,滚动到 UITableView 应用程序会崩溃

当函数返回空时程序崩溃

当用户触摸注释时,无法识别的选择器崩溃