ALAssetsLibraryでiPhone,iPadの写真フォルダにアクセスする
// MyAssetManager.h #import <Foundation/Foundation.h> #import <AssetsLibrary/AssetsLibrary.h> @interface MyAssetsManager : NSObject { ALAssetsLibrary *assetsLibrary_; } - (void)addObserverForAssetsLibraryChange:(id)anObserver selector:(SEL)aSelector; - (void)removeObserverForAssetsLibraryChange:(id)anObserver; - (void)enumerateAssets; @end
// MyAssetManager.m #import "MyAssetsManager.h" #define MYASSETSMANAGER_ASSETSNOTIFICATION_NAME @"ALAssetsLibraryChangedNotification" @implementation MyAssetsManager - (id)init { assetsLibrary_ = [[ALAssetsLibrary alloc] init]; return self; } - (void)dealloc { [assetsLibrary_ release]; [super dealloc]; } - (void)addObserverForAssetsLibraryChange:(id)anObserver selector:(SEL)aSelector { NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; [defaultCenter addObserver:anObserver selector:aSelector name:MYASSETSMANAGER_ASSETSNOTIFICATION_NAME object:nil]; } - (void)removeObserverForAssetsLibraryChange:(id)anObserver { NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; [defaultCenter removeObserver:anObserver name:MYASSETSMANAGER_ASSETSNOTIFICATION_NAME object:nil]; } - (void)enumerateAssets { __block NSUInteger assetCount = 0; void (^assetResultBlock)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *asset, NSUInteger index, BOOL *stop) { if (*stop) { NSLog(@"Stop enumerating assets."); } else if (!asset) { NSLog(@"End of the group."); } else { // TODO NSDictionary *urls = [asset valueForProperty:ALAssetPropertyURLs]; NSLog(@"%06d:%@", assetCount, urls); ++assetCount; } }; void (^resultBlock)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) { if (*stop) { NSLog(@"Stop enumerating groups."); } else if (!group) { NSLog(@"End of enumation."); } else { ALAssetsFilter *assetsFilter = [ALAssetsFilter allPhotos]; [group setAssetsFilter:assetsFilter]; NSInteger numberOfAssets = [group numberOfAssets]; NSString *groupName = [group valueForProperty:ALAssetsGroupPropertyName]; NSLog(@"%@:num:%d", groupName, numberOfAssets); [group enumerateAssetsUsingBlock:assetResultBlock]; } }; void (^failureBlock)(NSError *) = ^(NSError *error) { NSLog(@"Exception in enumerating assets. %@", error); }; [assetsLibrary_ enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:resultBlock failureBlock:failureBlock]; } @end #undef MYASSETSMANAGER_ASSETSNOTIFICATION_NAME
TODOコメントあたりでメタデータの取得などいろいろできます。
フィルタや対象グループを変更することで、写真や映像などのフィルタリングが出来ます。
"ALAssetsLibraryChangedNotification"に登録することで写真フォルダの変更等を知ることができます。ただし"ALAssetsLibraryChangedNotification"ではiTunesの同期処理による写真フォルダの変更には対応できないようです。