AlbumService询问相机权限

AuthorizationService相机封装

plist文件设置:

<key>NSCameraUsageDescription</key>
<string>App需要您的同意,才能访问相机</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>App需要您的同意,才能访问相册</string>

代码:AlbumService.h

 
#import "AuthorizationService.h"
#import<AssetsLibrary/AssetsLibrary.h>
#import<CoreLocation/CoreLocation.h>
#import<AVFoundation/AVCaptureDevice.h>
#import <AVFoundation/AVMediaFormat.h>
@implementation AuthorizationService
/**
判断是否有相机权限
*/
+ (BOOL)isHaveCameraAuthor{
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; if (authStatus ==AVAuthorizationStatusRestricted ||//此应用程序没有被授权访问的照片数据。可能是家长控制权限
authStatus ==AVAuthorizationStatusDenied) //用户已经明确否认了这一照片数据的应用程序访问 {
// 无权限 引导去开启
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if ([[UIApplication sharedApplication]canOpenURL:url]) { [[UIApplication sharedApplication]openURL:url]; }
return NO;
}
return YES;
}
/**
判断是否有相册访问权限
*/
+ (BOOL)isHavePhotoAuthor{
ALAuthorizationStatus author = [ALAssetsLibrary authorizationStatus]; if (author ==kCLAuthorizationStatusRestricted || author ==kCLAuthorizationStatusDenied){
//无权限 引导去开启
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
} return NO; }
return YES;
}
@end

AlbumService.h

#import <Foundation/Foundation.h>

@interface AlbumService : NSObject
@property (nonatomic,assign) UIImagePickerControllerSourceType sType;
@property (nonatomic,strong) UIImage *selectedImage;
@property (nonatomic,assign) id imageStateKey;
@property (nonatomic,strong) void (^doneSelectBlock)(UIImage *image);
+(AlbumService *)sharedContactsService;
-(void)showAlbumInViewController:(UIViewController *)curVc;;
-(void)hideAlbum;
@end

AlbumService.m

#import "AlbumService.h"

@interface AlbumService ()<UINavigationControllerDelegate,UIImagePickerControllerDelegate>
{
UIImagePickerController *imagePicker;
} @end @implementation AlbumService
static AlbumService *contacts;
+(AlbumService *)sharedContactsService{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
contacts = [AlbumService new];
});
return contacts;
} #pragma mark - setter
-(void)setSType:(UIImagePickerControllerSourceType)sType
{
_sType = sType;
if (![UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) {
_sType = UIImagePickerControllerSourceTypePhotoLibrary;
}
} #pragma mark - public
-(void)showAlbumInViewController:(UIViewController *)curVc
{
UIImagePickerControllerSourceType sourceType = self.sType?:UIImagePickerControllerSourceTypePhotoLibrary;
if (!imagePicker) {
imagePicker = [[UIImagePickerController alloc]init];
imagePicker.delegate = self;
imagePicker.allowsEditing = YES;
}
imagePicker.sourceType = sourceType; [curVc presentViewController:imagePicker animated:YES completion:nil]; } -(void)hideAlbum
{
[imagePicker dismissViewControllerAnimated:YES completion:nil];
} #pragma mark - UIImagePickerViewDelegate
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSString *stateKey = self.imageStateKey?:UIImagePickerControllerEditedImage;
UIImage *resultImage = [info valueForKey:stateKey]; __weak typeof(self) weakSelf = self;
if (weakSelf.doneSelectBlock) {
weakSelf.doneSelectBlock(resultImage);
} [picker dismissViewControllerAnimated:YES completion:nil];
} -(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[picker dismissViewControllerAnimated:YES completion:nil];
}
@end

使用

 AlbumService *service = [AlbumService sharedContactsService];

/*打开相册*/
if([AuthorizationService isHavePhotoAuthor]){//是否有相册权限
service.sType = UIImagePickerControllerSourceTypePhotoLibrary;
}else{
return;
} /*打开相机*/
if([AuthorizationService isHaveCameraAuthor]){{//是否有相机权限
service.sType = UIImagePickerControllerSourceTypeCamera;
}else{
return;
} __block typeof(self)weakSelf = self;
service.doneSelectBlock = ^(UIImage *img){
//回调的UIImage
_choseImg = img; };
[service showAlbumInViewController:self];

OC相机封装的更多相关文章

  1. OC面向对象—封装

    OC面向对象—封装 一.面向对象和封装 面向对象的三大特性:封装(成员变量).继承和多态 在OC语言中,使用@interface和@implementation来处理类. @interface就好像暴 ...

  2. oc之封装「可输入值」的UIStepper

    2017.07.17 18:10* 字数 66 阅读 644评论 0喜欢 5 oc之封装「可输入值」的UIStepper 最终效果 要求: Platform: iOS7.0+ Language: Ob ...

  3. OC的封装、继承与多态

    面向对象有三大特征:封装.继承和多态. 一.封装 封装是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问.简而言之,信息隐藏,隐 ...

  4. 「OC」 封装

    一.面向对象和封装 面向对象的三大特性:封装.继承和多态 在OC语言中,使用@interface和@implementation来处理类.   @interface就好像暴露在外面的时钟表面,像外界提 ...

  5. OC面向对象封装

    面向对象语言的三大特性:封装.继承.多态 封装:不暴露自己类的内部的属性,提高自己的数据的安全性:就像一个接线盒一样,内部结构看不到,只有外部的接口提供给我们使用,这样既安全又美观:在代码方面就是结构 ...

  6. oc之封装与类之间的关系

    1. 面向对象的特征-封装? 封装: 现实生活中的封装: 将很多的小东西 塞在1个大口袋里面. 好处: a. 对外部屏蔽. b. 方便管理. 代码的封装: 函数/方法 就是1种封装的体现: 将一段代码 ...

  7. oc UIAlertController封装

    #define SHOWALERT(MESSAGE) \ UIAlertController *alertController = [UIAlertController alertController ...

  8. Unity中Oculus分屏相机和普通相机一键切换

    Unity中Oculus分屏相机和普通相机一键切换 一.OCulus 分屏相机介绍 在VR开发工程中,总会觉得OC分屏的处理太慢,严重浪费时间啊! 但是不使用有不好调试,来回切换相机就成为了一个必须. ...

  9. iOS开发 - OC - block的详解 - 基础篇

    深入理解oc中的block 苹果在Mac OS X10.6 和iOS 4之后引入了block语法.这一举动对于许多OC使用者的编码风格改变很大.就我本人而言,感觉block用起来还是很爽的,但一直以来 ...

随机推荐

  1. WebView与 JS 交互方式

    前言 现在很多App里都内置了Web网页(Hybrid App),比如说很多电商平台,淘宝.京东.聚划算等等,如下图 上述功能是由Android的WebView实现的,其中涉及到Android客户端与 ...

  2. 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库 —— MariaDB 安装配置

    一.安装并使用MariaDB作为Ambari.Hive.Hue的存储数据库. yum install mariadb-server mariadb 启动.查看状态,检查mariadb是否成功安装 sy ...

  3. [Tensorflow] Object Detection API - build your training environment

    一.前期准备 Prepare protoc Download Protocol Buffers Create folder: protoc and unzip it. unsw@unsw-UX303U ...

  4. vue中引入jquery

    npm install jquery -S 在webpack.base.conf.js里加入 plugins: [ new webpack.optimize.CommonsChunkPlugin('c ...

  5. 解决windows和ubuntu之间粘贴复制失效

    vmware12中ubuntu15.10 16.10的vmware tools失效,导致不能复制粘贴文件以及自动适应窗口分辨率新安装或异常关机和重新划分分区导致的vmware tools失效,不能复制 ...

  6. NUC972 linux 烧录

    节介绍如何刻录uboot.kernel和文件系统到NAND Flash, 并且设定NUC970系列芯片从NAND Flash中开机.本节操作需要windows环境下进行.(初次连接电脑需要安装驱动) ...

  7. 【Java并发编程六】线程池

    一.概述 在执行并发任务时,我们可以把任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程,只要池里有空闲的线程,任务就会分配一个线程执行.在线程池的内部,任务被插入一个阻塞队列(Blo ...

  8. db2 Reorgchk:重组检查,是否需要重组

    Reorgchk:重组检查,是否需要重组.判断表或索引是否需要重组,有2种方法:1.通过reorgchk工具  reorgchk工具利用8个公式(3个表公式,5个索引公式),如果表统计结果F1,F2或 ...

  9. hdu6330 多校3 L 画一个cube

    http://acm.hdu.edu.cn/showproblem.php?pid=6330 技巧:循环变量要选1~A,然后把公式写下标里.会快很多 #define _CRT_SECURE_NO_WA ...

  10. Sharding与数据库分区(Partition) 分表、分库、分片和分区

    Sharding与数据库分区(Partition) http://blog.sina.com.cn/s/blog_72ef7bea0101cjtb.html https://www.2cto.com/ ...