iOS 中的资产库问题 - 5

Posted

技术标签:

【中文标题】iOS 中的资产库问题 - 5【英文标题】:Asset Library issue in iOS - 5 【发布时间】:2012-06-13 09:26:33 【问题描述】:

我正在使用资产库从 url 获取图像,我的代码是

ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)     
    ALAssetRepresentation *rep = [myasset defaultRepresentation];
    CGImageRef iref = [rep fullResolutionImage];
    UIImage *largeimage;

    if (iref) 
        largeimage = [UIImage imageWithCGImage:iref];
    

    [self customeButtonCreated:self];

    NSData* thumbImageData = [[NSData alloc] initWithContentsOfFile:imagePath];
    btn1.frame = CGRectMake(x, y, WIDTH, HEIGHT);
    [btn1 setTag:tag];

    //[media_id addObject:[allKey objectAtIndex:0]];     
    [btnURl addObject:imagePath];

    UIImage *tempImage = [[UIImage alloc]initWithData:thumbImageData];
    [btn1 setImage:largeimage forState:UIControlStateNormal];
    btn1.imageView.contentMode = UIViewContentModeScaleAspectFit;           
    [tempImage release];

    [newView addSubview:btn1];
    [btn1 addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
    [thumbImageData release];

    imgcount++;

    NSLog(@"Iamge count ---%d",imgcount);
    tag++;
;

ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)
    NSLog(@"Cannot get image - %@",[myerror localizedDescription]);
;


if ([seprateArr count] == 2) 
    NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"assets-library://asset/asset.JPG?id=%@&ext=%@",[seprateArr objectAtIndex:0],[seprateArr objectAtIndex:1]]];
    ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
    [assetslibrary assetForURL:url resultBlock:resultblock failureBlock:failureblock];

它在 ios - 4 或更低版本中运行良好,但在 ios - 5 中它没有进入块并显示错误

无法获取图像 - 全局拒绝访问

有什么解决办法吗?

【问题讨论】:

【参考方案1】:

这适用于我在 ios 4.0 和 ios 5 中。

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
NSString *photoName;
NSString *photoUrl;

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) 
    
        if(result != NULL) 
        
            NSArray *arrKeys = [[result valueForProperty:ALAssetPropertyURLs]allKeys];             
            if([[result valueForProperty:ALAssetPropertyType]isEqualToString:ALAssetTypePhoto])
            
                if([[UIDevice currentDevice] systemVersion]>=5.0))
                
                    photoName = [[result defaultRepresentation]UTI];

                
                else
                
                    photoName = [[result defaultRepresentation]filename];

                
                //Your code here
                photoUrl = [[result valueForProperty:ALAssetPropertyURLs]objectForKey:[arrKeys objectAtIndex:0]];

            
        
    ;

    void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) 
    
        if(group != nil) 
        
            [group enumerateAssetsUsingBlock:assetEnumerator];
        
    ;
    [library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:assetGroupEnumerator failureBlock:^(NSError *error)
        NSLog(@"%@",error);
    ];

    [pool release];

【讨论】:

这里的 photoName 是什么?图片名称? 意味着我必须使用 [UIImage imageNamed:photoName]; photoName 是图像的标题,而 photoUrl 是它的资产 url。你可以像这样访问 UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL fileURLWithPath:photoUrl]]]; 我可以在哪里使用 photoName ?它的数据类型是什么?我在哪里可以申报? 它是图像的标题,你可以在 tableview 中显示所有标题,每个标题都有资产 url。或在显示所有图像的滚动视图中,每个图像下方都有显示其标题的标签

以上是关于iOS 中的资产库问题 - 5的主要内容,如果未能解决你的问题,请参考以下文章

如何从智能相册加载资产? (展览媒体库)

React Native 0.26 显示资产库中的图像时找不到合适的图像 URL 加载器

Flutter iOS 应用程序大小增加而不更改资产/库

我在编写代码以检索 IOS 资产库时遗漏了一个步骤,但我遗漏了啥?

将资产视频发送到 Web 服务 - iOS

iOS如何显示具有资产库路径的图像而不将它们绑定到实例变量