iOS[系统功能篇]之调用相机

来源:互联网 发布:裴健 数据挖掘 编辑:程序博客网 时间:2024/06/05 18:11

很多应用中我门需要用到iOS设备的摄像头进行拍照,视频等,并且从相册中选取我们需要的图片或者视频。这时就可以使用UIImagePickerController类来完成控制。http://www.jianshu.com/p/097ed620cc38


一、UIImagePickerController类

UIImagePickerController 这个类可以为大家提供照相的功能,以及图片,视频浏览的功能。

二、检查硬件是否安装有摄像头或者允许操作相册

1、 判断摄像头是否可用

(1) 判断设备是否有摄像头

- (BOOL) isCameraAvailable{    return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];}

(2) 前面的摄像头是否可用

- (BOOL) isFrontCameraAvailable{    return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];}

(3) 后面的摄像头是否可用

- (BOOL) isRearCameraAvailable{    return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];}
2、 判断支持的媒体类型
// 判断是否支持某种多媒体类型:拍照,视频,-(BOOL)cameraSupportsMedia:(NSString*)paramMediaType sourceType:(UIImagePickerControllerSourceType)paramSourceType{    __block BOOL result=NO;    if ([paramMediaType length]==0) {        NSLog(@"Media type is empty.");        return NO;    }    NSArray*availableMediaTypes=[UIImagePickerController availableMediaTypesForSourceType:paramSourceType];    [availableMediaTypes enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {        NSString *mediaType = (NSString *)obj;        if ([mediaType isEqualToString:paramMediaType]){            result = YES;            *stop= YES;        }    }];    return result;}

(1) 检查摄像头是否支持录像

- (BOOL) doesCameraSupportShootingVideos{    /*在此处注意我们要将MobileCoreServices 框架添加到项目中,     然后将其导入:#import <MobileCoreServices/MobileCoreServices.h> 。不然后出现错误使用未声明的标识符 'kUTTypeMovie'     */    return [self cameraSupportsMedia:( NSString *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypeCamera];}

(2)检查摄像头是否支持拍照

-(BOOL) doesCameraSupportTakingPhotos{    /*在此处注意我们要将MobileCoreServices 框架添加到项目中,     然后将其导入:#import <MobileCoreServices/MobileCoreServices.h> 。不然后出现错误使用未声明的标识符 'kUTTypeImage'     */    return [self cameraSupportsMedia:( NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypeCamera];}
3、相册文件选取相关

(1)相册是否可用

-(BOOL) isPhotoLibraryAvailable{    return [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary];}

(2) 是否可以在相册中选择视频

- (BOOL) canUserPickVideosFromPhotoLibrary{    return [self cameraSupportsMedia:( NSString *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypePhotoLibrary];}

(3)是否可以在相册中选择照片

- (BOOL) canUserPickPhotosFromPhotoLibrary{    return [self cameraSupportsMedia:( NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypePhotoLibrary];}

三、用摄像头进行拍照和录像功能

1、假设我门点击一个按钮调用摄像头进行拍照和录像功能

- (void)ClickControlAction:(id)sender{    // 判断有摄像头,并且支持拍照功能    if ([self isCameraAvailable] && [self doesCameraSupportTakingPhotos]){        // 初始化图片选择控制器        UIImagePickerController *controller = [[UIImagePickerController alloc] init];        /*设置媒体来源,即调用出来的UIImagePickerController所显示出来的界面,有一下三种来源         typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {             UIImagePickerControllerSourceTypePhotoLibrary,             UIImagePickerControllerSourceTypeCamera,          UIImagePickerControllerSourceTypeSavedPhotosAlbum         };分别表示:图片列表,摄像头,相机相册*/        [controller setSourceType:UIImagePickerControllerSourceTypeCamera];        // 设置所支持的媒体功能,即只能拍照,或则只能录像,或者两者都可以        NSString *requiredMediaType = ( NSString *)kUTTypeImage;        NSString *requiredMediaType1 = ( NSString *)kUTTypeMovie;        NSArray *arrMediaTypes=[NSArray arrayWithObjects:requiredMediaType, requiredMediaType1,nil];        [controller setMediaTypes:arrMediaTypes];        // 设置录制视频的质量        [controller setVideoQuality:UIImagePickerControllerQualityTypeHigh];        //设置最长摄像时间        [controller setVideoMaximumDuration:10.f];        // 设置是否可以管理已经存在的图片或者视频        [controller setAllowsEditing:YES];        // 设置代理        [controller setDelegate:self];        [self presentViewController:controller animated:YES completion:nil];    }else {        NSLog(@"Camera is not available.");    }}

2、保存成功之后,调用相关代理方法

// 保存图片后到相册后,调用的相关方法,查看是否保存成功- (void) imageWasSavedSuccessfully:(UIImage *)paramImage didFinishSavingWithError:(NSError *)paramError contextInfo:(void *)paramContextInfo{    if (paramError == nil){        NSLog(@"Image was saved successfully.");    } else {        NSLog(@"An error happened while saving the image.");        NSLog(@"Error = %@", paramError);    }}// 当得到照片或者视频后,调用该方法-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{    NSLog(@"Picker returned successfully.");    NSLog(@"%@", info);    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];    // 判断获取类型:图片    if ([mediaType isEqualToString:( NSString *)kUTTypeImage]){        UIImage *theImage = nil;        // 判断,图片是否允许修改        if ([picker allowsEditing]){            //获取用户编辑之后的图像            theImage = [info objectForKey:UIImagePickerControllerEditedImage];        } else {            // 照片的原数据            theImage = [info objectForKey:UIImagePickerControllerOriginalImage];        }        // 保存图片到相册中        SEL selectorToCall = @selector(imageWasSavedSuccessfully:didFinishSavingWithError:contextInfo:);        UIImageWriteToSavedPhotosAlbum(theImage, self,selectorToCall, NULL);    }else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]){        // 判断获取类型:视频        //获取视频文件的url        NSURL* mediaURL = [info objectForKey:UIImagePickerControllerMediaURL];        //创建ALAssetsLibrary对象并将视频保存到媒体库        // Assets Library 框架包是提供了在应用程序中操作图片和视频的相关功能。相当于一个桥梁,链接了应用程序和多媒体文件。        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:%@", error);                                              }                                          }];    }    [picker  dismissViewControllerAnimated:YES completion:nil];}// 当用户取消时,调用该方法- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{    [picker  dismissViewControllerAnimated:YES completion:nil];}

四、从相册获取图片和视频数据

- (void)ClickShowPhotoAction:(id)sender{    if ([self isPhotoLibraryAvailable]){        UIImagePickerController *controller = [[UIImagePickerController alloc] init];        [controller setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];// 设置类型        NSMutableArray *mediaTypes = [[NSMutableArray alloc] init];        if ([self canUserPickPhotosFromPhotoLibrary]){            [mediaTypes addObject:( NSString *)kUTTypeImage];        }        if ([self canUserPickVideosFromPhotoLibrary]){            [mediaTypes addObject:( NSString *)kUTTypeMovie];        }        [controller setMediaTypes:mediaTypes];        [controller setDelegate:self];// 设置代理        [self.navigationController presentViewController:controller animated:YES completion:nil];    }}
0 0
原创粉丝点击