69 - Swift 之系统相册的访问和视频的录制(UIImagePickerController)

前言

在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)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,527评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,687评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,640评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,957评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,682评论 6 413
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,011评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,009评论 3 449
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,183评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,714评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,435评论 3 359
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,665评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,148评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,838评论 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,251评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,588评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,379评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,627评论 2 380

推荐阅读更多精彩内容