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. springboot logback 集成

    在 application.yml 中敲 logging.pattern.consle ,IDEA 会联想到对应的值.单击属性就可以跳到 LoggingApplicationListener.java ...

  2. Kafka Java API获取非compacted topic总消息数

    目前Kafka并没有提供直接的工具来帮助我们获取某个topic的当前总消息数,需要我们自行写程序来实现.下列代码可以实现这一功能,特此记录一下: /** * 获取某个topic的当前消息数 * Jav ...

  3. Apache Maven 打包可执行jar

    在本文的 参考资料 部分,您将发现大量介绍 Maven 的入门教程.本文的 5 个技巧目的是帮助您解决即将出现的一些问题:使用 Maven 管理您的应用程序的生命周期时,将会出现的编程场景. 1. 可 ...

  4. sonar-scanner的执行流程和对ClassLoader,动态代理的使用

    最近项目上使用了sonarqube来提供静态代码检查的服务,在看sonar-scanner的源码的时候,发现sonar-scanner用来分析的jar包是从sonar的服务器上下载下来的,使用自定义的 ...

  5. 7.5爬取猫眼Top100电影名单

    2018-7-5 20:22:57 还有有一丢丢成就感!以后可以爬取简单网站了!比如妹子图片,只是现在不知道咋下载! 正则还是刚看,要多去用正则!正则很强大的东西! #!/usr/bin/env py ...

  6. python爬虫之真实世界中的网页解析

    Request和Response Request是我们平常浏览网页,向网站所在的服务器发起请求,而服务器收到请求后,返回给我们的回应就是Response,这种行为就称为HTTP协议,也就是客户端(浏览 ...

  7. 有时候不用explode截取字符串了,可以用用substr()

    substr()   截取出来的是一位数组, 比如:<?php   echo substr("Hello world",6);   ?>  意思就是截取出前六个字符,只 ...

  8. Android开发实战(申明:来源于网络)

    Android开发实战(申明:来源于网络) 地址:http://so.csdn.net/so/search/s.do?q=Android%E5%BC%80%E5%8F%91%E5%AE%9E%E6%8 ...

  9. Python----八荣八耻

    以动手实践为荣 , 以只看不练为耻; 以打印日志为荣 , 以单步跟踪为耻; 以空格缩进为荣 , 以制表缩进为耻; 以单元测试为荣 , 以人工测试为耻; 以模块复用为荣 , 以复制粘贴为耻; 以多态应用 ...

  10. Windows小技巧 -- 目录内打开CMD的快捷方式

    工作中常常会有需要在某个文件夹内使用cmd的情况,例如运行某脚本,下面演示几种方法. 以进入以下目录操作为例: 方式一 : 常用的cd命令 cd命令是我们平常使用比较多的方式: 1. Win+R打开c ...