调用UIImagePickerController进行拍照,录制视频.UIImagePickerController继承与
UINavigationController.用SB创建了一个ViewController,拖了2个button.上代码
#import "ViewController.h"
// 包含头文件
#import <MediaPlayer/MediaPlayer.h>
// 这个框架有用到的一些常量设置
#import <MobileCoreServices/MobileCoreServices.h>
// 遵循协议
@interface ViewController () <UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@property(nonatomic,strong) UIImagePickerController *pickercontroller; // 拍照和录制视频的类
@property(nonatomic,assign) BOOL isvideo; // 判断是拍照还是视频
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
#pragma mark - 重写pickercontroller的get方法
- (UIImagePickerController *)pickercontroller// getter
{
if (!_pickercontroller) {
_pickercontroller = [[UIImagePickerController alloc] init];
// 设置sourceType
/*
UIImagePickerControllerSourceTypePhotoLibrary, //照片库,default
UIImagePickerControllerSourceTypeCamera, // 摄像头
UIImagePickerControllerSourceTypeSavedPhotosAlbum // 相簿
*/
_pickercontroller.sourceType = UIImagePickerControllerSourceTypeCamera;
// 允许编辑
_pickercontroller.allowsEditing = YES;
// 设置代理
_pickercontroller.delegate = self;
}
if (_isvideo) {// 摄像
_pickercontroller.mediaTypes = @[(NSString *)kUTTypeMovie];// 类型录制视频
// 录制时间,默认为10min
// _pickercontroller.videoMaximumDuration
// 录制视频质量
_pickercontroller.videoQuality = UIImagePickerControllerQualityTypeHigh;
// 摄像头模式(拍照,录像)
_pickercontroller.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;
// 选取摄像头(这里选后置摄像头),default
_pickercontroller.cameraDevice = UIImagePickerControllerCameraDeviceRear;
}else{// 拍照
_pickercontroller.mediaTypes = @[(NSString *) kUTTypeImage];
}
return _pickercontroller;
}
#pragma mark - 点击事件
// 打开相机
- (IBAction)OnPhoto:(UIButton *)sender {
_isvideo = NO;
// UIImagePickerController 继承与 UINavgationController 只能用present
if ([self ShowPickerview]) {
[self presentViewController:self.pickercontroller animated:YES completion:nil];
}
}
// 打开录像
- (IBAction)OnVideo:(UIButton *)sender {
_isvideo = YES;
if ([self ShowPickerview]) {// 判断是否支持Camera
[self presentViewController:self.pickercontroller animated:YES completion:nil];
}
}
- (BOOL)ShowPickerview
{
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
return YES;
}else{
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alertC = [UIAlertController alertControllerWithTitle:@"警告" message:@"你的设备不支持Camera" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
[alertC addAction:action];
[self presentViewController:alertC animated:YES completion:nil];
});
return NO;
}
}
#pragma mark - 代理方法
// 完成
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
if ([info[UIImagePickerControllerMediaType] isEqualToString:(NSString *)kUTTypeImage]) { // 拍照
// 获取编辑后的图片
UIImage *Editedimage = info[UIImagePickerControllerEditedImage];
// 获得原图
// UIImage *Originalimage = info[UIImagePickerControllerOriginalImage];
// 将照片保存到相册
// SEL是一个异步回调(参数是固定的否者会报错),不需要的话可以写nil,
UIImageWriteToSavedPhotosAlbum(Editedimage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
// UIImageWriteToSavedPhotosAlbum(Editedimage, nil, nil, nil);
}else if ([info[UIImagePickerControllerMediaType] isEqualToString:(NSString *)kUTTypeMovie]){ // 录像
// movie的路径
NSURL *url = info[UIImagePickerControllerMediaURL];
// movie是否可以保存到相册
BOOL canbesaved = UIVideoAtPathIsCompatibleWithSavedPhotosAlbum([url path]);
if (canbesaved) {
// 将movie保存到相册
UISaveVideoAtPathToSavedPhotosAlbum(url.path, self, @selector(videoSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), nil);
}else{
NSLog(@"movie can not be saved to the Camera Roll album");
}
}else{
NSLog(@"%@",info[UIImagePickerControllerMediaType]);
}
[self dismissViewControllerAnimated:YES completion:nil];
}
// 取消
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
NSLog(@"111");
}
#pragma mark - 异步回调
- (void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
if (!error) {
NSLog(@"图片保存成功");
}else{
NSLog(@"图片保存不成功,error:%@",error);
}
}
- (void)videoSavedToPhotosAlbum:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
if (!error) {
NSLog(@"视频保存成功");
}else{
NSLog(@"视频保存不成功,error:%@",error);
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end