iphone開發打開系統相機的閃光燈

jopen 9年前發布 | 963 次閱讀 Objective-C iPhone

IOS有兩種的拍照和視頻的方式:1.直接使用UIImagePickerController,這個類提供了一個簡單便捷的拍照與選擇圖片庫里圖 片的功能。2.另一種是通過AVFoundation.framework框架完全自定義拍照的界面和選擇圖片庫界面。我只做了第一種,就先給大家介紹第 一種做法:

一、首先調用接口前,我們需要先判斷當前設備是否支持UIImagePickerController,用isSourceTypeAvailable:來判斷是否可用

二、查看符合的媒體類型,這個時候我們調用availableMediaTypeForSourceType:判斷

在調用UIImagePickerController時我們需要加入他的兩個代理方法:

UINavigationControllerDelegate和UIImagePickerControllerDelegate,在調用攝像頭的時候還可以調閃光燈,一會代碼里有。

要調用閃光燈需要先建一個AVCaptureSession類的實例對象:

//
//  Created by 張茫原 on 13-1-23.
//  Copyright (c) 2013年 張茫原. All rights reserved.
//

import <UIKit/UIKit.h>

//調用閃光燈調用框架

import <AVFoundation/AVFoundation.h>

@interface CameraViewController : UIViewController<UINavigationControllerDelegate, UIImagePickerControllerDelegate> { AVCaptureSession * _AVSession;//調用閃光燈的時候創建的類 }

@property(nonatomic,retain)AVCaptureSession * AVSession;

@end</pre>
在.m的- (void)viewDidLoad里建立4Button,Camera調用相機、Library調用圖片庫、flashlight打開閃光燈、close關閉閃光燈,這里創建Button的代碼我就不再寫了。

//打開相機
-(void)addCarema
{
    //判斷是否可以打開相機,模擬器此功能無法使用
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

    UIImagePickerController * picker = [[UIImagePickerController alloc]init];
    picker.delegate = self;
    picker.allowsEditing = YES;  //是否可編輯
    //攝像頭
    picker.sourceType = UIImagePickerControllerSourceTypeCamera;
    [self presentModalViewController:picker animated:YES];
    [picker release];
}else{
    //如果沒有提示用戶
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"你沒有攝像頭" delegate:nil cancelButtonTitle:@"Drat!" otherButtonTitles:nil];
    [alert show];
}

} </pre>
打開相機后,然后需要調用UIImagePickerControllerDelegate里的方法,拍攝完成后執行的方法和點擊Cancel之后執行的方法:

//拍攝完成后要執行的方法
-(void)imagePickerController:(UIImagePickerController )picker didFinishPickingMediaWithInfo:(NSDictionary )info
{
    //得到圖片
    UIImage * image = [info objectForKey:UIImagePickerControllerOriginalImage];
    //圖片存入相冊
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    [self dismissModalViewControllerAnimated:YES];

}

//點擊Cancel按鈕后執行方法 -(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { [self dismissModalViewControllerAnimated:YES]; } </pre>

調用相機照片和保存到圖片庫已經完成。

接著介紹打開照片庫:

-(void)openPicLibrary
{
    //相冊是可以用模擬器打開的
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
        UIImagePickerController * picker = [[UIImagePickerController alloc]init];
        picker.delegate = self;
        picker.allowsEditing = YES;//是否可以編輯

    //打開相冊選擇照片
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    [self presentModalViewController: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 dismissModalViewControllerAnimated:YES]; }</pre>
調用閃光燈的代碼,由于我也不是很理解,所以沒法加注釋,但是已經親測可用,但是調閃光燈時有一個算是bug吧,閃光燈會閑一下,然后再一直亮

-(void)openFlashlight
{
    AVCaptureDevice  device = [AVCaptureDevice defaultDeviceWithMediaType: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]; } </pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!