3

SDK4.2 で提供されている「Assets Library」フレームワークを使用して、カメラ ロールに保存されている写真画像の数を取得する簡単な iOS プログラムを作成しました。

このプログラムは、iPhone シミュレーターで実行したときに期待どおりに機能しました。しかし、「実際の」iPhone デバイス (iOS 4.2.1 を搭載した iPhone 3GS) で実行した場合、画像は取得されませんでした。

この問題は、次の記事で説明されている問題と同じように見えます: アセット ライブラリ フレームワークが 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.");
                         }];
}

それを解決するアイデアがあれば教えてください。

4

2 に答える 2

0

保存された写真にアクセスするときに位置情報サービスが関与する必要があるのは奇妙です。おそらく、写真のジオタグ情報に関係しているのでしょう。とにかくAppleは、使用時に位置情報サービスを有効にする必要があると言っていますenumerateGroupsWithTypes:usingBlock:failureBlock:

特別な考慮事項ALAssetsLibraryAccessGloballyDeniedErrorユーザーが ([設定] > [一般] で) 位置情報サービスを有効にしていない場合、 このメソッドはエラーで失敗します。

于 2011-09-03T18:31:25.390 に答える
0

私は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]];                     }];
于 2010-12-10T10:02:12.693 に答える