我正在尝试使用AssetForURL方法,但它返回nil。
这是我正在使用的代码:
-(void)addAssetURL:(NSURL*)assetURL toAlbum:(NSString*)albumName withCompletionBlock:(SaveImageCompletion)completionBlock
{
__block BOOL albumWasFound = NO;
//search all photo albums in the library
[self enumerateGroupsWithTypes:ALAssetsGroupAlbum
usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
//compare the names of the albums
if ([albumName compare: [group valueForProperty:ALAssetsGroupPropertyName]]==NSOrderedSame) {
//target album is found
albumWasFound = YES;
//get a hold of the photo's asset instance
[self assetForURL: assetURL
resultBlock:^(ALAsset *asset) {
//add photo to the target album
[group addAsset: asset];
//run the completion block
completionBlock(nil);
} failureBlock: completionBlock];
//album was found, bail out of the method
return;
}
if (group==nil && albumWasFound==NO) {
//photo albums are over, target album does not exist, thus create it
__weak ALAssetsLibrary* weakSelf = self;
//create new assets album
[self addAssetsGroupAlbumWithName:albumName
resultBlock:^(ALAssetsGroup *group) {
//get the photo's instance
[weakSelf assetForURL: assetURL
resultBlock:^(ALAsset *asset) {
//add photo to the newly created album
[group addAsset: asset];
//call the completion block
completionBlock(nil);
} failureBlock: completionBlock];
} failureBlock: completionBlock];
//should be the last iteration anyway, but just in case
return;
}
} failureBlock: completionBlock];
}
我给它的网址是:
file://localhost/private/var/mobile/Applications/6630FBD3-1212-4ED0-BC3B-0C23AEEFB267/tmp/capture-T0x1d56e310.tmp.N3SZXy/capturedvideo.MOV
我从相机委托方法获取网址:
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSLog(@"%@",[info objectForKey:UIImagePickerControllerMediaURL]);
[library addAssetURL:[info objectForKey:UIImagePickerControllerMediaURL] toAlbum:@"Compedia videos" withCompletionBlock:^(NSError *error) {
if (error!=nil) {
NSLog(@"Big error: %@", [error description]);
}
}];
}
有什么想法吗?
答案 0 :(得分:0)
您确定可以访问资产库吗? 别忘了检查访问状态
ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
if (status == ALAuthorizationStatusNotDetermined) {
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[ALAssetsLibrary authorizationStatus];
__block BOOL accessChecked = NO; /// *stop is not respected immediately
[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if (accessChecked) return ;
*stop = YES;
accessChecked = YES;
} failureBlock:^(NSError *error){
}];
}
else {
BOOL granted = status == ALAuthorizationStatusAuthorized;
}
- (void)enumerateGroupsWithTypes:(ALAssetsGroupType)types usingBlock:(ALAssetsLibraryGroupsEnumerationResultsBlock)enumerationBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock
描述调用给定的块作为参数传递每个 与给定资产组类型匹配的资产组。结果是 通过执行枚举块逐个传递给调用者。 此方法是异步的。枚举组时,用户可以 被要求确认申请人对数据的访问权限;方法, 但是,立即返回。你应该做你想做的任何工作 使用enumerationBlock中的资产。
如果用户拒绝访问 应用程序,或者如果不允许应用程序访问数据, failBlock被调用。