前言
在App的开发中我们有可能通过拍照或者手机相册还更换用户的头像。还有在一些App实名认证的时候,要录制视频等。我们怎么来获取这些图像和视频呢? Apple 给我们提供一个类 UIImagePickerController ,我们可以通过这个类轻松的获取到我们想要的数据信息。
一、 安全问题
在 IOS 9 以后,Apple 加强了App 的安全性,用户在访问手机部分硬件 或者 资源的时候,要进行授权。本Demo 要授权的信息如下:
-
Privacy - Microphone Usage Description 手机麦克风权限
-
Privacy - Photo Library Usage Description 手机相册权限
-
Privacy - Camera Usage Description 手机相机权限
二、 UIImagePickerController 的一些方法的介绍和使用
1、 初始化一个UIImagePickerController 对象
// TODO: 初始化对象(UIImagePickerController 继承 UINavigationController 准守 NSCoding 协议)
let NwImagePickerController = UIImagePickerController.init()
2、判断相机、相册、照片库 等资源是否可用
// TODO: 判断相机、相册、照片库 等资源是否可用
var isAble:Bool!
// 相机
isAble = UIImagePickerController.isSourceTypeAvailable(.camera)
print("相机是否可用:" + "\(isAble)")
// 相册
isAble = UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum)
print("相册是否可用:" + "\(isAble)")
// 照片库
isAble = UIImagePickerController.isSourceTypeAvailable(.photoLibrary)
print("照片库是否可用:" + "\(isAble)")
/**
输出结果:
相机是否可用:Optional(false)
相册是否可用:Optional(true)
照片库是否可用:Optional(true)
注释: 相机必须在真机上才可以使用。模拟器不可使用,所以返回 false。
*/
3、 MARK: 获取 相机、相册、照片库 所支持的类型
// MARK: 获取 相机、相册、照片库 所支持的类型
// 相机
var MediaTypes:[String]?
MediaTypes = UIImagePickerController.availableMediaTypes(for: .camera)
print("相机支持的类型:" + "\(MediaTypes as Any)")
// 相册
MediaTypes = UIImagePickerController.availableMediaTypes(for: .savedPhotosAlbum)
print("相册支持的类型:" + "\(MediaTypes as Any)")
// 照片库
MediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)
print("照片库支持的类型:" + "\(MediaTypes as Any)")
/**
输出结果:
相机支持的类型:nil
相册支持的类型:Optional(["public.image", "public.movie"])
照片库支持的类型:Optional(["public.image", "public.movie"])
*/
4、 判断相机前后摄像头设备是否可用
// MARK: 判断相机前后摄像头设备是否可用
var isCameraAble : Bool!
// 前摄像头
isCameraAble = UIImagePickerController.isCameraDeviceAvailable(.front)
print("前摄像头是否可用:" + "\(isCameraAble)")
// 后摄像头
isCameraAble = UIImagePickerController.isCameraDeviceAvailable(.rear)
print("后摄像头是否可用:" + "\(isCameraAble)")
/**
输出结果:
前摄像头是否可用:Optional(false)
后摄像头是否可用:Optional(false)
注意: 真机可用,模拟器不可用。
*/
5、 判断是否支持闪光灯和照明功能是否可用
// MARK: 判断是否支持闪光灯和照明功能是否可用
var isFalshAble:Bool!
// 前闪光灯
isFalshAble = UIImagePickerController.isFlashAvailable(for: .front)
print("前闪光灯是否可用:" + "\(isFalshAble)")
// 后闪光灯
isFalshAble = UIImagePickerController.isFlashAvailable(for: .rear)
print("后闪光灯是否可用:" + "\(isFalshAble)")
/**
输出结果:
前闪光灯是否可用:Optional(false)
后闪光灯是否可用:Optional(true)
注意: 真机可用,模拟器不可用。
*/
6、判断相机捕获的类型
// MARK: 判断相机捕获的类型
var CaptureMode:[NSNumber]?
// 前摄像头捕获
CaptureMode = UIImagePickerController.availableCaptureModes(for: .front)
print("前摄像头捕获:" + "\(CaptureMode as Any)")
// 后摄像头捕获
CaptureMode = UIImagePickerController.availableCaptureModes(for: .front)
print("后摄像头捕获:" + "\(CaptureMode as Any)")
/**
输出结果:
前摄像头捕获:Optional([0, 1])
后摄像头捕获:Optional([0, 1])
*/
7、获取媒体文件的页面的一些设置
// 设置 UIImagePickerController 的代理
NwImagePickerController.delegate = self
// 设置 将要访问的类型(相机、相册、照片库)
NwImagePickerController.sourceType = .camera
// 设置支持的媒体文件类型
// NwImagePickerController.mediaTypes = [kUTTypeMovie as String]
// 设置选择的图片是否允许编辑
NwImagePickerController.allowsEditing = true
// 设置视频录制的最大时间
NwImagePickerController.videoMaximumDuration = 6
/**
设置视频的质量
typeHigh : 高清品质
typeMedium : 中等品质
typeLow : 低等品质
type640x480 : VGA品质
typeIFrame1280x720 : 1280x720
typeIFrame960x540 : 960x540
*/
NwImagePickerController.videoQuality = .typeLow
// 设置是否显示相机的控制版面,默认是显示的。
NwImagePickerController.showsCameraControls = true
// 设置相机的覆盖层View
let View = UIView.init(frame: CGRect.init(x: 0, y: 0, width: 100, height: 100))
View.backgroundColor = UIColor.red
NwImagePickerController.cameraOverlayView = View
// 设置摄影画布的旋转
NwImagePickerController.cameraViewTransform = .init(rotationAngle: 0.7)
// 判断是否开始视频的采集
let isStartVideoCapture = NwImagePickerController.startVideoCapture()
print(isStartVideoCapture)
// 停止视频的采集
NwImagePickerController.stopVideoCapture()
// 手动结束媒体文件的获取
NwImagePickerController.takePicture()
显示页面的方法
// 跳转到获取媒体文件的页面
self.present(NwImagePickerController, animated: true, completion: nil)
8、 媒体文件获取或者取消的代理方法的实现
// MARK: 访问相册的代理
// TODO: 相册访问完毕信息回调
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
print(info)
/**
输出结果:
["UIImagePickerControllerMediaType": public.image, "UIImagePickerControllerReferenceURL": assets-library://asset/asset.JPG?id=B84E8479-475C-4727-A4A4-B77AA9980897&ext=JPG, "UIImagePickerControllerOriginalImage": <UIImage: 0x600000095b30> size {4288, 2848} orientation 0 scale 1.000000]
*/
picker.dismiss(animated: true, completion: nil)
// 获取类型
if info[UIImagePickerControllerMediaType] as! String == "public.image" {
// 把获取的媒体文件保存到相册
UIImageWriteToSavedPhotosAlbum(info[UIImagePickerControllerOriginalImage] as! UIImage, self, #selector(savedPhotosAlbum), nil)
}else {
// 获取选取的媒体的路径
let mediaPath = info[UIImagePickerControllerMediaURL] as! URL
print(mediaPath.absoluteString)
// 把录制的视频保存到相册
let isSaveVideo = UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(mediaPath.absoluteString)
print(isSaveVideo)
}
}
func savedPhotosAlbum() {
print("保存完成")
}
// TODO: 用户取消访问相册
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
print("用户取消访问手机相册")
picker.dismiss(animated: true, completion: nil)
}
网友评论