相机这个功能在iOS中很常用,自己也写过好几次了,都是知道大概,然后就把上一次的代码直接照搬过去就OK了,但是,像这种非常基础的东西我们还是需要独立的去写,而不是copy代码,等到我们熟记于心的时候,再copy吧。今天终于把这块儿知识认真的看了一下,不多说了 上代码。
1.+ (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType; // returns YES if source is available (i.e. camera present)
isSourceTypeAvailable: 检测用户的设备,有没有支持所指定 的媒体类型() 一般是第一道判断。
例如 在模拟器下
[UIImagePickerControllerisSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary]; 这句代码返回 YES。
但是 [UIImagePickerControllerisSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]; 这句就返回 NO。
typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
UIImagePickerControllerSourceTypePhotoLibrary,
UIImagePickerControllerSourceTypeCamera,
UIImagePickerControllerSourceTypeSavedPhotosAlbum
};
2. + (NSArray *)availableMediaTypesForSourceType:(UIImagePickerControllerSourceType)sourceType; // returns array of available media types (i.e. kUTTypeImage)
获取能够支持的媒体类型的 public.image/public.movie
若 没有支持的 则返回为0. 例如, 模拟器下调用这个代码
NSArray* availableMediaTypes =
[UIImagePickerControlleravailableMediaTypesForSourceType:
UIImagePickerControllerSourceTypeCamera];
那么 数组 availableMediaTypes 为nil。
下面我们就开始创建 你所需要的功能了,
3.//创建图像选取控制器
UIImagePickerController* imagePickerController =
[[UIImagePickerControlleralloc] init]; // 这才是核心内容,前面的内容都是些用于过滤的 “守卫”。
4. //设置图像选取控制器的来源模式为相机模式
imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; // 这句 决定了你是想,打开相册呢还是打开相机呢,三个参数自己根据需求去写。
这里我补充一下,肯定有许多小朋友迷惑UIImagePickerControllerSourceTypePhotoLibrary 和 UIImagePickerControllerSourceTypeSavedPhotosAlbum有什么区别呢,今天yoyo就告诉你吧,
这两个的区别就是对于用户的相册有没有分类,PhotoLibrary 是分类的,所以有两页,第一页是分类,第二类是图片或者视频。而SavedPhotosAlbum没有分类,只有一页,即就是PhotoLibrary类型的第二页。
typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
UIImagePickerControllerSourceTypePhotoLibrary,
UIImagePickerControllerSourceTypeCamera,
UIImagePickerControllerSourceTypeSavedPhotosAlbum
};
继续看代码,我给小伙伴们细细讲解,
5.//设置图像选取控制器的类型 mediaTypes 所支持的媒体类型
imagePickerController.mediaTypes = [[[NSArray alloc]
initWithObjects:(NSString*)kUTTypeMovie,kUTTypeImage, nil] autorelease];
小伙伴们,你们知道有些APP里面的照相功能只有拍照没有摄像,或者两者都有呢?或者是 在相册里面,只有视频或者只有图片,或者全都有?你们可能也很想知道这个答案。
我这就给你们讲,
首先在第4阶部分已经选取了媒体类型,
假设 imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
那么对于
imagePickerController.mediaTypes = [[[NSArray alloc]
initWithObjects:(NSString*)kUTTypeMovie,kUTTypeImage, nil] autorelease];
就是相册里面既有视频也有图片。若是你只要其一,则只在数组里面去修改元素。
假设 imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera; 表示启用了相机,那么
imagePickerController.mediaTypes = [[[NSArray alloc]
initWithObjects:(NSString*)kUTTypeMovie,kUTTypeImage, nil] autorelease];
就表示 既能拍照也能拍视频。
上面的5阶 已经说完了8成,然后就是设置一些参数,和跳转picker功能
//设置摄像图像品质
imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;
//设置最长摄像时间(秒数)
imagePickerController.videoMaximumDuration = 30;
//允许用户进行编辑
imagePickerController.allowsEditing = YES;
//设置委托对象 imagePickerController的协议是
<UINavigationControllerDelegate, UIImagePickerControllerDelegate >大家记好了啊。
imagePickerController.delegate = self;
//以模式视图控制器的形式显示
[selfpresentModalViewController:imagePickerController animated:YES];
在camera 或 album 里面 点击 “取消”按钮的时候,就会调用下面的这个委托方法
- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{
[picker dismissModalViewControllerAnimated:YES];
}
点击“确定”按钮的时候,就会调用这个委托方法
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
//打印出字典中的内容
NSLog(@"Get the media info: %@", info);
**1. //获取媒体类型
NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];
//判断是静态图像还是视频
if([mediaType isEqualToString:(NSString*)kUTTypeImage])
也可以这样写
if([mediaType isEqualToString:@"public.image")
{
//获取用户编辑之后的图像
UIImage* editedImage =
**2. [info objectForKey:UIImagePickerControllerEditedImage];
//将该图像保存到媒体库中
UIImageWriteToSavedPhotosAlbum(editedImage, self,
@selector(image:didFinishSavingWithError:contextInfo:), NULL);
}
else if([mediaType isEqualToString:(NSString*)kUTTypeMovie])
{
//获取视频文件的URL
**3. NSURL* mediaURL = [info objectForKey:UIImagePickerControllerMediaURL];
//创建ALAssetsLibrary对象并将视频保存到媒体库 需要抛出 #import <AssetsLibrary/AssetsLibrary.h>
ALAssetsLibrary* assetsLibrary = [[ALAssetsLibrary alloc] init];
[assetsLibrary writeVideoAtPathToSavedPhotosAlbum:mediaURL
completionBlock:^(NSURL* assetURL, NSError* error)
{
if (!error)
{
NSLog(@"Captured video saved with no error.");
}
else
{
NSLog(@"Error occured while saving the video:\n%@", error);
}
}];
[assetsLibrary release];
}
[picker dismissModalViewControllerAnimated:YES];
}
}
**1, **2, **3这三步很重要 请大家熟记。 完了 ,我今天要讲解的就是这些了。大家自己写写demo吧,趁热打铁。
- (IBAction)takePictureButtonClick:(id)sender
{
if(![UIImagePickerController isSourceTypeAvailable:
UIImagePickerControllerSourceTypePhotoLibrary])
{
NSLog(@"Sorry, no camera or camera is unavailable.");
return;
}
//获得相机模式下支持的媒体类型
NSArray* availableMediaTypes =
[UIImagePickerController availableMediaTypesForSourceType:
UIImagePickerControllerSourceTypeCamera];
BOOL canTakePicture = NO;
for (NSString* mediaType in availableMediaTypes)
{
// UIImagePickerControllerSourceTypePhotoLibrary、UIImagePickerControllerSourceTypeCamera、UIImagePickerControllerSourceTypeSavedPhotosAlbum
//public.image
//public.movie
if([mediaType isEqualToString:(NSString*)kUTTypeImage])
{
//支持拍照
canTakePicture = YES;
break;
}
}
//检查是否支持拍照
if(!canTakePicture)
{
NSLog(@"Sorry, taking picture is not supported.");
return;
}
//创建图像选取控制器
UIImagePickerController* imagePickerController =
[[UIImagePickerControlleralloc] init];
//设置图像选取控制器的来源模式为相机模式
imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
//UIImagePickerControllerSourceTypeSavedPhotosAlbum 没有视频 只有展示图片的页面
//UIImagePickerControllerSourceTypePhotoLibrary 没有视频 但是在第一页有分类
//设置图像选取控制器的类型为静态图像
// imagePickerController.mediaTypes = [[[NSArray alloc]
// initWithObjects:(NSString*)kUTTypeMovie, nil] autorelease];
//允许用户进行编辑
imagePickerController.allowsEditing = YES;
//设置委托对象
imagePickerController.delegate = self;
//以模式视图控制器的形式显示
[selfpresentModalViewController:imagePickerController animated:YES];
[imagePickerController release];
}