IOS开发调用系统相机和打开闪光灯
 
     今天给大家分享一下如何调用iphone的拍照功能和打开闪光灯,有些代码我也不太理解,很多是在网上借鉴其他人的。IOS有两种的拍照和视频的方式:1.直接使用UIImagePickerController,这个类提供了一个简单便捷的拍照与选择图片库里图片的功能。2.另一种是通过AVFoundation.framework框架完全自定义拍照的界面和选择图片库界面。我只做了第一种,就先给大家介绍第一种做法:
一、首先调用接口前,我们需要先判断当前设备是否支持UIImagePickerController,用isSourceTypeAvailable:来判断是否可用
二、查看符合的媒体类型,这个时候我们调用availableMediaTypeForSou rceType:判断
在调用UIImagePickerController时我们需要加入他的两个代理方法:
UINavigationControllerDe legate和UIImagePickerControllerD elegate,在调用摄像头的时候还可以调闪光灯,一会代码里有。
要调用闪光灯需要先建一个AVCaptureSession类的实例对象:

// 

//  
 Created by Mason on 13-1-23. 

//  
 Copyright (c) 2013年 Mason. All rights reserved. 

// 

  

#import 

//调用闪光灯调用框架 

#import 

  

@interface CameraViewController : UIViewController 

{ 

  
  
  
 AVCaptureSession * _AVSession;//调用闪光灯的时候创建的类 

} 

  

@property(nonatomic,retain)AVCaptureSession * AVSession; 

  

@end 

在.m的- (void)viewDidLoad里建立4Button,Camera调用相机、Library调用图片库、flashlight打开闪光灯、close关闭闪光灯 

//打开相机 

-(void)addCarema 

{ 

  
  
  
 //判断是否可以打开相机,模拟器此功能无法使用 

  
  
  
 if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerS 
ourceTypeCamera]) { 

  
  
  
  
  
  
  
   

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

  
  
  
  
  
  
  
 picker.delegate = self; 

  
  
  
  
  
  
  
 picker.allowsEditing = YES;  
 //是否可编辑 

  
  
  
  
  
  
  
 //摄像头 

  
  
  
  
  
  
  
 picker.sourceType = UIImagePickerControllerS 
ourceTypeCamera; 

  
  
  
  
  
  
  
 [self presentModalViewControll 
er:picker animated:YES]; 

  
  
  
  
  
  
  
 [picker release]; 

  
  
  
 }else{ 

  
  
  
  
  
  
  
 //如果没有提示用户 

  
  
  
  
  
  
  
 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"你没有摄像头" delegate:nil cancelButtonTitle:@"Drat!" otherButtonTitles:nil]; 

  
  
  
  
  
  
  
 [alert show]; 

  
  
  
 } 

} 

打开相机后,然后需要调用UIImagePickerControllerD 
elegate里的方法,拍摄完成后执行的方法和点击Cancel之后执行的方法: 

//拍摄完成后要执行的方法 

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWit 
hInfo:(NSDictionary *)info 

{ 

  
  
  
 //得到图片 

  
  
  
 UIImage * image = [info objectForKey:UIImagePickerControllerO 
riginalImage]; 

  
  
  
 //图片存入相册 

  
  
  
 UIImageWriteToSavedPhoto 
sAlbum(image, nil, nil, nil); 

  
  
  
 [self dismissModalViewControll 
erAnimated:YES]; 

  
  
  
   

} 

//点击Cancel按钮后执行方法 

-(void)imagePickerControllerDid 
Cancel:(UIImagePickerController *)picker 

{ 

  
  
  
 [self dismissModalViewControll 
erAnimated:YES]; 

} 

调用相机照片和保存到图片库已经完成。 

接着介绍打开照片库: 

-(void)openPicLibrary 

{ 

  
  
  
 //相册是可以用模拟器打开的 

  
  
  
 if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerS 
ourceTypePhotoLibrary]) { 

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

  
  
  
  
  
  
  
 picker.delegate = self; 

  
  
  
  
  
  
  
 picker.allowsEditing = YES;//是否可以编辑 

  

  
  
  
  
  
  
  
 //打开相册选择照片 

  
  
  
  
  
  
  
 picker.sourceType = UIImagePickerControllerS 
ourceTypePhotoLibrary; 

  
  
  
  
  
  
  
 [self presentModalViewControll 
er:picker  
 animated:YES]; 

  
  
  
  
  
  
  
 [picker release]; 

  
  
  
 }else{ 

  
  
  
  
  
  
  
 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"你没有摄像头" delegate:nil cancelButtonTitle:@"Drat!" otherButtonTitles:nil]; 

  
  
  
  
  
  
  
 [alert show]; 

  
  
  
 } 

  
  
  
   

} 

  

//选中图片进入的代理方法 

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo 

{ 

  
  
  
 [self dismissModalViewControll 
erAnimated:YES]; 

} 

调用闪光灯的代码,由于我也不是很理解,所以没法加注释,但是已经亲测可用,但是调闪光灯时有一个算是bug吧,闪光灯会闲一下,然后再一直亮 

-(void)openFlashlight 

{ 

  
  
  
 AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaTy 
pe:AVMediaTypeVideo]; 

  
  
  
 if (device.torchMode == AVCaptureTorchModeOff) { 

  
  
  
  
  
  
  
 //Create an AV session 

  
  
  
  
  
  
  
 AVCaptureSession * session = [[AVCaptureSession alloc]init]; 

  
  
  
  
  
  
  
   

  
  
  
  
  
  
  
 // Create device input and add to current session 

  
  
  
  
  
  
  
 AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil]; 

  
  
  
  
  
  
  
 [session addInput:input]; 

  
  
  
  
  
  
  
   

  
  
  
  
  
  
  
 // Create video output and add to current session 

  
  
  
  
  
  
  
 AVCaptureVideoDataOutput 
 * output = [[AVCaptureVideoDataOutput 
 alloc]init]; 

  
  
  
  
  
  
  
 [session addOutput:output]; 

  
  
  
  
  
  
  
   

  
  
  
  
  
  
  
 // Start session configuration 

  
  
  
  
  
  
  
 [session beginConfiguration]; 

  
  
  
  
  
  
  
 [device lockForConfiguration:nil]; 

  
  
  
  
  
  
  
   

  
  
  
  
  
  
  
 // Set torch to on 

  
  
  
  
  
  
  
 [device setTorchMode:AVCaptureTorchModeOn]; 

  
  
  
  
  
  
  
   

  
  
  
  
  
  
  
 [device unlockForConfiguration]; 

  
  
  
  
  
  
  
 [session commitConfiguration]; 

  
  
  
  
  
  
  
   

  
  
  
  
  
  
  
 // Start the session 

  
  
  
  
  
  
  
 [session startRunning]; 

  
  
  
  
  
  
  
   

  
  
  
  
  
  
  
 // Keep the session around 

  
  
  
  
  
  
  
 [self setAVSession:self.AVSession]; 

  
  
  
  
  
  
  
   

  
  
  
  
  
  
  
 [output release]; 

  
  
  
 } 

} 

  

-(void)closeFlashlight 

{ 

  
  
  
 [self.AVSession stopRunning]; 

  
  
  
 [self.AVSession release]; 

}