(本文代码已升级至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

Swift3.0:照片选择

一、介绍

图片选择或者拍照功能:

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)的更多相关文章

  1. swift -从相册中选择照片并上传

    选择本地图片并上传是应用开发中一个比较常见的功能.        原文出自:www.hangge.com  转载请保留原文链接:http://www.hangge.com/blog/cache/det ...

  2. 微信 6.5.1 for iOS发布 可以在朋友圈分享相册中的视频

    今天微信 6.5.1 for iOS发布了,最主要的一个功能是可以在朋友圈分享相册中的视频,卖转发朋友圈视频软件的家伙估计要哭了.微信这次更新,更有利于个人号的运营,个人号的价值将更高.先定一个小目标 ...

  3. android: 从相册中选择照片

    虽然调用摄像头拍照既方便又快捷,但并不是每一次我们都需要去当场拍一张照片的. 因为每个人的手机相册里应该都会存有许许多多张照片,直接从相册里选取一张现有的照 片会比打开相机拍一张照片更加常用.一个优秀 ...

  4. 从系统相册中选择GIF图片上传到服务器

    -(void)assetPickerController:(ZYQAssetPickerController *)picker didFinishPickingAssets:(NSArray *)as ...

  5. ios从相册:摄像头中获取视频

    ios从相册/摄像头中获取视频 如何从相册中获取视频 使用的是一个和获取照片相同的类UIImagePickerController //相册中获取视频 - (IBAction)clickViedoOF ...

  6. Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切

    效果:注意:1:网络权限<;;;); intent.putExtra(); ); intent.putExtra(); intent.putExtra(, byteArrayOutputStre ...

  7. Swift4.0 从相册中获取图片和拍照

    第一步 添加协议 UIImagePickerControllerDelegate,UINavigationControllerDelegate   第二步 添加选择方式 let sexActionSh ...

  8. iOS - 选取相册中iCloud云上图片和视频的处理

    关于iOS选取相册中iCloud云上图片和视频  推荐看:TZImagePickerController的源码,这个是一个非常靠谱的相册选择图片视频的库 .当然也可以自己写 如下遇到的问题 工作原因, ...

  9. open file /var/mobile/Media/DCIM 相册中获取到的视频地址使用 报错 视频文件不存在

    从相册中获取到的视频地址 例如  file:///var/mobile/Media/DCIM/100APPLE/IMG_9876.MOV 后面再使用的时候报错 视频文件不存在  那是因为在ios10. ...

随机推荐

  1. swoole之异步文件IO

    一.代码部分 读: <?php /** * 异步文件系统仅限于4.3.0之前的版本 * 读取文件 */ $filename = dirname(__FILE__).DIRECTORY_SEPAR ...

  2. 2-10 就业课(2.0)-oozie:13、14、clouderaManager的服务搭建

    3.clouderaManager安装资源下载 第一步:下载安装资源并上传到服务器 我们这里安装CM5.14.0这个版本,需要下载以下这些资源,一共是四个文件即可 下载cm5的压缩包 下载地址:htt ...

  3. 软件构造 Lab1

    大二软件构造第一次实验 本人本次实验操作系统:macOS high Sierra 10.13.3 任务一:MagicSquare 对于本任务,主要需要实现两个方法,一个是isLegalMagicSqu ...

  4. 洛谷 P3435 [POI2006]OKR-Periods of Words

    题目传送门 解题思路: 这道题题面比较乱,先说一下这道题要求什么: 对于一个字符串,求它及它的所有前缀的一个答案串的长度之和,答案串就是对于一个字符串,找到一个它的一个前缀,这个前缀后面在复制一遍,得 ...

  5. 数十万PhpStudy用户被植入后门,快来检测你是否已沦为“肉鸡”!

    北京时间9月20日,杭州公安发布<杭州警方通报打击涉网违法犯罪暨‘净网2019’专项行动战果>一文,文章曝光了国内知名PHP调试环境程序集成包“PhpStudy软件”遭到黑客篡改并植入“后 ...

  6. dataGridView与数据源dataTable同步排序

    private void dataGridView1_Sorted(object sender, EventArgs e)         {             string _sortStr ...

  7. leetcode1019 Next Greater Node In Linked List

    """ We are given a linked list with head as the first node. Let's number the nodes in ...

  8. ELK之 elasticsearch ES集群 head安装

    最近项目用到 jenkins  ELK  也在一次重新学习了一次  jenkins 不用说了 玩得就是  插件   +  base---shell ,  ELK  这几年最流得log收集平台,当然不止 ...

  9. 适配器之SimpleAdapter

    前言: 在写适配器时,SimpleAdapter会经常使用到,虽然他比ArrayAdapter复杂,但是也提供了更多的功能 正文: 我们接下来先从SimpleAdapter中较为简单的显示两行文本开始 ...

  10. S7-300 实训3 异步电机正反转控制

    含有视频 方便以后查阅 参考书籍 跟我动手学 S7-300/400 PLC 第2版  廖常初 主编 实训3 异步电动机 正反转控制 步骤1 步骤2 在 cycle execution 前方 右击 插入 ...