[iOS Dev] 利用 UIImagePickerController 使用相機拍照

2015-12-16

如果只是要有拍照功能 沒有特別客製化拍照介面需求
可以直接使用內建的功能

▼ 首先在 .h 檔案中加入 delegate 以及詢問相機權限需要的 AVFoundation

#import 
#import 
@interface ViewController : UIViewController 
@end

▼ 開啟相機功能

//建立一個ImagePickerController
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

// 設定影像來源 這裡設定為相機
imagePicker.sourceType =  UIImagePickerControllerSourceTypeCamera;

// 設置 delegate
imagePicker.delegate = self;

// 設置拍照完後 可以編輯 會多一個編輯照片的步驟
imagePicker.allowsEditing = YES;

// 顯示相機功能        
[self presentViewController:imagePicker animated:YES completion:nil];

上面顯示相機功能後
接著就是內建的介面了 拍照 -> 編輯(如果有設定 allowsEditing 的話)
然後會帶著照片返回頁面
▼ 最後需要有這個 delegate method 來處理

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    // 取得編輯後的圖片 UIImage
    UIImage *img = [info objectForKey:UIImagePickerControllerEditedImage];
    if (img == nil) {
        // 如果沒有編輯 則是取得原始拍照的照片 UIImage
        img = [info objectForKey:UIImagePickerControllerOriginalImage];
    }

    // 再來就是對圖片的處理 img 是一個 UIImage

    //移除Picker
    [picker dismissViewControllerAnimated:YES completion:nil];
}

▼ 現在要使用相機會先向使用者要求權限 會遇到的權限如下

AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if(authStatus == AVAuthorizationStatusAuthorized) {
  // 已取得使用者權限
} else if(authStatus == AVAuthorizationStatusDenied){
  // 使用者拒絕提供權限 可以作提示到設定中開啟
} else if(authStatus == AVAuthorizationStatusRestricted){
  // restricted, 通常不會發生
} else if(authStatus == AVAuthorizationStatusNotDetermined){
  // 尚未詢問要求權限 則提一個詢問
  [AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) {
    if(granted){
      NSLog(@"Granted access to %@", mediaType);
    } else {
      NSLog(@"Not granted access to %@", mediaType);
    }
  }];
}

▼ 以上都設定完後 相機介面應該是預設的英文
如果相機介面要設定多國語系 需要對 info.plist 作多國語系的處理
詳細可參考 Localize info.plist 多國語系 InfoPlist.strings

因為模擬器沒有相機功能 所以只能使用實機測試

我製作了一個 相機 demo app 放在 github

ref:
http://furnacedigital.blogspot.tw/2011/12/uiimagepickercontroller-camera.html
http://stackoverflow.com/questions/20464631/detect-permission-of-camera-in-ios