iOS 系統定製相機UIImagePickerController

0.Info.plist-privavy(獲取用戶隱私權限)

xcode刪除隱私權限緩存Info.plist

  • 從相冊中獲取照片不需要在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輕鬆調用相機詳細介紹

UIImagePickerControllerSourceType 指定的幾種圖片的來源

UIImagePickerController拍照/相冊/錄像/本地視頻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章