1. 程式人生 >實用技巧 >其它 >ios-獲取相簿相機圖片

ios-獲取相簿相機圖片


技術標籤:Iosios相簿相機


title: ios-獲取相簿相機圖片
categories: Ios
tags: [ios, 相簿, 相機]
date: 2021-02-11 16:29:28
comments: false
mathjax: true
toc: true

ios-獲取相簿相機圖片


前篇

  • 隱私資訊 info.plist 配置: https://stackoverflow.com/questions/39465687/nscamerausagedescription-in-ios-10-0-runtime-crash
  • iOS關於相機相簿許可權設定 - https://www.jianshu.com/p/84df2ca84ade
  • iOS 獲取圖片(拍照、相簿、相簿)詳解 - https://www.jianshu.com/p/39a6a104d3c1
  • iOS 拍照(相機)/相簿獲取圖片 - https://www.jianshu.com/p/5465e87d8a0a
  • iOS關於相機相簿許可權設定 - https://www.jianshu.com/p/84df2ca84ade
  • iOS開發:呼叫系統自帶相機以及獲取相簿照片的功能實現 - https://www.cnblogs.com/sundaysgarden/articles/9188975.html

獲取相簿圖片

  1. 在 info.plist 中配置相簿許可權提示:

    Key    :  Privacy - Photo Library Usage Description    
    Value  :  $(PRODUCT_NAME) photo use
    
  2. 實現 <UIKit/UIKit.h> 中 UIImagePickerControllerDelegate 代理介面

    // 當用戶選取完成後呼叫;
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { ... }
    // 當用戶取消選取時呼叫;
    - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { ... }
    
  3. 獲取相簿

    #import <Photos/Photos.h>
    
    // 檢查相簿是否可用
    +(BOOL)checkGallery{
        PHAuthorizationStatus authStatus = [PHPhotoLibrary authorizationStatus];
        if (authStatus == PHAuthorizationStatusRestricted || authStatus == PHAuthorizationStatusDenied) {
            return NO;
        }
        return YES;
    }
    
    // 獲取相簿
    -(void)getGallery:(CPicture*)data cb:(CodeMsgFn)cb {
        self.data = data;
        self.cb = cb;
        
        //本地相簿不需要檢查,因為UIImagePickerController會自動檢查並提醒
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        picker.delegate = self;
        picker.allowsEditing = data.isEdit; // 設定選擇後的圖片可被編輯
        
        BOOL isOk = [PicHelper checkGallery]; // 先檢查相機可用是否
        if (isOk == NO) {
            [self doCallback:ECodePermissionDenyError msg:@"--- no gallery permission"];
        } else {
            [Tool presentVC:picker]; // 開啟相簿
        }
    }
    

相機拍照

  1. 在 info.plist 中配置相機許可權提示:

    Key    :  Privacy - Camera Usage Description   
    Value  :  $(PRODUCT_NAME) camera use
    
  2. 實現 <UIKit/UIKit.h> 中 UIImagePickerControllerDelegate 代理介面 (和相簿一樣)

    // 當用戶選取完成後呼叫;
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { ... }
    // 當用戶取消選取時呼叫;
    - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { ... }
    
  3. 開啟相機

    #import <AVFoundation/AVCaptureDevice.h>
    #import <AVFoundation/AVMediaFormat.h>
    
    // 檢查相機是否可用
    +(BOOL)checkCamera{  // 如果使用者點選 不允許, 則為 0
        NSString *mediaType = AVMediaTypeVideo;
        AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
        if(AVAuthorizationStatusRestricted == authStatus || AVAuthorizationStatusDenied == authStatus) {
            return NO;
        }
        return YES;
    }
    
    // 相機拍照
    -(void)takePicture:(CPicture*)data cb:(CodeMsgFn)cb {
        self.data = data;
        self.cb = cb;
        
        if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
            UIImagePickerController *picker = [[UIImagePickerController alloc] init];
            picker.sourceType = UIImagePickerControllerSourceTypeCamera;
            picker.delegate = self;
            picker.allowsEditing = data.isEdit; // 設定拍照後的圖片可被編輯
            picker.sourceType = UIImagePickerControllerSourceTypeCamera;
            
            BOOL isOk = [PicHelper checkCamera]; // 先檢查相機可用是否
            if (isOk == NO) {
                [self doCallback:ECodePermissionDenyError msg:@"--- no camera permission"];
            } else {
                [Tool presentVC:picker]; // 開啟相機
            }
        } else {
            [self doCallback:ECodeUnknown msg:@"--- not isSourceTypeAvailable, you device may be iphonesimulator"];
        }
    }
    
  4. 測試

    ios-獲取相簿相機圖片


踩坑

呼叫拍照閃退

報錯資訊: he app's Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data

就是需要在 info.plist 中配置相機提示.