如何优雅地使用iOS系统相机、相册
2016-08-19 16:55
393 查看
如何优雅地使用iOS系统相机、相册
概述
iOS系统相机、相册功能全部依托于图像选取控制器UIImagePickerController,在使用该控制器时,我们需要按照如下步骤进行检查指定的资源类型是否可用
检查指定资源类型下是否支持指定的媒体类型
检查用户对相机、相册的授权状态
初始化并弹出图像选取控制器
处理操作完成后的代理回调
检查指定的资源类型是否可用
这步操作用于检查设备是否支持指定的资源类型,以防盲目调用图像选取器导致程序不可用,比如采用模拟器调用相机图像选取控制器的资源类型是一个枚举,拥有如下三种类型
UIImagePickerControllerSourceTypeCamera // 相机类型 UIImagePickerControllerSourceTypePhotoLibrary // 照片库类型,相当于系统应用"照片"中的"相簿/Photos"栏加上"照片/Moments"栏 UIImagePickerControllerSourceTypeSavedPhotosAlbum // 照片类型,相当于系统应用"照片"中的"照片/Moments"栏
我们可以使用isSourceTypeAvailable方法进行检查
// 以"检查图像选择器的相机类型是否可用"为例 if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { // 相机类型可用 } else { // 相机类型不可用 }
检查指定资源类型下是否支持指定的媒体类型
这步操作用于检查某种资源类型下是否支持某种媒体类型,比如iPhone是否可以拍LivePhoto图像选取控制器的媒体类型主要分为两大类,图片类型与视频类型
kUTTypeImage(图片类型,细分为kUTTypeJPEG、kUTTypeGIF、kUTTypeLivePhoto等) kUTTypeMovie(视频类型,细分为kUTTypeMovie、kUTTypeMP3、kUTTypeAVIMovie等)
注1: 媒体类型以常量形式定义,需要引入MobileCoreServices.framework
注2: 媒体类型常量是CFString类型,在使用时需要强转为NSString类型
我们可以使用availableMediaTypesForSourceType:方法返回指定资源类型下支持的媒体类型数组
// 以"检查图像选择器在相机类型下是否支持图片类型"为例 // 返回相机类型下支持的媒体类型数组 NSArray *availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera]; // 判断数组中是否拥有(NSString *)kUTTypeImage元素 if ([availableMediaTypes containsObject:(NSString *)kUTTypeImage]) { // 图片类型可用 } else { // 图片类型不可用 }
检查用户对相机、相册的授权状态
这步操作根据用户授权状态决定是否弹出图像选取控制器,比如用户授权状态为拒绝状态,那么便需要提示用户,而不是弹出一个黑屏的控制器检查用户对相机的授权状态
注: 需要引入AVFoundation.framework
相机媒体类型主要有两种常用类型
AVMediaTypeVideo(视频媒体类型) AVMediaTypeAudio(音频媒体类型)
用户对相机的授权状态是一个枚举,拥有如下四种类型
AVAuthorizationStatusNotDetermined // 用户没有选择是否授权使用 AVAuthorizationStatusRestricted // 用户禁止使用,且授权状态不可修改,可能由于家长控制功能 AVAuthorizationStatusDenied // 用户已经禁止使用 AVAuthorizationStatusAuthorized // 用户已经授权使用
我们可以使用authorizationStatusForMediaType:方法返回用户对指定的相机媒体类型的授权状态
// 以"检查用户对视频媒体类型的授权状态"为例 // 返回用户对视频媒体类型的授权状态 AVAuthorizationStatus authorizationStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; // 处理不同授权状态下的操作流程 switch (authorizationStatus) { case AVAuthorizationStatusNotDetermined: { // 用户没有选择是否授权使用 } break; case AVAuthorizationStatusRestricted: { // 用户禁止使用,且授权状态不可修改,可能由于家长控制功能 } break; case AVAuthorizationStatusDenied: { // 用户已经禁止使用 } break; case AVAuthorizationStatusAuthorized: { // 用户已经授权使用 } break; }
在相机授权状态为AVAuthorizationStatusNotDetermined时,我们有必要先利用requestAccessForMediaType:completionHandler:方法来弹窗要求用户选择是否授权,而非直接弹出图像选取控制器,由系统自动弹窗询问用户是否授权
// 以"弹窗要求用户选择是否授权"为例 [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { if(granted) { // 用户授权使用 } else { // 用户禁止使用 } }];
注1: 该弹窗只在授权状态为AVAuthorizationStatusNotDetermined时才会显示
注2: 在使用AVCaptureDeviceInput且授权状态为AVAuthorizationStatusNotDetermined时,该弹窗会自动显示
检查用户对相册的授权状态
注: 需要引入AssetsLibrary.framework
用户对相册的授权状态是一个枚举,拥有如下四种类型
ALAuthorizationStatusNotDetermined // 用户没有选择是否授权使用 ALAuthorizationStatusRestricted // 用户禁止使用,且授权状态不可修改,可能由于家长控制功能 ALAuthorizationStatusDenied // 用户已经禁止使用 ALAuthorizationStatusAuthorized // 用户已经授权使用
我们可以使用authorizationStatus方法返回用户对相册的授权状态
// 以"检查用户对相册的授权状态"为例 // 返回用户对相册的授权状态 ALAuthorizationStatus authorizationStatus = [ALAssetsLibrary authorizationStatus]; // 处理不同授权状态下的操作流程 switch (authorizationStatus) { case ALAuthorizationStatusNotDetermined: { // 用户没有选择是否授权使用 } break; case ALAuthorizationStatusRestricted: { // 用户禁止使用,且授权状态不可修改,可能由于家长控制功能 } break; case ALAuthorizationStatusDenied: { // 用户已经禁止使用 } break; case ALAuthorizationStatusAuthorized: { // 用户已经授权使用 } break; }
初始化并弹出图像选取控制器
初始化相机控制器// 创建图像选取控制器对象 UIImagePickerController *picker = [[UIImagePickerController alloc] init]; // 将资源类型设置为相机类型 picker.sourceType = UIImagePickerControllerSourceTypeCamera; // 将媒体类型设置为图片类型和视频类型(数组中如果只写一个,图像选择控制器即只允许拍照/录像) picker.mediaTypes = @[(NSString *)kUTTypeImage, (NSString *)kUTTypeMovie]; // 设置拍照后的图片允许编辑 picker.allowsEditing = YES; // 设置摄像图像品质,默认是UIImagePickerControllerQualityTypeMedium picker.videoQuality = UIImagePickerControllerQualityTypeHigh; // 设置最长摄像时间,默认是10秒 picker.videoMaximumDuration = 30; // 设置代理,需要遵守<UINavigationControllerDelegate, UIImagePickerControllerDelegate>两个协议 picker.delegate = self; // 弹出图像选取控制器 [self presentViewController:picker animated:YES completion:nil];
初始化相册控制器
// 创建图像选取控制器对象 UIImagePickerController *picker = [[UIImagePickerController alloc] init]; // 将资源类型设置为相册类型 picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; // 将媒体类型设置为图片类型和视频类型(数组中如果只写一个,图像选择控制器即只能选取图片/视频) picker.mediaTypes = @[(NSString *)kUTTypeImage, (NSString *)kUTTypeMovie]; // 设置选取后的图片允许编辑 picker.allowsEditing = YES; // 设置代理,需要遵守<UINavigationControllerDelegate, UIImagePickerControllerDelegate>两个协议 picker.delegate = self; // 弹出图像选取控制器 [self presentViewController:picker animated:YES completion:nil];
处理操作完成后的代理回调
在对相机、相册操作完成后,系统会回调如下两个代理方法// 操作完成 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info { // do something ... // 回收图像选取控制器 [picker dismissViewControllerAnimated:YES completion:nil]; } // 操作取消 - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { // 回收图像选取控制器 [picker dismissViewControllerAnimated:YES completion:nil]; }
在操作完成回调info字典中,拥有如下可用信息
UIImagePickerControllerMediaType // 媒体类型(kUTTypeImage、kUTTypeMovie等) UIImagePickerControllerOriginalImage // 原始图片 UIImagePickerControllerEditedImage // 编辑后图片 UIImagePickerControllerCropRect // 裁剪尺寸 UIImagePickerControllerMediaMetadata // 拍照的元数据 UIImagePickerControllerMediaURL // 媒体的URL UIImagePickerControllerReferenceURL // 引用相册的URL UIImagePickerControllerLivePhoto // PHLivePhoto
小提示
Q: 在使用系统相机、相册时,发现系统语言都是英文,比如”取消”显示为”Cancel”,如何才能调整为中文A: 这里有两种处理方式
方法一(不推荐): 在info.plist文件中有一个Localization native development region,默认为en,修改为China即可,这样默认语言即为中文
方法二(推荐): 在info.plist文件中有一个Localized resources can be mixed,默认为NO,修改为YES即可,这样会随着系统语言变化
相关文章推荐
- iOS判断应用是否获取到系统相机 相册的授权 以及如何请求授权
- iOS开发中使用相机或系统相册的一些问题总结(UIImagePickerController)
- iOS使用UIImagePickerController调用系统相机、相册与图库
- iOS 打开系统相册和使用相机
- IOS开发笔记之十四——使用系统相册或相机导致状态栏隐藏的问题(bug总结四)
- iOS 打开系统相册和使用相机
- ios开发 使用系统相册和相机
- iOS开发swift如何调用系统相册和相机获取图片设置用户头像
- 【Android】使用系统相机或者从相册中获取图片资源并进行适当裁剪
- iOS调用系统相册、相机 显示中文标题
- [iOS]调用系统相机,相册,闪光灯
- iOS调用系统相册、相机 显示中文标题
- iOS开发--调用系统相册、相机显示中文title
- iOS开发~优雅的使用Xcode帮助文档及帮助系统
- Android开发之系统相机相册使用
- iOS调用系统相册、相机 显示中文标题
- IOS 使用相机或者在相册里获取图片
- Qt for iOS:使用UIImagePickerController获取一个系统相册中的图片
- iOS调用系统相册、相机 显示中文标题