文章目錄
0.Info.plist-privavy(獲取用戶隱私權限)
- 從相冊中獲取照片不需要在Info.plist中添加privacy字段獲取用戶授權,但跳到相冊後需要用戶主動選照片
- 拍照的時候需要添加NSCameraUsageDescription字段向
- 相冊裏存照片或視頻時需要添加NSPhotoLibraryAddUsageDescription字段
- 錄像的時候需要添加NSMicrophoneUsageDescription字段
- 如下圖:
- 在Info.plist中沒有添加相關字段會報如下的錯誤:
This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSPhotoLibraryAddUsageDescription key with a string value explaining to the user how the app uses this data.
1.示例代碼
//
// ViewController.m
// autoCamera
//
// Created by macvivi on 2020/6/4.
// Copyright © 2020 macvivi. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()<UIImagePickerControllerDelegate>
// 相機控制器
@property(strong,nonatomic)UIImagePickerController *pickController;
@property (strong, nonatomic) IBOutlet UIImageView *imageView;
@end
@implementation ViewController
//點擊button後跳到相機控制器
- (IBAction)shootBtnClick:(UIButton *)sender {
// 推出UIImagePickerController的時候只能present, push的話會崩潰
[self presentViewController:self.pickController animated:YES completion:nil];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self setCamera];
}
- (void)setCamera{
self.pickController = [[UIImagePickerController alloc]init];
self.pickController.delegate = self; //代理設置
// self.pickController.mediaTypes
//指定媒體類型是什麼 照片還是視頻
//默認爲 照片
//通過下一行方法可以返回支持的類型
// [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
//查到很多資料都是"kUTTypeMovie","kUTTypeImage"這兩個參數名稱但是我測試後發現已經變成下面這兩種名稱
//"public.image" 照片
//"public.movie" 視頻
//如果全部支持可以這麼設置
// self.pickController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
//單個支持
// self.pickController.mediaTypes = @[@"public.image"];
self.pickController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
// 1.UIImagePickerControllerSourceTypePhotoLibrary:表示從照片庫/集選取照片或視頻 默認值
// 2.UIImagePickerControllerSourceTypeCamera:表示從攝像頭選取照片或視頻(也就是拍照或錄製視頻)
// 3.UIImagePickerControllerSourceTypeSavedPhotosAlbum:表示僅僅從相冊中選取照片或視頻
self.pickController.sourceType = UIImagePickerControllerSourceTypeCamera;
}
//用戶選好照片或視頻後會調用這個代理方法
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info{
NSLog(@"拍照,錄像,或選好錄像,視頻的回調");
NSLog(@"info:%@",info);
//查看是視頻還是照片 public.image 或 public.movie
NSString * mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:@"public.image"]) {
NSLog(@"照片");
//獲取拍到的照片
UIImage* originalImage = [info objectForKey:UIImagePickerControllerOriginalImage];
//把照片存入相冊
UIImageWriteToSavedPhotosAlbum(originalImage, nil, nil, nil);
}else if ([mediaType isEqualToString:@"public.movie"]){
NSLog(@"視頻");
//獲取視頻地址
NSURL *mediaUrl = [info objectForKey:UIImagePickerControllerMediaURL];
NSString *urlPath = [mediaUrl path];
//保存視頻到相冊
UISaveVideoAtPathToSavedPhotosAlbum(urlPath, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);
}
[self dismissViewControllerAnimated:YES completion:nil];
}
//用戶點取消後會調用這個代理方法
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[self dismissViewControllerAnimated:YES completion:nil];
NSLog(@"取消");
}
//保存好視頻後的回調方法
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
NSLog(@"videoPath:%@",videoPath);
NSLog(@"error:%@",error);
NSLog(@"contextInfo:%@",contextInfo);
}
@end
2.UIImagePickerControllerSourceTypePhotoLibrary和UIImagePickerControllerSourceTypeSavedPhotosAlbum的區別(效果圖)
UIImagePickerControllerSourceTypePhotoLibrary(有分類和目錄,如下圖)
UIImagePickerControllerSourceTypeSavedPhotosAlbum(沒有有分類和目錄,如下圖)
3.拍照(演示圖和打印)
4.錄像(演示圖和打印)
參考博客:
iOS UIImagePickerController輕鬆調用相機詳細介紹