【iOS】自定義相機(jī)(十)資源保存

相冊

在前面的文章中氛雪,我們已經(jīng)介紹了各種媒體獲取的方式房匆,還沒介紹如何將這些媒體資源保存到相冊中。本篇文章的保存方式是基于PHPhotoLibrary這個(gè)系統(tǒng)類的报亩,下面將簡單介紹保存使用的部分浴鸿,其他功能詳細(xì)請參見官方文檔

媒體獲取方式傳送門:

媒體類型

在自定義相機(jī)中弦追,我們獲取的媒體類型有以下三種岳链,分別是靜態(tài)照片、動(dòng)態(tài)照片和視頻骗卜。他們在捕獲后的資源存在形式如下:

  • 靜態(tài)照片:NSData
  • 動(dòng)態(tài)照片:NSData + NSURL
  • 視頻:NSURL

因此,我們向系統(tǒng)相冊寫入數(shù)據(jù)都是圍繞著NSDataNSURL進(jìn)行的左胞。

權(quán)限問題

和獲取相機(jī)寇仓、相冊、麥克風(fēng)數(shù)據(jù)一樣烤宙,向系統(tǒng)相冊寫入數(shù)據(jù)也需要獲取權(quán)限遍烦。在Info.plist中我們需要添加:

<key>NSPhotoLibraryAddUsageDescription</key>
<string>App需要您的同意,才能添加圖片</string>

由于需要獲取權(quán)限,我們在開發(fā)的時(shí)候就需要像打開相機(jī)一樣小心躺枕,操作前務(wù)必檢查權(quán)限服猪,避免出現(xiàn)不好的用戶體驗(yàn)。

PHPhotoLibrary 寫入數(shù)據(jù)

我們需要先通過[PHPhotoLibrary sharedPhotoLibrary]獲取PHPhotoLibrary的單例對象拐云,再調(diào)用核心方法performChanges:completionHandler:罢猪。該方法用于向相冊中異步寫入資源數(shù)據(jù),所以開發(fā)者只需要把寫入數(shù)據(jù)的操作放在Changes中叉瘩,完成回調(diào)放在completionHandler中即可膳帕。

Changes 操作

Changes操作由系統(tǒng)異步調(diào)用,PHPhotoLibrary規(guī)定我們在寫入數(shù)據(jù)時(shí)候薇缅,需要使用PHAssetCreationRequest對象進(jìn)行操作危彩。主要分為以下兩步走:

  1. 創(chuàng)建步驟:使用creationRequestForAsset類方法進(jìn)行對象的創(chuàng)建
  2. 配置步驟:使用addResourceWithType:fileURL:options:addResourceWithType:data:options:配置需要保存的資源

不同類型媒體資源的保存只需要需要使用不同的type和資源組合即可攒磨,代碼如下:

靜態(tài)照片 - Photo

PHAssetCreationRequest *imageRequest = [PHAssetCreationRequest creationRequestForAsset];
[imageRequest addResourceWithType:PHAssetResourceTypePhoto data:imageData options:nil];

PS:可以使用可以將需要保存UIImage通過UIImageJPEGRepresentationUIImagePNGRepresentation方法轉(zhuǎn)成需要的imageData

動(dòng)態(tài)照片 - Photo + PairedVideo

PHAssetCreationRequest* creationRequest = [PHAssetCreationRequest creationRequestForAsset];
[creationRequest addResourceWithType:PHAssetResourceTypePhoto data:imageData options:nil];
PHAssetResourceCreationOptions* resourceOptions = [[PHAssetResourceCreationOptions alloc] init];
resourceOptions.shouldMoveFile = YES;
[creationRequest addResourceWithType:PHAssetResourceTypePairedVideo fileURL:filmURL options:resourceOptions];

PS:動(dòng)態(tài)照片的視頻部分類型必須是PHAssetResourceTypePairedVideo表示該視頻是整個(gè)資源的一部分汤徽,那么系統(tǒng)將會(huì)將其與同時(shí)傳入的照片一起合成動(dòng)態(tài)照片娩缰。

視頻 - Video

PHAssetCreationRequest *videoRequest = [PHAssetCreationRequest creationRequestForAsset];
PHAssetResourceCreationOptions* resourceOptions = [[PHAssetResourceCreationOptions alloc] init];
resourceOptions.shouldMoveFile = YES;
[videoRequest addResourceWithType:PHAssetResourceTypeVideo fileURL:fileURL options:resourceOptions];

PS:這里和動(dòng)態(tài)照片中的視頻一樣都使用了options,它是一個(gè)PHAssetResourceCreationOptions對象谒府,可用于定義存入文件的文件名(originalFilename)拼坎、文件類型(uniformTypeIdentifier)和是否在寫入后刪除(shouldMoveFile)。

組合操作

由于將資源寫入相冊需要權(quán)限狱掂,因此每次在寫入的時(shí)候我們都應(yīng)該像下方的代碼一樣先處理權(quán)限問題演痒,再處理寫入問題:

+ (void)customSaveWithChangeBlock:(dispatch_block_t)changeBlock
                        authHandle:(SCPhotosSaveAuthHandle)authHandle
                       completion:(SCPhotosSaveCompletion)completion {
    [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
        if (status != PHAuthorizationStatusAuthorized) {
            dispatch_async(dispatch_get_main_queue(), ^{
                if (authHandle)
                    authHandle(false, status);
            });
            return;
        }
        [[PHPhotoLibrary sharedPhotoLibrary]
         performChanges: changeBlock
         completionHandler:^(BOOL success, NSError * _Nullable error) {
             dispatch_async(dispatch_get_main_queue(), ^{
                 if (completion)
                     completion(success, error);
             });
         }];
    }];
}

最后:我將文章中三種媒體類型的保存方式都封裝在分類中,大家可以直接查閱PHPhotoLibrary+Save.h進(jìn)行使用趋惨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸟顺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子器虾,更是在濱河造成了極大的恐慌讯嫂,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兆沙,死亡現(xiàn)場離奇詭異欧芽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)葛圃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門千扔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人库正,你說我怎么就攤上這事曲楚。” “怎么了褥符?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵龙誊,是天一觀的道長。 經(jīng)常有香客問我喷楣,道長趟大,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任铣焊,我火速辦了婚禮逊朽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘曲伊。我一直安慰自己惋耙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绽榛,像睡著了一般湿酸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灭美,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天推溃,我揣著相機(jī)與錄音,去河邊找鬼届腐。 笑死铁坎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的犁苏。 我是一名探鬼主播硬萍,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼围详!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起买羞,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤群叶,失蹤者是張志新(化名)和其女友劉穎舶衬,沒想到半個(gè)月后植阴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掠手,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡众雷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年编兄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狠鸳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卸察。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洪乍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巷波,到底是詐尸還是另有隱情,我是刑警寧澤垮耳,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布雾家,位于F島的核電站竹揍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏带到。R本人自食惡果不足惜晶衷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阴孟。 院中可真熱鬧晌纫,春花似錦、人聲如沸永丝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慕嚷。三九已至哥牍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喝检,已是汗流浹背嗅辣。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挠说,地道東北人澡谭。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像损俭,于是被迫代替她去往敵國和親蛙奖。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容