2010-12-08 6 views
3

簡単なiOSプログラムを作成して、カメラロールに保存された写真画像の数を取得しました。 SDK4.2。デバイスでプログラムを実行するとAssetsLibraryはカメラロールに保存された画像を取得しません

プログラムは、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."); 
         }]; 
} 

はあなたが私に教えてもらえ

+0

最後に私が得ましたこの問題の解決策: – Hidehiko

答えて

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]];      }]; 
+4

最後に、私はこの問題の解決策を持って 私はこのプログラムがうまく機能するために「ロケーションサービス」を有効にする必要がありました。ここ が手順である。 (1)iPhoneに上記のアプリをインストールしてください。デバイス。 (2)[設定]を起動し、[一般]> [ロケーションサービス]> []に移動して「オン」にします。 (3)アプリケーションを起動して実行します。 その後、私のアプリはカメラのロールから写真を取得しました。 希望すると、 – Hidehiko

+0

位置情報サービスが要求されますが、画像の取得に位置情報サービスが必要な理由は変わっています。私の位置情報サービスをオンにしなくても、私のアプリで写真を取得しているときに位置情報サービスを許可されることを頼まれていない方法はありますか? – manishnath

+1

@chotachetan写真には位置情報が関連付けられています。このメカニズムを使って写真にアクセスすると、ロケーションデータにもアクセスできます。そのため、ユーザーはアプリにこれを許可する必要があります。 – MattyG

0

保存された写真にアクセスするときに位置情報サービスが関与する必要があります。たぶんそれは写真のジオタグ情報に関係しているのかもしれない。 enumerateGroupsWithTypes:usingBlock:failureBlock:

特別な考慮事項 を使用している場合とにかくAppleはユーザーが(>一般の設定で)場所サービスを有効にしていない場合、このメソッドはエラーALAssetsLibraryAccessGloballyDeniedErrorで失敗しますロケーションサービスを有効にする必要であることを述べている。」

関連する問題