iOS使用系统相册、相机、音视频工具类

在IOS开发中经常会用到系统相册,相机,音视频等功能。每次都写比较麻烦,自己封装了一个工具类,实现一句话调用系统相册,相机,音视频等功能。方便以后项目的开发。

//选择图片

[[OCSystemTool shareTool]choosePicture:self editor:YES finished:^(UIImage * _Nullable image) {

_headerView.image = image;

}];

//视频:http://baobab.wdjcdn.com/14562919706254.mp4

[[OCSystemTool shareTool]playVideoWithPath:@"apple.mp4" viewController:self];

//音乐

[[OCSystemTool shareTool]playAudioWithPath:@"song.mp3"];

//停止音乐播放

[[OCSystemTool shareTool]stopAudioPlayer];

本文附上OC版代码:(PS:Swift3.0版见链接www.jianshu.com/p/c8e99bf35970

.h文字

////  Tool.h//  SystemFunction////  Copyright (c) 2017年 hailong. All rights reserved.//#import#import#import#import@interface Tool : NSObject///<1>定义block

typedef void(^myBlock)(UIImage * _Nullable image);

///<2>声明属性

@property (nonatomic, copy) myBlock _Nullable block;

//音频播放器

@property (nonatomic, strong) AVAudioPlayer * _Nullable audioPlayer;

//带有视频播放器的控制器,能够播放MP4、MOV、avi、以及流媒体m3u8格式的视频,能够播放远程和本地的视频资源

@property (nonatomic, strong) AVPlayerViewController * _Nullable playerController;

@property (nonatomic, strong) AVPlayer *_Nullable videoPlayer;

//1 返回单例的静态方法

+(Tool *_Nullable)shareTool;

//2 选择图片

- (void)choosePicture:(UIViewController *_Nullable)controller editor:(BOOL)editor finished:(void (^_Nullable)(UIImage * _Nullable image))success;

//3 播放声音

- (void)playAudioWithPath:(NSString *_Nullable)sound;

//停掉音频

- (void)stopAudioPlayer;

///4 播放视频

-(void)playVideoWithPath:(NSString *_Nullable)videoPath viewController:(UIViewController*_Nullable)viewController;

//返回特定尺寸的UImage  ,  image参数为原图片,size为要设定的图片大小

-(UIImage*_Nonnull)resizeImageToSize:(CGSize)size

sizeOfImage:(UIImage *_Nullable)image;

//在指定的视图内进行截屏操作,返回截屏后的图片

-(UIImage *_Nullable)imageWithScreenContentsInView:(UIView *_Nullable)view;

@end

.m文件

////  Tool.m//  SystemFunction////  Copyright (c) 2017年 hailong. All rights reserved.//#import "Tool.h"#import//里面预置了跟系统设置资源相关的常量和一些参数#import@implementation Tool

static Tool *_shareTool =nil;

///1 返回单例的静态方法

+(Tool *)shareTool

{

//确保线程安全

@synchronized(self){

//确保只返回一个实例

if (_shareTool == nil) {

_shareTool = [[Tool alloc] init];

}

}

return _shareTool;

}

-(id)init

{

self = [super init];

if (self) {

}

return self;

}

///2 选择图片

- (void)choosePicture:(UIViewController *)controller editor:(BOOL)editor finished:(void (^)(UIImage * _Nullable image))success{

///<3>实现block

self.block = success;

UIAlertController *alertC = [UIAlertController alertControllerWithTitle:@"请选择图片" message:nil preferredStyle:(UIAlertControllerStyleActionSheet)];

[alertC addAction:[UIAlertAction actionWithTitle:@"拍照" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {

//相机

[self loadImagePickerWithSourceType:UIImagePickerControllerSourceTypeCamera controller:controller editor:editor];

}]];

[alertC addAction:[UIAlertAction actionWithTitle:@"从相册选取" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {

//相册库

[self loadImagePickerWithSourceType:UIImagePickerControllerSourceTypePhotoLibrary controller:controller editor:editor];

}]];

[alertC addAction:[UIAlertAction actionWithTitle:@"取消" style:(UIAlertActionStyleCancel) handler:^(UIAlertAction * _Nonnull action) {

}]];

[controller presentViewController:alertC animated:YES completion:nil];

}

///3 播放声音

- (void)playAudioWithPath:(NSString *_Nullable)audioPath{

//音频

NSURL *url;

//https 更安全的http协议

if ([audioPath rangeOfString:@"http://"].location != NSNotFound||[audioPath rangeOfString:@"https://"].location != NSNotFound) {

//远程的地址

url = [NSURL URLWithString:audioPath];

}else{

//本地的路径

NSString *localPath = [[NSBundle mainBundle] pathForResource:audioPath ofType:nil];

if (localPath.length==0) {

NSLog(@"没有读到资源!");

return;

}

url = [NSURL fileURLWithPath:localPath];

}

if (_audioPlayer) {

_audioPlayer = nil;

}

//AVPlayer

_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

//设置代理

_audioPlayer.delegate = self;

[_audioPlayer prepareToPlay];//预处理

[_audioPlayer play];//播放

}

//停掉音频

- (void)stopAudioPlayer{

if (_audioPlayer) {

[_audioPlayer stop];//停止播放

_audioPlayer = nil;

}

}

///4 播放视频

-(void)playVideoWithPath:(NSString *)videoPath viewController:(UIViewController*)viewController{

NSURL *url;

//https 更安全的http协议

if ([videoPath rangeOfString:@"http://"].location !=NSNotFound||[videoPath rangeOfString:@"https://"].location!=NSNotFound) {

//远程的地址

url = [NSURL URLWithString:videoPath];

}else{

NSString *localPath = [[NSBundle mainBundle] pathForResource:videoPath ofType:nil];

if (localPath.length==0) {

NSLog(@"没有找到资源");

return;

}

url = [NSURL fileURLWithPath:localPath];

}

_playerController = [[AVPlayerViewController alloc]init];

_videoPlayer = [[AVPlayer alloc]initWithURL:url];

_playerController.player = _videoPlayer;

/*

可以设置的值及意义如下:

AVLayerVideoGravityResizeAspect  不进行比例缩放 以宽高中长的一边充满为基准

AVLayerVideoGravityResizeAspectFill 不进行比例缩放 以宽高中短的一边充满为基准

AVLayerVideoGravityResize    进行缩放充满屏幕

*/

_playerController.videoGravity = AVLayerVideoGravityResizeAspect;

[viewController presentViewController:_playerController animated:YES completion:^{

[self stopAudioPlayer];//停掉音频

//播放

[_playerController.player play];

}];

//NSNotificationCenter 通知中心,单例,可以理解为程序中的广播站

//在通知中心注册self成为某条广播的观察者(具有接收某条广播能力的一个对象)

//name 广播的名称

//作用:一旦有其他对象通过通知中心发送MPMoviePlayerPlaybackDidFinishNotification这条广播,self就能接收到,进而触发@selector方法

//涉及到对象一对多的场景(非常重要)

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playFinished) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];

//通过通知中心发广播

//点击Done按钮,播放器会自动通过通知中心发送广播

//[[NSNotificationCenter defaultCenter] postNotificationName:MPMoviePlayerPlaybackDidFinishNotification object:nil];

}

- (void)playFinished{

//通过通知中心注销(移除)self对广播的观察

[[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:nil];

if (_playerController) {

[_playerController.player pause];

_playerController = nil;

}

}

#pragma mark - AVAudioPlayerDelegate

//一首歌播放完成后,调用此方法

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{

NSLog(@"finshed!");

}

//当操作系统级别的功能介入(短信、电话),播放器被打断时,调用

- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player{

NSLog(@"begin interruption!");

}

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags{

if (player) {

[player play];//播放和继续播放

}

}

#pragma mark - 调用相机和相册库资源

- (void)loadImagePickerWithSourceType:(UIImagePickerControllerSourceType)type controller:(UIViewController *)controller editor:(BOOL)editor{

if (![UIImagePickerController isSourceTypeAvailable:type]){

[self showAlertWithMessage:@"相机无法使用" controller:controller];

return;

}

//UIImagePickerController 系统封装好的加载相机、相册库资源的类

UIImagePickerController *picker = [[UIImagePickerController alloc] init];

//加载不同的资源

picker.sourceType =type;

//是否允许picker对图片资源进行优化

picker.allowsEditing = editor;

picker.delegate = self;

//软件中习惯通过present的方式,呈现相册库

[controller presentViewController:picker animated:YES completion:^{

}];

}

- (void)showAlertWithMessage:(NSString *)message controller:(UIViewController *)controller {

UIAlertController *alertC = [UIAlertController alertControllerWithTitle:@"温馨提示" message:message preferredStyle:(UIAlertControllerStyleAlert)];

[alertC addAction:[UIAlertAction actionWithTitle:@"确定" style:(UIAlertActionStyleCancel) handler:^(UIAlertAction * _Nonnull action) {

}]];

[controller presentViewController:alertC animated:YES completion:nil];

}

#pragma mark - 在指定的视图内进行截屏操作,返回截屏后的图片

-(UIImage *)imageWithScreenContentsInView:(UIView *)view

{

//根据屏幕大小,获取上下文

UIGraphicsBeginImageContext([[UIScreen mainScreen] bounds].size);

[view.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return viewImage;

}

-(UIImage*)resizeImageToSize:(CGSize)size

sizeOfImage:(UIImage*)image

{

UIGraphicsBeginImageContext(size);

//获取上下文内容

CGContextRef ctx= UIGraphicsGetCurrentContext();

CGContextTranslateCTM(ctx, 0.0, size.height);

CGContextScaleCTM(ctx, 1.0, -1.0);

//重绘image

CGContextDrawImage(ctx,CGRectMake(0.0f, 0.0f, size.width, size.height), image.CGImage);

//根据指定的size大小得到新的image

UIImage* scaled= UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return scaled;

}

#pragma mark - UIImagePickerControllerDelegate

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{

//选择完照片 或者 照完相之后 ,会调用该方法,并且选择的图片或者照出来的图片都存到了info里面

/*

if (picker.sourceType == UIImagePickerControllerSourceTypePhotoLibrary) {

UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];

_headerView.image = image;

}else if (picker.sourceType == UIImagePickerControllerSourceTypeCamera){

UIImage *image =[info objectForKey:UIImagePickerControllerEditedImage];

_headerView.image = image;

}*/

//获取资源的类型(图片or视频)

NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];

//kUTTypeImage 代表图片资源类型

if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {

//直接拿到选中的图片,

//手机拍出的照片大概在2M左右,拿到程序中对图片进行频繁处理之前,需要对图片进行转换,否则很容易内存超范围,程序被操作系统杀掉

UIImage *EditedImage = [info objectForKey:UIImagePickerControllerEditedImage];

UIImage *smallImage = [self resizeImageToSize:CGSizeMake(200,200) sizeOfImage:EditedImage];

///<4>调用block

self.block(smallImage);

}

[picker dismissViewControllerAnimated:YES completion:^{

}];

}

//取消选择的图片

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{

[picker dismissViewControllerAnimated:YES completion:^{

}];

}

@end

/*

@interface ImageTool()

@end

*/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容