当我在设备上运行程序时,AssetsLibrary 没有获取保存在相机胶卷中的图像

Posted

技术标签:

【中文标题】当我在设备上运行程序时,AssetsLibrary 没有获取保存在相机胶卷中的图像【英文标题】:AssetsLibrary does not get images saved in the Camera roll when I run the program on the device 【发布时间】:2011-05-22 10:02:59 【问题描述】:

我编写了一个简单的 ios 程序,通过使用 SDK4.2 中提供的“资产库”框架来获取保存在相机胶卷中的照片图像数量。

当我在 iPhone 模拟器上运行该程序时,该程序运行良好。 但是,当我在“真正的”iPhone 设备(带有 iOS 4.2.1 的 iPhone 3GS)上运行时,它没有检索到任何图像。

这个问题看起来和下面文章中讨论的问题一样: Assets Library Framework not working correctly on 4.0 and 4.2

所以,我添加了“dispatch_async(dispatch_get_main_queue()...”函数如下,但我无法解决问题。

- (void)viewDidLoad 
    [super viewDidLoad];

    NSMutableArray assets = [[NSMutableArray array] retain]; // Prepare array to have retrieved images by Assets Library.

    void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *asset, NSUInteger index, BOOL *stop) 
        if(asset != NULL) 
            [assets addObject:asset]; 
            dispatch_async(dispatch_get_main_queue(), ^

                // show number of retrieved images saved in the Camera role.
                // The [assets count] returns always 0 when I run this program on iPhone device although it worked OK on the simulator.
                NSLog(@"%i", [assets count]);
            );
        
    ;

    void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) 
        if(group != nil) 
            [group enumerateAssetsUsingBlock:assetEnumerator];
        
    ;

    // Create instance of the Assets Library.
    ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];

    [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos // Retrieve the images saved in the Camera role.
                           usingBlock:assetGroupEnumerator
                         failureBlock: ^(NSError *error) 
                             NSLog(@"Failed.");
                         ];

如果你有什么想法可以解决,请告诉我?

【问题讨论】:

我终于找到了解决这个问题的方法: 【参考方案1】:

我有 1 条更新:

为了得到错误码,我修改了 enumerateGroupsWithTypes 的 failureBlock 如下,然后又重现了这个症状。

然后,应用返回错误代码 -3311 (ALAssetsLibraryAccessUserDeniedError)。 但是在我的复现测试中,我并没有进行任何否认的操作。

err#=-3311 的可能原因是什么?

[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
                       usingBlock:assetGroupEnumerator
                     failureBlock: ^(NSError *error) 
                         NSLog(@"Failed");
        resultMsg = [NSString stringWithFormat:@"Failed: code=%d", [error code]];                     ];

【讨论】:

终于找到了解决这个问题的办法。我必须启用“定位服务”才能使这个程序运行良好。这是步骤; (1) 将上述应用程序安装到 iPhone 设备上。 (2) 启动 [设置] 并进入 [常规] > [位置服务] > [] 将其设置为“开启”。 (3) 启动我的应用程序来运行它。然后我的应用程序按照我的预期从相机胶卷中检索了照片。希望这会有所帮助, 是的,它要求提供位置服务,但这种行为很奇怪,为什么图像获取需要位置服务。当我在我的应用程序中获取照片时,有什么办法可以在不打开我的位置服务并且不被要求允许位置服务的情况下做吗?? @chotachetan 照片关联了位置数据。通过这种机制访问照片还允许您访问位置数据,因此用户必须允许您的应用执行此操作。【参考方案2】:

访问保存的照片时应该涉及位置服务,这很奇怪。也许它与照片上的地理标记信息有关。不管怎样,Apple 表示在使用 enumerateGroupsWithTypes:usingBlock:failureBlock: 时需要启用定位服务

特别注意事项 如果用户未启用定位服务(在设置 > 常规中),此方法将失败并返回错误 ALAssetsLibraryAccessGloballyDeniedError。"

【讨论】:

以上是关于当我在设备上运行程序时,AssetsLibrary 没有获取保存在相机胶卷中的图像的主要内容,如果未能解决你的问题,请参考以下文章

应用程序在我的设备上运行,但当我将其发布到 Google Play 商店进行 Beta 测试时无法运行

当我在真实设备中打开活动时应用程序崩溃

使用 AssetsLibrary 框架 iPhone 访问库中的视频?

在设备上运行应用程序时,iOS Facebook SDK“用户取消登录”?

为啥我在设备或模拟器上运行我的应用程序时屏幕是黑色的

使NSTimer在后台运行在物理设备上