69 - Swift 之系統(tǒng)相冊的訪問和視頻的錄制(UIImagePickerController)

前言

在App的開發(fā)中我們有可能通過拍照或者手機相冊還更換用戶的頭像。還有在一些App實名認(rèn)證的時候,要錄制視頻等。我們怎么來獲取這些圖像和視頻呢? Apple 給我們提供一個類 UIImagePickerController ,我們可以通過這個類輕松的獲取到我們想要的數(shù)據(jù)信息。

一、 安全問題

在 IOS 9 以后,Apple 加強了App 的安全性,用戶在訪問手機部分硬件 或者 資源的時候,要進行授權(quán)。本Demo 要授權(quán)的信息如下:

  • Privacy - Microphone Usage Description 手機麥克風(fēng)權(quán)限

  • Privacy - Photo Library Usage Description 手機相冊權(quán)限

  • Privacy - Camera Usage Description 手機相機權(quán)限

二、 UIImagePickerController 的一些方法的介紹和使用

1、 初始化一個UIImagePickerController 對象

// TODO: 初始化對象(UIImagePickerController 繼承 UINavigationController 準(zhǔn)守 NSCoding 協(xié)議)
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)")
/**
 輸出結(jié)果:
 相機是否可用: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)")

/**
 輸出結(jié)果:
 相機支持的類型:nil
 相冊支持的類型:Optional(["public.image", "public.movie"])
 照片庫支持的類型:Optional(["public.image", "public.movie"])
 */

4、 判斷相機前后攝像頭設(shè)備是否可用

// MARK: 判斷相機前后攝像頭設(shè)備是否可用
var isCameraAble : Bool!
// 前攝像頭
isCameraAble = UIImagePickerController.isCameraDeviceAvailable(.front)
print("前攝像頭是否可用:" + "\(isCameraAble)")
// 后攝像頭
isCameraAble = UIImagePickerController.isCameraDeviceAvailable(.rear)
print("后攝像頭是否可用:" + "\(isCameraAble)")

/**
 輸出結(jié)果:
 前攝像頭是否可用:Optional(false)
 后攝像頭是否可用:Optional(false)
 
 注意: 真機可用,模擬器不可用。
 */

5、 判斷是否支持閃光燈和照明功能是否可用

// MARK: 判斷是否支持閃光燈和照明功能是否可用
var isFalshAble:Bool!
// 前閃光燈
isFalshAble = UIImagePickerController.isFlashAvailable(for: .front)
print("前閃光燈是否可用:" + "\(isFalshAble)")
// 后閃光燈
isFalshAble = UIImagePickerController.isFlashAvailable(for: .rear)
print("后閃光燈是否可用:" + "\(isFalshAble)")
/**
 輸出結(jié)果:
 前閃光燈是否可用: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)")

/**
 輸出結(jié)果:
 前攝像頭捕獲:Optional([0, 1])
 后攝像頭捕獲:Optional([0, 1])
 */

7、獲取媒體文件的頁面的一些設(shè)置

// 設(shè)置 UIImagePickerController 的代理
NwImagePickerController.delegate = self
// 設(shè)置 將要訪問的類型(相機、相冊、照片庫)
NwImagePickerController.sourceType = .camera
// 設(shè)置支持的媒體文件類型
// NwImagePickerController.mediaTypes = [kUTTypeMovie as String]
// 設(shè)置選擇的圖片是否允許編輯
NwImagePickerController.allowsEditing = true



// 設(shè)置視頻錄制的最大時間
NwImagePickerController.videoMaximumDuration = 6
/**
 設(shè)置視頻的質(zhì)量
 
 typeHigh :   高清品質(zhì)
 
 typeMedium : 中等品質(zhì)
 
 typeLow :    低等品質(zhì)
 
 type640x480 : VGA品質(zhì)
 
 typeIFrame1280x720 :   1280x720
 
 typeIFrame960x540  :   960x540
 */

NwImagePickerController.videoQuality = .typeLow

// 設(shè)置是否顯示相機的控制版面,默認(rèn)是顯示的。
NwImagePickerController.showsCameraControls = true

// 設(shè)置相機的覆蓋層View
let  View = UIView.init(frame: CGRect.init(x: 0, y: 0, width: 100, height: 100))
View.backgroundColor = UIColor.red
NwImagePickerController.cameraOverlayView = View

// 設(shè)置攝影畫布的旋轉(zhuǎn)
NwImagePickerController.cameraViewTransform = .init(rotationAngle: 0.7)

// 判斷是否開始視頻的采集
let isStartVideoCapture = NwImagePickerController.startVideoCapture()
print(isStartVideoCapture)
// 停止視頻的采集
NwImagePickerController.stopVideoCapture()

// 手動結(jié)束媒體文件的獲取
NwImagePickerController.takePicture()

顯示頁面的方法

// 跳轉(zhuǎn)到獲取媒體文件的頁面
self.present(NwImagePickerController, animated: true, completion: nil)

8、 媒體文件獲取或者取消的代理方法的實現(xiàn)

// MARK: 訪問相冊的代理
// TODO:  相冊訪問完畢信息回調(diào)
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    print(info)
    /**
     輸出結(jié)果:
     ["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)
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容