Camera

相机这个功能在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: %@", 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)

    {

        // UIImagePickerControllerSourceTypePhotoLibraryUIImagePickerControllerSourceTypeCameraUIImagePickerControllerSourceTypeSavedPhotosAlbum

        

        //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];

}

原文地址:https://www.cnblogs.com/Camier-myNiuer/p/3420284.html