(本文代碼已升級至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)
}
}