Just a Computer Graphics Studio & My Life

使用手機拍照已經成為現代人的生活習慣,對於App開發者而言,能夠透過用戶手機來處理相簿或相片變成很基本的功能,所以我們就稍微來研究如何取得相簿與相片 (Get Albums and Photos)

ios-%e5%8f%96%e5%be%97%e7%9b%b8%e7%b0%bf%e8%88%87%e7%9b%b8%e7%89%87-get-albums-and-photos2

先瞭解一下基本邏輯⋯⋯

在開始實作列舉相簿內所有資料之前,先來了解一下它們之間的結構關係與對應的宣告型態。

相簿(ALAssetsLibrary)–> 相簿分類(ALAssetsGroup)–> 檔案(ALAsset)

  • ALAssetsLibrary

ALAssetsLibrary,指的就是整個相簿,如果你有檔案絕對路徑,就可以使用它直接將檔案撈出來,例如透過 UIImagePickerController 來取得檔案的絕對路徑。

  • ALAssetsGroup

ALAssetsGroup,代表著相簿內的分類,你可以使用 valueForProperty: 方法函式取得一些該分類的詳細資料,像是分類名稱或是路徑等等,當然 ALAssetsGroup 本身也記載著有多少檔案在該分類項目中。

  • ALAsset

ALAsset,就是指檔案本身,它同樣可以使用valueForProperty: 方法函式取得一些詳細資料,像是檔案的類型、地點、日期等等。

接下來寫三個Block來實現:

/**
 Theme: Get Albums and Photos
 IDE: Xcode 8
 Language: Objective C
 Date: 105/10/05
 Author: HappyMan
 Blog: https://cg2010studio.wordpress.com/
 */
#import <AssetsLibrary/AssetsLibrary.h>
-(void)getPhotosFromAlbum
{
    //從分類中取得檔案
    ALAssetsGroupEnumerationResultsBlock groupEnumerationBlock = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
        if (result != nil) {

            //只取得圖片資料
            if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {

                //取得圖片
                UIImage *image = [UIImage imageWithCGImage:result.thumbnail];

                //使用 ALAssetRepresentation 取得詳細資料
                ALAssetRepresentation *representation = [result defaultRepresentation];
            }

        } else {
            //列舉完成時的處理常式
            NSLog(@"Happy Finish!!");
        }
    };

    //從相簿中取得分類
    ALAssetsLibraryGroupsEnumerationResultsBlock libraryEnumerationBlock = ^(ALAssetsGroup *group, BOOL *stop) {
        if(group != nil) {
            NSLog(@"名稱: %@, 數目: %ld ",[group valueForProperty:ALAssetsGroupPropertyName], [group numberOfAssets]);

            //呼叫從該分類項目中列舉檔案的Block
            if ([[group valueForProperty:ALAssetsGroupPropertyName] isEqualToString:@"MomentCam"]) {
                [group enumerateAssetsUsingBlock:groupEnumerationBlock];
            }

        } else {
            //列舉完成時的處理常式

        }
    };

    ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) {
        //失敗處理常式
    };

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:libraryEnumerationBlock failureBlock:failureBlock];
}

列印範例:

名稱: Camera Roll, 數目: 3627
名稱: 天天P, 數目: 8
名稱: Nike+ Run Club, 數目: 1
名稱: SNOW, 數目: 0

如此,我就可以找到特定的資料夾MomentCam,掃描裡頭相片的各種資訊囉!

ios-%e5%8f%96%e5%be%97%e7%9b%b8%e7%b0%bf%e8%88%87%e7%9b%b8%e7%89%87-get-albums-and-photos-code

ios-%e5%8f%96%e5%be%97%e7%9b%b8%e7%b0%bf%e8%88%87%e7%9b%b8%e7%89%87-get-albums-and-photos

參考:使用 ALAssetsGroup 列舉裝置相簿中的所有資料

Advertisements

發表留言

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

標籤雲

%d 位部落客按了讚: