UIImagePickerController调用相机和录制视频

调用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值