关于
UIImagePickerController的相关知识,
UIImagePickerController继承自UINavigationController 并且遵守UINavigationControllerDelegate和UIImagePickerControllerDelegate协议
一、UIImagePickerController类
UIImagePickerController 这个类可以为大家提供照相的功能,以及图片,视频浏览的功能。
二、检查硬件是否安装有摄像头或者允许操作相册
#pragma mark - 摄像头和相册相关的公共类
// 判断设备是否有摄像头
-(BOOL)isCameraAvailable{
return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
}
// 前面的摄像头是否可用
-(BOOL)isFrontCameraAvailable{
return [UIImagePickerControllerisCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];
}
// 后面的摄像头是否可用
-(BOOL)isRearCameraAvailable{
return [UIImagePickerControllerisCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];
}
// 判断是否支持某种多媒体类型:拍照,视频
-(BOOL)cameraSupportsMedia:(NSString *)paramMediaTypesourceType:(UIImagePickerControllerSourceType)paramSourceType{
__block BOOL result= NO;
if ([paramMediaType length]== 0){
NSLog(@"Media type is empty.");
return NO;
}
NSArray *availableMediaTypes=[UIImagePickerControlleravailableMediaTypesForSourceType:paramSourceType];
[availableMediaTypes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL*stop){
NSString *mediaType= (NSString *)obj;
if ([mediaTypeisEqualToString:paramMediaType]){
result= YES;
*stop= YES;
}
}];
return result;
}
// 检查摄像头是否支持录像
-(BOOL)doesCameraSupportShootingVideos{
return [self cameraSupportsMedia:( NSString *)kUTTypeMoviesourceType:UIImagePickerControllerSourceTypeCamera];
}
// 检查摄像头是否支持拍照
-(BOOL)doesCameraSupportTakingPhotos{
return [self cameraSupportsMedia:( NSString *)kUTTypeImagesourceType:UIImagePickerControllerSourceTypeCamera];
}
#pragma mark - 相册文件选取相关
//相册是否可用
-(BOOL)isPhotoLibraryAvailable{
return [UIImagePickerControllerisSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary];
}
//是否可以在相册中选择视频
-(BOOL)canUserPickVideosFromPhotoLibrary{
return [selfcameraSupportsMedia:( NSString *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypePhotoLibrary];
}
//是否可以在相册中选择视频
-(BOOL)canUserPickPhotosFromPhotoLibrary{
return [selfcameraSupportsMedia:( NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypePhotoLibrary];
}
三、用摄像头进行拍照和录像功能
1.我们将UIImagePickerController功能写在一个按钮的点击事件中:
#pragma mark -拍照按钮事件
- (void)ClickControlAction:(id)sender{
//判断有摄像头,并且支持拍照功能
if ([selfisCameraAvailable] &&[selfdoesCameraSupportTakingPhotos]){
// 初始化图片选择控制器
UIImagePickerController *controller =[[UIImagePickerController alloc]init];
[controllersetSourceType:UIImagePickerControllerSourceTypeCamera];//设置类型
//设置所支持的类型,设置只能拍照,或则只能录像,或者两者都可以
NSString *requiredMediaType = (NSString *)kUTTypeImage;
NSString *requiredMediaType1 = (NSString *)kUTTypeMovie;
NSArray *arrMediaTypes=[NSArray arrayWithObjects:requiredMediaType,requiredMediaType1,nil];
[controller setMediaTypes:arrMediaTypes];
// 设置录制视频的质量
[controllersetVideoQuality:UIImagePickerControllerQualityTypeHigh];
//设置最长摄像时间
[controller setVideoMaximumDuration:10.f];
[controller setAllowsEditing:YES];//设置是否可以管理已经存在的图片或者视频
[controller setDelegate:self];// 设置代理
[self.navigationControllerpresentModalViewController:controller animated:YES];
[controller release];
}else {
NSLog(@"Camera is not available.");
}
}
解释:
2. setSourceType方法
通过设置
setSourceType方法可以确定调用出来的
UIImagePickerController所显示出来的界面
typedef NS_ENUM(NSInteger,UIImagePickerControllerSourceType) {
UIImagePickerControllerSourceTypePhotoLibrary,
UIImagePickerControllerSourceTypeCamera,
UIImagePickerControllerSourceTypeSavedPhotosAlbum
};
分别表示:图片列表,摄像头,相机相册
3.setMediaTypes方法
// 设置所支持的类型,设置只能拍照,或则只能录像,或者两者都可以
NSString *requiredMediaType= ( NSString *)kUTTypeImage;
NSString *requiredMediaType1= ( NSString *)kUTTypeMovie;
NSArray *arrMediaTypes=[NSArray arrayWithObjects:requiredMediaType,requiredMediaType1,nil];
[controller setMediaTypes:arrMediaTypes];
4.关于UIImagePickerControllerDelegate协议
我们要对我们拍摄的照片和视频进行存储,那么就要实现
UIImagePickerControllerDelegate
协议的方法。
#pragma mark - UIImagePickerControllerDelegate 代理方法
//保存图片后到相册后,调用的相关方法,查看是否保存成功
-(void)imageWasSavedSuccessfully:(UIImage *)paramImagedidFinishSavingWithError:(NSError *)paramErrorcontextInfo:(void*)paramContextInfo{
if (paramError == nil){
NSLog(@"Image was savedsuccessfully.");
} else {
NSLog(@"An error happened while saving theimage.");
NSLog(@"Error= %@", paramError);
}
}
//当得到照片或者视频后,调用该方法
-(void)imagePickerController:(UIImagePickerController *)pickerdidFinishPickingMediaWithInfo:(NSDictionary *)info{
NSLog(@"Picker returnedsuccessfully.");
NSLog(@"%@", info);
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
// 判断获取类型:图片
if ([mediaType isEqualToString:( NSString *)kUTTypeImage]){
UIImage*theImage = nil;
// 判断,图片是否允许修改
if ([pickerallowsEditing]){
//获取用户编辑之后的图像
theImage = [info objectForKey:UIImagePickerControllerEditedImage];
} else {
// 照片的元数据参数
theImage = [info objectForKey:UIImagePickerControllerOriginalImage];
}
// 保存图片到相册中
SELselectorToCall = @selector(imageWasSavedSuccessfully:didFinishSavingWithError:contextInfo:);
UIImageWriteToSavedPhotosAlbum(theImage,self,selectorToCall,NULL);
}else if([mediaType isEqualToString:(NSString *)kUTTypeMovie]){
// 判断获取类型:视频
//获取视频文件的url
NSURL* mediaURL = [info objectForKey:UIImagePickerControllerMediaURL];
//创建ALAssetsLibrary对象并将视频保存到媒体库
// AssetsLibrary 框架包是提供了在应用程序中操作图片和视频的相关功能。相当于一个桥梁,链接了应用程序和多媒体文件。
ALAssetsLibrary *assetsLibrary =[[ALAssetsLibrary alloc] init];
// 将视频保存到相册中
[assetsLibrarywriteVideoAtPathToSavedPhotosAlbum:mediaURL
completionBlock:^(NSURL *assetURL, NSError *error) {
if (!error) {
NSLog(@"captured video saved with noerror.");
}else{
NSLog(@"erroroccured while saving the video:%@", error);
}
}];
[assetsLibrary release];
}
[picker dismissModalViewControllerAnimated:YES];
}
//当用户取消时,调用该方法
-(void)imagePickerControllerDidCancel:(UIImagePickerController*)picker{
[picker dismissModalViewControllerAnimated:YES];
}
五。UIImagePickerControllerMediaType 包含着KUTTypeImage 和KUTTypeMovie
KUTTypeImage 包含:
const CFStringRef kUTTypeImage ;//抽象的图片类型
const CFStringRef kUTTypeJPEG ;
const CFStringRef kUTTypeJPEG2000;
const CFStringRef kUTTypeTIFF;
const CFStringRef kUTTypePICT;
const CFStringRef kUTTypeGIF;
const CFStringRef kUTTypePNG;
const CFStringRef kUTTypeQuickTimeImage ;
const CFStringRef kUTTypeAppleICNS;
const CFStringRef kUTTypeBMP ;
const CFStringRef kUTTypeICO ;
const CFStringRef kUTTypeRawImage ;
const CFStringRef kUTTypeScalableVectorGraphics ;
const CFStringRef kUTTypeLivePhoto ;
KUTTypeMovie 包含:
const CFStringRef kUTTypeAudiovisualContent ;抽象的声音视频
const CFStringRef kUTTypeMovie ;抽象的媒体格式(声音和视频)
const CFStringRef kUTTypeVideo ;只有视频没有声音
const CFStringRef kUTTypeAudio ;只有声音没有视频
const CFStringRef kUTTypeQuickTimeMovie ;
const CFStringRef kUTTypeMPEG ;
const CFStringRef kUTTypeMPEG4 ;
const CFStringRef kUTTypeMP3 ;
const CFStringRef kUTTypeMPEG4Audio ;
const CFStringRef kUTTypeAppleProtectedMPEG4Audio;
四、从相册获取图片和视频数据
1.我们将功能封装在一个按钮的点击事件中
#pragma mark - 相册操作
-(void)ClickShowPhotoAction:(id)sender{
if([self isPhotoLibraryAvailable]){
UIImagePickerController *controller =[[UIImagePickerController alloc]init];
[controller setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];//设置类型
NSMutableArray *mediaTypes = [[NSMutableArray alloc] init];
if ([selfcanUserPickPhotosFromPhotoLibrary]){
[mediaTypes addObject:(NSString *)kUTTypeImage];
}
if ([selfcanUserPickVideosFromPhotoLibrary]){
[mediaTypes addObject:(NSString *)kUTTypeMovie];
}
[controller setMediaTypes:mediaTypes];
[controller setDelegate:self];// 设置代理
[self.navigationControllerpresentModalViewController:controller animated:YES];
[controller release];
[mediaTypes release];
}
}
2.关于UIImagePickerControllerDelegate协议,我们可以重用。
最后,需要说的是,
UIImagePickerControllerDelegate
协议中
-(void)imagePickerController:(UIImagePickerController *)pickerdidFinishPickingMediaWithInfo:(NSDictionary*)info方法,中的info值,会根据我们操作的类型不同,而产生了不同的数据信息: