AssetsLibrary не получает изображения, сохраненные в Фотопленке, когда я запускаю программу на устройстве - PullRequest
3 голосов
/ 08 декабря 2010

Я написал простую программу для iOS, чтобы получить количество фотоизображений, сохраненных в рулоне камеры, с использованием инфраструктуры «Библиотека активов», предоставленной в SDK4.2.

Программа работала хорошо, как я и ожидал, когда запустил ее на симуляторе iPhone. Но он не получал никаких изображений, когда я работал на «настоящем» устройстве iPhone (iPhone 3GS с iOS 4.2.1).

Эта проблема выглядит так же, как и проблема, описанная в следующей статье: Структура библиотеки активов не работает правильно на 4.0 и 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.");
                         }];
}

Не могли бы вы сказать мне, если у вас есть идеи, чтобы решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 03 сентября 2011

Странно, что при доступе к сохраненным фотографиям должны быть задействованы службы определения местоположения. Возможно, это связано с геотегами на фотографиях. В любом случае Apple заявляет, что при использовании enumerateGroupsWithTypes:usingBlock:failureBlock:

требуется включение служб определения местоположения.

Особые замечания Этот метод завершится с ошибкой ALAssetsLibraryAccessGloballyDeniedError, если пользователь не включил службы определения местоположения (в меню «Настройки»> «Общие»). "

0 голосов
/ 10 декабря 2010

У меня есть 1 обновление:

Чтобы получить код ошибки, я изменил errorBlock объекта enumerateGroupsWithTypes, как показано ниже, а затем снова воспроизвел симптом.

Затем приложение вернул код ошибки-3311 (ALAssetsLibraryAccessUserDeniedError).Однако я не смог отказать во время воспроизведения теста.

Какова возможная причина ошибки # = - 3311?

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