美文网首页iOS开发超神学院
iOS[系统功能篇]之调用相机(上)

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

作者: 一只小蝉儿 | 来源:发表于2016-05-27 13:40 被阅读8190次

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


    一、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];
        }
    }
    

    相关文章

      网友评论

        本文标题:iOS[系统功能篇]之调用相机(上)

        本文链接:https://www.haomeiwen.com/subject/hddtdttx.html