该类继承自UINavigationController类

步骤:
检查媒体来源模式是否可用
检查该来源模式下所支持的媒体类型
创建图像选取控制器,设置其属性并显示
在委托协议方法中处理
 
1.检查媒体来源
调用UIImagePickerController类的静态方法isSourceTypeAvailable来检查
sourceType是一个UIImagePickerControllerSourceType类型的枚举值,它表示图像选取控制器的3种不同的媒体来源模式
UIImagePickerControllerSourceTypePhotoLibrary:照片库模式。图像选取控制器以该模式显示时会浏览系统照片库的根目录。
UIImagePickerControllerSourceTypeCamera:相机模式,图像选取控制器以该模式显示时可以进行拍照或摄像。
UIImagePickerControllerSourceTypeSavedPhotosAlbum:相机胶卷模式,图像选取控制器以该模式显示时会浏览相机胶卷目录。
如果设备支持指定的媒体来源模式,则isSourceTypeAvailable:方法返回YES,否则返回NO。
2.检查支持的媒体类型
调用UIImagePickerController类的另一个静态方法 availableMediaTypesForSourceType:
返回的是字符串数组,kUTTypeImage表示静态图片,kUTTypeMovie表示视频。这两个字符串常量定义在MobileCoreServices框架中。
 
参数info是一个字典,包含媒体类型,拍照的原始图片,编辑后的图片,或是摄像的视频文件的URL等。

//

//  ViewController.h

//  Camera

//

//  Created by gao wuhang on 12-11-23.

//  Copyright (c) 2012年 gao wuhang. All rights reserved.

//

#import

@interface ViewController : UIViewController<</span>UINavigationControllerDelegate,UIImagePickerControllerDelegate>

- (IBAction)takePictureButtonClick:(id)sender;

- (IBAction)captureVideoButtonClick:(id)sender;

@end

//

//  ViewController.m

//  Camera

//

//  Created by gao wuhang on 12-11-23.

//  Copyright (c) 2012年 gao wuhang. All rights reserved.

//

#import "ViewController.h"

#import

#import

@interface ViewController ()

@end

@implementation ViewController

- (IBAction)takePictureButtonClick:(id)sender{

//检查相机模式是否可用

if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

NSLog(@"sorry, no camera or camera is unavailable.");

return;

}

//获得相机模式下支持的媒体类型

NSArray* availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

BOOL canTakePicture = NO;

for (NSString* mediaType in availableMediaTypes) {

if ([mediaType isEqualToString:(NSString*)kUTTypeImage]) {

//支持拍照

canTakePicture = YES;

break;

}

}

//检查是否支持拍照

if (!canTakePicture) {

NSLog(@"sorry, taking picture is not supported.");

return;

}

//创建图像选取控制器

UIImagePickerController* imagePickerController = [[UIImagePickerController alloc] init];

//设置图像选取控制器的来源模式为相机模式

imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;

//设置图像选取控制器的类型为静态图像

imagePickerController.mediaTypes = [[[NSArray alloc] initWithObjects:(NSString*)kUTTypeImage, nil] autorelease];

//允许用户进行编辑

imagePickerController.allowsEditing = YES;

//设置委托对象

imagePickerController.delegate = self;

//以模视图控制器的形式显示

[self presentModalViewController:imagePickerController animated:YES];

[imagePickerController release];

}

- (IBAction)captureVideoButtonClick:(id)sender{

//检查相机模式是否可用

if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

NSLog(@"sorry, no camera or camera is unavailable!!!");

return;

}

//获得相机模式下支持的媒体类型

NSArray* availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

BOOL canTakeVideo = NO;

for (NSString* mediaType in availableMediaTypes) {

if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {

//支持摄像

canTakeVideo = YES;

break;

}

}

//检查是否支持摄像

if (!canTakeVideo) {

NSLog(@"sorry, capturing video is not supported.!!!");

return;

}

//创建图像选取控制器

UIImagePickerController* imagePickerController = [[UIImagePickerController alloc] init];

//设置图像选取控制器的来源模式为相机模式

imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;

//设置图像选取控制器的类型为动态图像

imagePickerController.mediaTypes = [[[NSArray alloc] initWithObjects:(NSString*)kUTTypeMovie, nil] autorelease];

//设置摄像图像品质

imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;

//设置最长摄像时间

imagePickerController.videoMaximumDuration = 30;

//允许用户进行编辑

imagePickerController.allowsEditing = YES;

//设置委托对象

imagePickerController.delegate = self;

//以模式视图控制器的形式显示

[self presentModalViewController:imagePickerController animated:YES];

[imagePickerController release];

}

- (void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo{

if (!error) {

NSLog(@"picture saved with no error.");

}

else

{

NSLog(@"error occured while saving the picture%@", error);

}

}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{

//打印出字典中的内容

NSLog(@"get the media info: %@", info);

//获取媒体类型

NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];

//判断是静态图像还是视频

if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {

//获取用户编辑之后的图像

UIImage* editedImage = [info objectForKey:UIImagePickerControllerEditedImage];

//将该图像保存到媒体库中

UIImageWriteToSavedPhotosAlbum(editedImage, self,@selector(image:didFinishSavingWithError:contextInfo:), NULL);

}else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie])

{

//获取视频文件的url

NSURL* mediaURL = [infoobjectForKey:UIImagePickerControllerMediaURL];

//创建ALAssetsLibrary对象并将视频保存到媒体库

ALAssetsLibrary* assetsLibrary = [[ALAssetsLibrary alloc]init];

[assetsLibrary writeVideoAtPathToSavedPhotosAlbum:mediaURLcompletionBlock:^(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];

}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{

[picker dismissModalViewControllerAnimated:YES];

}

- (void)viewDidLoad

{

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

}

- (void)viewDidUnload

{

[super viewDidUnload];

// Release any retained subviews of the main view.

}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{

return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

}

@end

 
参考:http://blog.csdn.net/pucker

UIImagePickerController拍照与摄像的更多相关文章

  1. UIImagePickerController拍照与摄像(转)

    转载自:http://blog.sina.com.cn/s/blog_68edaff101019ppe.html (2012-11-23 14:38:40) 标签: ios iphone 拍照 摄像 ...

  2. android之拍照与摄像

    拍照和摄像的意图很简答,这里直接贴代码 布局文件 <?xml version="1.0" encoding="utf-8"?> <Linear ...

  3. 自定义使用AVCaptureSession 拍照,摄像,载图

    转载自 http://blog.csdn.net/andy_jiangbin/article/details/19823333 拍照,摄像,载图总结 1 建立Session  2 添加 input  ...

  4. Android--调用系统照相机拍照与摄像

    前言 在很多场景中,都需要用到摄像头去拍摄照片或视频,在照片或视频的基础之上进行处理.但是Android系统源码是开源的,很多设备厂商均可使用,并且定制比较混乱.一般而言,在需要用到摄像头拍照或摄像的 ...

  5. Android拍照、摄像方向旋转的问题 代码具体解释

    近期做了个拍照.摄像的应用.遇到了拍照.摄像的图像相对于现实.翻转了90度.原因:相机这个硬件的角度是横屏的角度,所以会出现都是横屏的. 1.照相.摄影预览图像的正确角度显 示: public sta ...

  6. AVCaptureSession拍照,摄像,载图总结

    AVCaptureSession [IOS开发]拍照,摄像,载图总结 1 建立Session  2 添加 input  3 添加output  4 开始捕捉 5 为用户显示当前录制状态 6 捕捉 7 ...

  7. swift2.0 UIImagePickerController 拍照 相册 录像

    系统 ios9.1 语言swift2.0 在app 里最常用的功能就是多媒体选择,首先我们storyboard 创建一个button 用于触发选择事件 @IBAction func selectIma ...

  8. UIImagePickerController拍照/相册/录像/本地视频

    1.导入系统库 #import <MobileCoreServices/MobileCoreServices.h> 2.遵守协议 <UIImagePickerControllerDe ...

  9. Android初级教程调用手机拍照与摄像功能

    这个小案例建议在手机上运行. package com.example.camera; import java.io.File; import android.net.Uri; import andro ...

随机推荐

  1. boost库在windows下的编译和使用

    因为跨平台的原因,现在要使用到boost库,boost库非常大,现在处于摸索阶段. 首先来说boost库在window下的安装和使用. 一.下载 首先从boost官方主页http://www.boos ...

  2. [Err]1267 - Illegal mix of collations(utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation ‘=’

    SELECT * FROM table_a a  where a.id NOT IN (SELECT b.id FROM table_b  b); 先将两个数据表的编码统一,如果table_a的编码为 ...

  3. A9系统时钟用外部

     问个笨蛋的问题,,电脑主板的主频是由外部时钟倍频得来,还是内部时钟倍频?? [ARM11]瘋子 2015/5/5 19:08:16 @蓝凌风 [x86]蓝凌 2015/5/5 19:08:25 外部 ...

  4. [原]Unity3D深入浅出 - 认识开发环境中的Component(组件)菜单

    Component(组件)是用来添加到GameObject对象上的一组相关属性,本质上每个组件都是一个类的实例,比如在Cube上添加一个Mesh网格,即面向对象的思维方式可以理解成Cube对象里包含了 ...

  5. Java传参那些事!

    刚刚学习java传参的时候很纠结,也非常的不理解!课本上的“按值传递”和“按址传递”搞的自己是一头雾水,后来写的项目多了,自然就明白了! 现在写传参几乎就是条件反射一般——“秒成”,分享当初自己为此写 ...

  6. 【转】Bluetooth数据包捕获

    原文网址:http://www.cnblogs.com/hzl6255/p/3887013.html 这里介绍一种在Android上捕获蓝牙数据包的方法 1. 前提 首先你要有一部Android手机  ...

  7. NopCommerce架构分析之六------自定义RazorViewEngine

    系统中对Razor的支持包括两部分,其中之一就是自定义RazorViewEngine 一.自定义RazorViewEngine 在Global.asax.cs的Application_Start方法中 ...

  8. MySQL 视图知识点小结

    视图本身是一个虚拟表,不存放任何数据.在使用SQL语句访问视图的时候,它返回的数据是MySQL从其他表中生成的.视图和表在同一个命名空间, MySQL在很多地方对于视图和表是同样对待的.不过视图和表也 ...

  9. Android调试工具及方法

    转自:http://www.cnblogs.com/feisky/archive/2010/01/01/1637566.html Logcat Dump一份系统消息的日志.这些消息包括模拟器抛出错误时 ...

  10. HDU 5288 OO’s Sequence

    题意:给一个序列,函数f(l, r)表示在[l, r]区间内有多少数字不是其他数字的倍数,求所有区间的f(l, r)之和. 解法:第一次打多校……心里还有点小激动……然而一道签到题做了俩点……呜呜呜… ...