在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
(本文代码已升级至Swift4)
有时我们需要从系统相册中选择视频录像,来进行编辑或者上传操作,这时使用 UIImagePickerController 就可以实现。 默认情况下,UIImagePickerController 打开系统“照片”后允许用户选择所有的媒体文件(不管是照片还是录像),我们可以通过 mediaTypes 属性设置。让其只显示视频录像。
1,样例说明 (1)下面样例点击“选择视频”按钮后,会自动打开相册选择视频。 (2)由于设置了 mediaTypes,所有的图片都会过滤掉,只留下视频选择。 (3)选择完毕,系统会自动将视频复制一个到应用的 tmp 文件夹(临时文件夹)下。我们可以直接对这个文件进行操作,而不会影响到系统相册中的原视频。 (4)本样例选择后,就直接使用 AVPlayerViewController 进行播放。
2,效果图
可以看到选择后,视频会被复制到 tmp 目录下:
选择完毕后自动播放该视频:
3,样例代码
原文出自:www.hangge.com 转载请保留原文链接:http://www.hangge.com/blog/cache/detail_1192.html
一、介绍 图片选择或者拍照功能: 1、选择相册中的图片或是拍照,都是通过UIImagePickerController控制器实例化一个对象,然后通过self.presentViewController方法推出界面显示。但是使用presentViewController的类需要实现UIImagePickerControllerDelegate、UINavigationController两个代理。 2、UIImagePickerController可以通过isSourceTypeAvailable方法来判断设备是否支持照相机/图片库/相册功能。如果支持,可以通过sourceType属性来设置图片控制器的显示类型。类型一共分为3种:PhotoLibrary(照片库)、Camera(相机)、SavedPhotoAlbum(相册) 3、实现协议截图
二、实例 1、使用相册选择步骤:
func chooseImageFromAlbum(){
//判断是否支持要使用的图片库 if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
//初始化图片控制器 let picker = UIImagePickerController()
//设置代理 picker.delegate = self
//设置媒体类型 picker.mediaTypes = [kUTTypeImage as String,kUTTypeVideo as String]
//设置允许编辑 picker.allowsEditing = true
//指定图片控制器类型 picker.sourceType = .photoLibrary
//弹出控制器,显示界面 self.present(picker, animated: true, completion: nil) } else{
let alert = UIAlertView.init(title: "读取相册错误!", message: nil, delegate: nil, cancelButtonTitle: "确定") alert.show() } }
//实现图片控制器代理方法 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
//查看info对象 print(info)
//获取选择的原图 let originImage = info[UIImagePickerControllerOriginalImage] as! UIImage
//赋值,图片视图显示图片 self.pickerView.image = originImage
//图片控制器退出 picker.dismiss(animated: true, completion: nil) }
//取消图片控制器代理 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
//图片控制器退出 picker.dismiss(animated: true, completion: nil) } 2、拍照步骤:
func takePhotoFromCamera() {
//判断是否支持相机 if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
//初始化图片控制器 let picker = UIImagePickerController()
//设置代理 picker.delegate = self
//设置媒体类型 picker.mediaTypes = [kUTTypeImage as String,kUTTypeVideo as String]
//设置来源 picker.sourceType = UIImagePickerControllerSourceType.camera
//设置镜头 front:前置摄像头 Rear:后置摄像头 if UIImagePickerController.isCameraDeviceAvailable(UIImagePickerControllerCameraDevice.front) { picker.cameraDevice = UIImagePickerControllerCameraDevice.front }
//设置闪光灯(On:开、Off:关、Auto:自动) picker.cameraFlashMode = UIImagePickerControllerCameraFlashMode.on
//允许编辑 picker.allowsEditing = true
//打开相机 self.present(picker, animated: true, completion: nil) } else{
let alert = UIAlertView.init(title: "找不到相机!", message: nil, delegate: nil, cancelButtonTitle: "确定") alert.show() } }
程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
// // ViewController.swift // SwiftExample // // Created by administrator on 2019/2/15. // Copyright © 2019 administrator. All rights reserved. //
import UIKit import AVFoundation import MobileCoreServices import AssetsLibrary import AVKit
class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
func isCameraAvailable() -> Bool { return UIImagePickerController.isSourceTypeAvailable(.camera) }
func cameraSuportsMedia(mediaType:String, sourceType: UIImagePickerController.SourceType) -> Bool { let availabelMediaTypes = UIImagePickerController.availableMediaTypes(for: sourceType) for type in availabelMediaTypes! { if type == mediaType{ return true } } return false }
func doesCameraSupportShootingVideos() -> Bool { return cameraSuportsMedia(mediaType: (kUTTypeMovie as NSString) as String, sourceType: .camera) } func doesCameraSupportTakingPhotos() -> Bool { return cameraSuportsMedia(mediaType: (kUTTypeImage as NSString) as String, sourceType: .camera) }
func isFrontCameraAvailable() -> Bool { return UIImagePickerController.isCameraDeviceAvailable(.front) } func isRearCameraAvailable() -> Bool { return UIImagePickerController.isCameraDeviceAvailable(.rear) }
func isFlashAvailableOnFrontCamera() -> Bool { return UIImagePickerController.isFlashAvailable(for: .front) } func isFlashAvailableOnRearCamera() -> Bool { return UIImagePickerController.isFlashAvailable(for: .rear) }
//确定视图控制器的ViewDidAppear方法是否被调用,如果没有则展示拍照视图 var beenhereBefore = false var imagePickerController :UIImagePickerController? override func viewDidAppear(_ animated: Bool) { if beenhereBefore { //viewDidapear方法无论何时,在视图控制器展现时都会被调用,设置此值,控制器只展示一次 return } else { beenhereBefore = true } if isCameraAvailable() && doesCameraSupportTakingPhotos() { imagePickerController = UIImagePickerController() if let theController = imagePickerController{ theController.sourceType = .camera theController.mediaTypes = [kUTTypeImage as NSString, kUTTypeVideo as NSString] as [String] // theController.mediaTypes = [kUTTypeVideo as NSString] as [String] theController.allowsEditing = true theController.delegate = self present(theController, animated: true) {
} } } else { print("Camera is not available") } }
override func viewDidLoad() { super.viewDidLoad()
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { let mediaType = info[.mediaType] if let type:AnyObject = mediaType as AnyObject{ if type is String{
if let stringType :String = type as! String { if stringType as NSString == kUTTypeVideo as NSString { let urlOfVideo = info[.mediaURL] as! NSURL if let url:NSURL = urlOfVideo{ print("rul \(url)") } } if stringType as NSString == kUTTypeImage as NSString{ if let metadata = info[.mediaMetadata]{ let image = info[.originalImage] as! UIImage if let theImage:UIImage = image{ print("image MetaData \(metadata)") print("\(theImage)") } } } }
} } }
}
swift3 访问相册和摄像头 2017年05月10日 11:07:11 EIamor 阅读数:1245
版权声明:hahahaha , 努力 ing https://blog.csdn.net/EIamor/article/details/71515771 第一步:需要在项目中的Info.plist中添加相应的键 访问相册:Privacy - Photo Library Usage Description 访问摄像头:Privacy - Camera Usage Description 它们对应的值可以随意填写,但是其值是显示给用户的信息 第二步:请求访问
***注意:如果用button设置接收图片,则此button的类型不能为系统样式,即 addImageBtn.buttonType = .system 是无法设置成功的。 求大手告诉原因~~ 这个例子中一整个图片添加是一个Button点击触发选择图片事件 首先要遵守UIImagePickerControllerDelegate,和UINavigationControllerDelegate 然后在button点击触发的事件中添加如下代码 @IBAction func chosePhoto(_ sender: UIButton) { guard UIImagePickerController.isSourceTypeAvailable(.photoLibrary)else{ //如果是要访问相机只需要将.photoLibrary改为.camera即可 print("无法获得相册授权") return } let picker = UIImagePickerController() picker.allowsEditing = false //不允许编辑图片 picker.sourceType = .photoLibrary //选择器访问的是相册(如果是访问相机则将.photoLibrary改为.camera) picker.delegate = self //设置代理 self.present(picker, animated: true, completion: nil)//以模态视图弹出选择器 }
guard 的作用是保证应用获得用户授权之后才能访问相册 第三步:访问完相册之后就要让在相册中被点击的图片设置为Button的图片 //必须要先设置picker的代理 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
//被点击的图片的信息保存在info字典中 self.albumBtn.setImage(info[UIImagePickerControllerOriginalImage] as? UIImage, for: .normal)
self.albumBtn.imageView?.contentMode = .scaleAspectFill self.albumBtn.imageView?.clipsToBounds = true
dismiss(animated: true, completion: nil) }
结果: 5.15更新**************************************** 之前的版本里在打开相册的时候只能选择图片而不能选择视频,这是因为UIImagePickerViewController.mediaTypes为设置,当mediaTypes没设置的时候默认为kUTTypeImage ,即:只选择图片 所以当要选择视频的时候只需要将mediaTypes 设置为 kUTTypeMovie即可 例: let picker = UIImagePickerController() picker.delegate = self picker.allowsEditing = true picker.sourceType = .photoLibrary picker.mediaTypes = [kUTTypeMovie as String , kUTTypeImage as String] //可以选择视频和图片
present(picker, animated: true, completion: nil) 然后在 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])方法中判断选择的是图片还是视频之后在做需要做的操作 例: func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let type = info[UIImagePickerControllerMediaType] as? String //获取所选中项目的类型 if type == kUTTypeMovie as String{ //判断选中的是图片还是视频 let videoURL = info[UIImagePickerControllerMediaURL] as! NSURL
self.dismiss(animated: true, completion: nil) //写出你要做的操作,我这里的示例是做的共享的操作 let activityViewController = UIActivityViewController(activityItems: [videoURL], applicationActivities: nil) activityViewController.popoverPresentationController?.sourceView = self.view self.present(activityViewController, animated: true, completion: nil) }else{ let image = info[UIImagePickerControllerOriginalImage] as! UIImage self.selectedImage = image self.dismiss(animated: true, completion: nil) let shareVC = UIActivityViewController(activityItems: [image], applicationActivities: nil)
shareVC.popoverPresentationController?.sourceView = self.view present(shareVC, animated: true, completion: nil) } } |
请发表评论