当我们需要调用相机时,通常有两个方案,一是使用系统定制UI的UIImagePickerController,二是使用可以自定义UI的AVCaptureSession。

如果我们不要求自定义UI则可以直接使用UIImagePickerController,可以节省时间。

@interface UIImagePickerController : UINavigationController

我们来看一下整个流程:

  • 1.在项目的info.plist中添加相关使用描述:
 <key>NSCameraUsageDescription</key><string>这里添加相机权限描述</string><key>NSMicrophoneUsageDescription</key><string>这里添加麦克风权限描述</string><key>NSPhotoLibraryAddUsageDescription</key><string>这里添加保存到相册权限描述</string><key>NSPhotoLibraryUsageDescription</key><string>这里添加相册权限描述</string>
  • 2.初始化UIImagePickerController
    @property (strong,nonatomic) UIImagePickerController* pickController;//在跳转到相机的方法中if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {self.pickController = [[UIImagePickerController alloc]init];self.pickController.sourceType = UIImagePickerControllerSourceTypeCamera;self.pickController.mediaTypes = @[@"public.image"];self.pickController.delegate = self;         //代理设置self.pickController.allowsEditing = NO;      //是否提供编辑交互界面 比如说拍完照之后的编辑页面(缩放,剪裁等)//使用内置编辑控件时,图像选择器控制器会强制执行某些选项。对于照片,强制执行方形裁剪以及最大像素尺寸。对于视频,选择器强制执行最大电影长度和分辨率。如果要让用户指定自定义裁剪,则必须提供自己的编辑UI。self.pickController.showsCameraControls = NO;//是否显示相机控制按钮self.pickController.cameraOverlayView = self.cameraOverLayView; //自定义相机控制页面//如果不需要自定义控制页面可以省略上面两行//设置闪光灯模式self.pickController.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto;/*typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraFlashMode) {UIImagePickerControllerCameraFlashModeOff  = -1,UIImagePickerControllerCameraFlashModeAuto = 0,UIImagePickerControllerCameraFlashModeOn   = 1}*/}else{return;}

其中:

[UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
//如果设备可用返回YES 否则返回NO

首先使用该方法来测试设备相机的可用性。

Note: Always call the isSourceTypeAvailable: class method of the UIImagePickerController class and respect its return value. Never assume that a device has a camera. Even if the device has a camera, this method returns NO if the camera is unavailable.

永远要调用这个方法来测试设备相机。永远不要主观认为每个设备都有相机。一个设备即使有摄像头,在那个摄像头不可用时,该方法也会返回NO

self.pickController.sourceType
// default value is UIImagePickerControllerSourceTypePhotoLibrary.
// 选择要访问的源类型
//typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
//    UIImagePickerControllerSourceTypePhotoLibrary,     //图库
//    UIImagePickerControllerSourceTypeCamera,           //相机
//    UIImagePickerControllerSourceTypeSavedPhotosAlbum  //相机胶卷
//}
self.pickController.mediaTypes
//指定媒体类型是什么 照片还是视频
//默认为 照片
//通过下一行方法可以返回支持的类型
[UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
//查到很多资料都是"kUTTypeMovie","kUTTypeImage"这两个参数名称但是我测试后发现已经变成下面这两种名称
//"public.image"  照片
//"public.movie"  视频
//如果全部支持可以这么设置
self.pickController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
//单个支持
self.pickController.mediaTypes = @[@"public.image"];

最后设置完代理后,别忘了遵守协议

<UINavigationControllerDelegate,UIImagePickerControllerDelegate>
  • 3.实现协议方法:
// 控制器不会自己dismiss 需要我们手动在相应的地方实现
// 这两个代理方法只会收到其中一个,取决于用户的点击情况//结束采集之后 之后怎么处理都在这里写 通过Infokey取出相应的信息  Infokey可在进入文件中查看
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey, id> *)info{
//查看是视频还是照片  public.image 或 public.movie
NSString * mediaType = [info objectForKey:UIImagePickerControllerMediaType];if ([mediaType isEqualToString:@"public.image"]) {//照片UIImage* editedImage =(UIImage *)[info objectForKey:UIImagePickerControllerEditedImage]; //取出编辑过的照片UIImage* originalImage =(UIImage *)[info objectForKey:UIImagePickerControllerOriginalImage];//取出原生照片UIImage* imageToSave = nil;if(editedImage){imageToSave = editedImage;} else {imageToSave = originalImage;}//将新图像(原始图像或已编辑)保存到相机胶卷UIImageWriteToSavedPhotosAlbum(imageToSave,nil,nil,nil);}
}if ([mediaType isEqualToString:@"public.movie"]) {//视频
}
}- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;
//用户点击了取消
  • 4.跳转到相机前确认权限:

首先还是要确认一下app的各种权限是否打开:

AVAuthorizationStatus cameraStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
//相机权限
//     typedef NS_ENUM(NSInteger, AVAuthorizationStatus) {
//     AVAuthorizationStatusNotDetermined = 0,
//     AVAuthorizationStatusRestricted    = 1,
//     AVAuthorizationStatusDenied        = 2,
//     AVAuthorizationStatusAuthorized    = 3,
//     } API_AVAILABLE(macos(10.14), ios(7.0))
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];/* 相册权限检测 需要导入 #import <Photos/Photos.h> 框架typedef NS_ENUM(NSInteger, PHAuthorizationStatus) {PHAuthorizationStatusNotDetermined = 0, // 用户还没有选择PHAuthorizationStatusRestricted,        // 客户端未被授权访问。用户不能改变状态,可能是由于家长控制PHAuthorizationStatusDenied,            // 用户明确拒绝PHAuthorizationStatusAuthorized         // 用户同意访问} PHOTOS_AVAILABLE_IOS_TVOS_OSX(8_0, 10_0, 10_13);*/[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {//相册访问权限   if (status == PHAuthorizationStatusAuthorized) {NSLog(@"Authorized");}else{NSLog(@"Denied or Restricted");}}];

ps:这里有一个坑。

测试手机版本(12.1.4)

点击拒绝访问用户相册之后还是会进入相册,且下次也可以进入,貌似不需要用户授权即可访问用户相册。

把Info.plist中的相册使用权限描述删除之后 且 把相册权限检测方法删掉 可以直接访问用户相册不报错。

如果添加了相册检测方法则需要在Info.plist文件中添加相册使用描述,否则报错。

在需要跳转的地方执行:

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion;

即可进入到系统定制UI的相机页面,这时我们可能会发现为什么界面都是英文的呢?

这样做:

在Localizations中添加中文源,然后在target中改成China即可。

  • 说下CameraOverLayView

UIImageViewController的这个属性,可以给其赋值实现自定义相机控制view。就是说我们自己写好一个view上面有各种控制按钮,将其替代系统的相机控制按钮(快门键,切换前后置,闪光灯控制等)。

@property(nullable, nonatomic,strong) __kindof UIView *cameraOverlayView  NS_AVAILABLE_IOS(3_1);   // set a view to overlay the preview view.

需要搭配:


@property(nonatomic) BOOL showsCameraControls NS_AVAILABLE_IOS(3_1);   // 是否显示系统标准控制UI。默认YES
  • 可能会遇到的问题:

如果在选择

        self.pickController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

运行时发生这样的错误提示:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Source type must be UIImagePickerControllerSourceTypeCamera'

注意:

当我们使用相册的时候 就无法将这个

self.pickController.showsCameraControls = YES;

设置为YES;

解决办法:  不写这一行,采用默认值;

iOS UIImagePickerController轻松调用相机详细介绍相关推荐

  1. iOS学习:调用相机,选择图片上传,带预览功能

    iOS学习:调用相机,选择图片上传,带预览功能 发表于2年前(2013-05-30 21:38)   阅读( 18194) | 评论( 16) 27人收藏此文章,我要收藏 赞3 8月22日珠海 OSC ...

  2. iOS 开发之调用相机

    iOS开发之调用相机 苹果移动设备调用相机功能 项目过程中遇到一个功能需求(调用相机拍照) 第一步 要使用系统相机必须遵守 @interface ImmediateAnswerViewControll ...

  3. 明日之后android和ios,明日之后安卓ios互通区有哪些?ios安卓混服区详细介绍

    原标题:明日之后安卓ios互通区有哪些?ios安卓混服区详细介绍 明日之后安卓ios是有互通区的,但是昨天安卓平台上线之后,很多安卓玩家找不到互通区服务器,所以今天小编给大家说说游戏中具体的互通服务器 ...

  4. iOS 最新版本调用相机与相册

    今天发现调用相机,崩了.试试看调用相册,又崩了.然后看到控制台输出了以下信息: This app has crashed because it attempted to access privacy- ...

  5. Unity与IOS交互,调用相机相册,兼容ipad

    IOS篇 在处理unity和ios的时候,除了对oc不太习惯以外,还有就是iphone和ipad有些方法需要做区别.比如通用的弹窗方法不用,以及ipad上打开相册竟然可以支持显示的相册不是全屏了!好吧 ...

  6. php 调用模板,关于模板调用的详细介绍

    这篇文章主要介绍了dedecms 模板调用解析最简代码,需要的朋友可以参考下dedecms模板下载地址: www.php.cn/xiazai/code/dedecms<?php require_ ...

  7. iOS App转让流程须知详细介绍

    by Neek.chen 情况: 开发公司用自己的开发者账号上线的,现在我们公司自己申请的开发者账号,想用自己的账号提交应用,升级,该如何操作? 一.App的转让 (1)App转让的条件 至少有在Ap ...

  8. html5 调用系统相册,iOS之H5调用系统相册相机浏览文件

    在我们iOS开发中大家遇到过H5和原生交互,需要上传文件,刚开始的思路肯定是在之前轻车熟路的js交互中原生方法获取文件之后上传,今天我们了解一个新的方法,其实苹果官方给我们提供了一个更简单的方法, H ...

  9. vivado调用IP核详细介绍

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江湖,在"闯荡江湖"."行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢. ...

最新文章

  1. 2022-2028年中国儿童医疗行业深度调研及投资前景预测报告
  2. mysql安装ZIP存档什么意思_关于MySQLzip安装常见报错解决方案!
  3. Hadoop HA+Federation 高可用联邦模式搭建指南
  4. 可以进行单元测试么_前端与单元测试
  5. a1740最新php唯美博客系统源码,axublog 个人博客系统 php版 v1.1.1
  6. read命令_dbatools Read-DbaBackupHeader命令的便捷功能
  7. Linux多线程通信
  8. Netty源码解析1-Buffer 1
  9. java运维工程师简历模板_系统运维工程师个人个人简历模板.doc
  10. 5G mib和sib的意义
  11. 黑马程序员-随笔-我与程序员
  12. 32位 shell.efi x86_EFI Shell 命令参考
  13. 狮子,狼,羊群的故事
  14. python md5计算
  15. 数字信号内插方法的python实现
  16. 淘宝小程序 表单组件checkbox的默认样式修改
  17. Tensorflow实现DeepFM(代码分析)
  18. java 中结束程序方法
  19. 妹子好不好,只看一个地方!
  20. android从底部弹出动画效果,七星电子游戏 -七星电子游戏V8.5.51

热门文章

  1. SIEMENSplc200和电脑电缆通讯设置(设置PC/PG接口)
  2. 全球及中国普瑞巴林API行业竞争格局分析与发展方向预测报告2022-2028年
  3. Camunda流程平台
  4. 团体程序设计天梯赛L2-023 图着色问题
  5. MPLS VXN配置实例
  6. 微信打字的隐藏鸿蒙系统,【苹果iPhone12Pro评测】盘点微信各种隐藏小功能 看到第一个就愣住了-中关村在线...
  7. apktool.bat获取方式
  8. K210快速上手教程(色块、人脸、声源识别等)
  9. 新版小O地图EXCEL版0.6.5.0--专业地图EXCEL插件
  10. python学习--quote()函数