Swift - 从相册中选择视频(过滤掉照片,使用UIImagePickerController)
(本文代码已升级至Swift4)
有时我们需要从系统相册中选择视频录像,来进行编辑或者上传操作,这时使用 UIImagePickerController 就可以实现。
默认情况下,UIImagePickerController 打开系统“照片”后允许用户选择所有的媒体文件(不管是照片还是录像),我们可以通过 mediaTypes 属性设置。让其只显示视频录像。
1,样例说明
(1)下面样例点击“选择视频”按钮后,会自动打开相册选择视频。
(2)由于设置了 mediaTypes,所有的图片都会过滤掉,只留下视频选择。
(3)选择完毕,系统会自动将视频复制一个到应用的 tmp 文件夹(临时文件夹)下。我们可以直接对这个文件进行操作,而不会影响到系统相册中的原视频。
(4)本样例选择后,就直接使用 AVPlayerViewController 进行播放。
2,效果图
可以看到选择后,视频会被复制到 tmp 目录下:
选择完毕后自动播放该视频:
3,样例代码
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
import UIKit import MobileCoreServices import AssetsLibrary import AVKit import AVFoundation class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{ override func viewDidLoad() { super.viewDidLoad() //创建一个ContactAdd类型的按钮 let button:UIButton = UIButton(type:.system) button.frame = CGRect(x:10, y:150, width:100, height:30) button.setTitle("选择视频", for:.normal) button.addTarget(self, action:#selector(selectVideo), for:.touchUpInside) self.view.addSubview(button) } //选择视频 @objc func selectVideo() { if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { //初始化图片控制器 let imagePicker = UIImagePickerController() //设置代理 imagePicker.delegate = self //指定图片控制器类型 imagePicker.sourceType = .photoLibrary //只显示视频类型的文件 imagePicker.mediaTypes = [kUTTypeMovie as String] //不需要编辑 imagePicker.allowsEditing = false //弹出控制器,显示界面 self.present(imagePicker, animated: true, completion: nil) } else { print("读取相册错误") } } //选择视频成功后代理 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { //获取视频路径(选择后视频会自动复制到app临时文件夹下) let videoURL = info[UIImagePickerControllerMediaURL] as! URL let pathString = videoURL.relativePath print("视频地址:\(pathString)") //图片控制器退出 self.dismiss(animated: true, completion: {}) //播放视频文件 reviewVideo(videoURL) } //视频播放 func reviewVideo(_ videoURL: URL) { //定义一个视频播放器,通过本地文件路径初始化 let player = AVPlayer(url: videoURL) let playerViewController = AVPlayerViewController() playerViewController.player = player self.present(playerViewController, animated: true) { playerViewController.player!.play() } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } |
原文出自: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、使用相册选择步骤:
- 判断是否支持要使用的图片库或相册功能
- 初始化图片控制器对象
- 指定图片控制器对象的代理
- 指定图片控制器的类型,前提是必须先导入MobileCoreServices.framework框架
- 弹出显示图片控制器
- 实现图片控制住器代理方法
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)
}
}
Swift - 从相册中选择视频(过滤掉照片,使用UIImagePickerController)的更多相关文章
- swift -从相册中选择照片并上传
选择本地图片并上传是应用开发中一个比较常见的功能. 原文出自:www.hangge.com 转载请保留原文链接:http://www.hangge.com/blog/cache/det ...
- 微信 6.5.1 for iOS发布 可以在朋友圈分享相册中的视频
今天微信 6.5.1 for iOS发布了,最主要的一个功能是可以在朋友圈分享相册中的视频,卖转发朋友圈视频软件的家伙估计要哭了.微信这次更新,更有利于个人号的运营,个人号的价值将更高.先定一个小目标 ...
- android: 从相册中选择照片
虽然调用摄像头拍照既方便又快捷,但并不是每一次我们都需要去当场拍一张照片的. 因为每个人的手机相册里应该都会存有许许多多张照片,直接从相册里选取一张现有的照 片会比打开相机拍一张照片更加常用.一个优秀 ...
- 从系统相册中选择GIF图片上传到服务器
-(void)assetPickerController:(ZYQAssetPickerController *)picker didFinishPickingAssets:(NSArray *)as ...
- ios从相册:摄像头中获取视频
ios从相册/摄像头中获取视频 如何从相册中获取视频 使用的是一个和获取照片相同的类UIImagePickerController //相册中获取视频 - (IBAction)clickViedoOF ...
- Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切
效果:注意:1:网络权限<;;;); intent.putExtra(); ); intent.putExtra(); intent.putExtra(, byteArrayOutputStre ...
- Swift4.0 从相册中获取图片和拍照
第一步 添加协议 UIImagePickerControllerDelegate,UINavigationControllerDelegate 第二步 添加选择方式 let sexActionSh ...
- iOS - 选取相册中iCloud云上图片和视频的处理
关于iOS选取相册中iCloud云上图片和视频 推荐看:TZImagePickerController的源码,这个是一个非常靠谱的相册选择图片视频的库 .当然也可以自己写 如下遇到的问题 工作原因, ...
- open file /var/mobile/Media/DCIM 相册中获取到的视频地址使用 报错 视频文件不存在
从相册中获取到的视频地址 例如 file:///var/mobile/Media/DCIM/100APPLE/IMG_9876.MOV 后面再使用的时候报错 视频文件不存在 那是因为在ios10. ...
随机推荐
- Java设计模式之Iterator模式
分类: [java]2013-07-15 10:58 917人阅读 评论(0) 收藏 举报 所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式.本文以java中的容器为例 ...
- 八: IO流,数据的读写传输
IO流概括图: IO流的分类: 按流: 输入流(InputStream和Reader):从硬盘或者别的地方读入内存 输出流(OutputStream和Writer):从内存里向硬盘或别的地方输出 按 ...
- CrossOriginFilter
当使用jQuery Ajax post请求时可能会遇到类似这样的错误提示 XMLHttpRequest cannot oad http://xxxxxx. Origin http://xxxxxx i ...
- 初级入门 --- web GL绘制点
" 万丈高楼平地起." 01基础知识 一.相关术语 图元 :WebGL 能够绘制的基本图形元素,包含三种:点.线段.三角形. 片元:可以理解为像素,像素着色阶段是在片元着色器中. ...
- 转linux top 命令
top 命令 每天一个linux命令(44):top命令 非常好的一篇博文,这位作者<每天一个linux命令>系列写的非常棒! 关于top的cpu使用率超过100% 在环境中会出现这种现象 ...
- 编程题目 定义栈的数据类型,请在类型中实现一个能够得到栈最小元素的minx函数。
首先自己用 节点 实现了 栈 这种数据类型 为了实现题目了要求,我使用的两个栈. 一个栈 用来 push pop 用户的数据, 另外一个栈用来存放 最小元素(涉及元素比较) 代码如下: #!/usr/ ...
- iOS中html打开APP传参
1.在项目info.plist中添加URL Types以供html调用 2.html代码 <html> <head lang="en"> <meta ...
- [Java] Eclipse 设置相同变量背景色高亮显示
在Eclipse中,鼠标选中或者光标移动到java类的变量名时,相同变量会被标识显示(设置背景色高亮), 并且侧边滚动条会标出变量的位置, 查找变量十分方便. 1.相同变量标识高亮显示:Window ...
- 主机ping虚拟机失败。虚拟机ping主机,可以ping通。
原文:https://blog.csdn.net/ww1473345713/article/details/51490525 今天打开虚拟机,然后用Xshell远程连接,发现连接不上.按照以下顺序检查 ...
- Spring Boot -- 认识Spring Boot
在前面我们已经学习过Srping MVC框架,我们需要配置web.xml.spring mvc配置文件,tomcat,是不是感觉配置较为繁琐.那我们今天不妨来试试使用Spring Boot,Sprin ...