正文
在iOS應用的開發(fā)中我們經(jīng)常會用到拍照和錄像的功能,拍完照片返回照片文件?或者直接在相冊中選擇需要的圖片?要實現(xiàn)相關的功能我們經(jīng)常會用到UIImagePickerController或者ALAssetsLibrary亦或者AVFoundation,在這里主要講解使用UIImagePickerController來拍照和錄像并且保存在相冊中的實現(xiàn)。

圖1-1 拍照和錄像.png
具體的實現(xiàn)步驟如下:
- 在info.plist文件中配置相機麥克風和相冊的隱私訪問請求。
- 判斷設備是否支持錄像和拍照。
- 設置UIImagePickerController的資源類型。
- 設置媒體類型多媒體格式(聲音和視頻)/照片
- 設置UIImagePickerController的其他屬性例如:最大時長、錄像的質(zhì)量、閃光燈類型等。
- 遵循UINavigationControllerDelegate,UIImagePickerControllerDelegate代理,并設置代理。
- 在代理方法- imagePickerController: didFinishPickingMediaWithInfo: 中拿到獲取的媒體資源,并進行相關的操作。
廢話少說直接上代碼:
新建一個控制器并且按照上面的步驟設置UIImagePickerController相關的屬性并設置代理:
- (void)viewDidLoad {
[super viewDidLoad];
//判斷錄影功能是否可用
if (![self isVideoRecordingAvailable]) {
return;
}
/*設置資源類型為相機
*UIImagePickerControllerSourceType枚舉
*UIImagePickerControllerSourceTypeCamera 來自攝像頭
*UIImagePickerControllerSourceTypePhotoLibrary 來自圖庫
*UIImagePickerControllerSourceTypeSavedPhotosAlbum 來自相機相冊
*/
self.sourceType = UIImagePickerControllerSourceTypeCamera;
//媒體類型多媒體格式(聲音和視頻)/照片
self.mediaTypes = @[(NSString *)kUTTypeMovie,(NSString *)kUTTypeImage];
// 設置是否可以管理已經(jīng)存在的圖片或者視頻
[self setAllowsEditing:YES];
//設置錄制的最大時長,默認是10分鐘
self.videoMaximumDuration = 10;
//設置錄像的質(zhì)量
self.videoQuality = UIImagePickerControllerQualityType640x480;
//設置閃光燈類型
self.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto;
//設置代理
self.delegate = self;
}
#pragma mark 判斷是否支持所需引用的sourceType:相機,同時可用的媒體類型是否包含kUTTypeMovie錄影和照相
- (BOOL)isVideoRecordingAvailable{
//相機是否可用
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
//相機所包含的媒體類型
NSArray *availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
//是否包含抽象的多媒體格式(聲音和視頻) (注:kUTTypeMovie包含聲音和視頻 kUTTypeVideo只包含視頻 kUTTypeAudio只包含聲音)
if ([availableMediaTypes containsObject:(NSString *)kUTTypeMovie]&&[availableMediaTypes containsObject:(NSString *)kUTTypeImage]) {
return YES;
}
}
return NO;
}
通過UIImagePickerController的代理方法- imagePickerController: didFinishPickingMediaWithInfo: 中拿到獲取的媒體資源,并存進相冊:
#pragma mark UIImagePickerControllerDelegate
//獲得媒體資源信息并保存到相冊
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
//獲取當前媒體資源的類型
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:( NSString *)kUTTypeImage]){
UIImage *theImage = nil;
// 判斷,圖片是否允許修改
if ([picker allowsEditing]){
//獲取用戶編輯之后的圖像
theImage = [info objectForKey:UIImagePickerControllerEditedImage];
} else {
// 照片的元數(shù)據(jù)參數(shù)
theImage = [info objectForKey:UIImagePickerControllerOriginalImage];
}
// 保存圖片到相冊中
SEL selectorToCall = @selector(imageWasSavedSuccessfully:didFinishSavingWithError:contextInfo:);
UIImageWriteToSavedPhotosAlbum(theImage, self,selectorToCall, @"圖片保存成功");
}else{
//創(chuàng)建ALAssetsLibrary對象
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
//獲取視頻文件的url
NSURL *savedUrl = [info objectForKey:UIImagePickerControllerMediaURL];
if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:savedUrl]) {
//將視頻保存到相冊
[library writeVideoAtPathToSavedPhotosAlbum:savedUrl completionBlock:nil];
}
}
//保存成功后退出頁面
[picker dismissViewControllerAnimated:YES completion:nil];
}
//當用戶取消時,調(diào)用該方法
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[picker dismissViewControllerAnimated:YES completion:nil];
}
另外,我們除了可以利用UIImagePickerController自帶的拍照或者錄制視頻的CameraControls外,我們可以隱藏他們來自定義UI。
隱藏系統(tǒng)默認的CameraControls:
/*
*我們也可以自定義攝像機UI
*/
//隱藏系統(tǒng)自帶的UI
self.showsCameraControls = NO;
//設置全屏錄制
// CGSize screenSize = [[UIScreen mainScreen] bounds].size;
// float aspectRatio = 4.0/3.0;
// float scale = screenSize.height/screenSize.width * aspectRatio;
// self.cameraViewTransform = CGAffineTransformMakeScale(scale, scale);
當我們自定義攝像機CameraControls時可能會用到的方法:
#pragma mark 當我們自定義攝像機CameraControls時可能會用到的方法
//開始錄制/拍照
- (void)startRecorder
{
[self startVideoCapture];
//拍照
// [self takePicture];
}
//停止錄制
- (void)stopRecoder
{
[self stopVideoCapture];
}
//切換前后攝像頭
- (void)switchCameraIsFront:(BOOL)front
{
if (front) {
if([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]){
[self setCameraDevice:UIImagePickerControllerCameraDeviceFront];
}
}else{
if([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]){
[self setCameraDevice:UIImagePickerControllerCameraDeviceRear];
}
}
}
//隱藏系統(tǒng)自帶的UI,可以自定義UI
- (void)configureCustomUIOnImagePicker
{
UIView *cameraOverlay = [[UIView alloc] init];
self.cameraOverlayView = cameraOverlay;
}
結(jié)語
除了用UIImagePickerController來拍照和錄像,我們用到的更多的可能是從相冊選擇照片和視頻,只要將資源來源設為UIImagePickerControllerSourceTypePhotoLibrary或者UIImagePickerControllerSourceTypeSavedPhotosAlbum即可,并且對屬性做相對應的修改即可。
人生太短,歲月太長。生活是公平的,要活出精彩,需要一顆奮進的心。