UCC 다바다를 찾아오신 분은 '여기'로 가주세요..



앱 스토어에 Flashlight 앱이 많이 있지요..

그런 프로그램들의 주요 기능!

아이폰 카메라 플래시 제어하는 부분을 살펴보겠습니다.


우선 가장 먼저 Framework을 추가해줘야 합니다.

프로젝트 Target 창을 여신 후 Build PhasesLink Binary With Libraries 항목의 + 를 눌러서
AVFoundation.framework을 프로젝트에 추가해줍니다.

Framework를 추가한 후 아래와 같이 변수를 추가해줍니다.
 

@interface TorchViewController : UIViewController

{

    AVCaptureSession* m_torchSession;

    AVCaptureDevice *device;

}


@property (nonatomic, retain) AVCaptureSession* m_torchSession;

@property (nonatomic, retain) AVCaptureDevice *device;


.m 파일에도 synthesize를 해주고..

@implementation TorchViewController


@synthesize m_torchSession;

@synthesize device;



view가 Load 된 후에 카메라가 달려있는지 체크를 한 다음 capture device를 생성해줍니다.

- (void)viewDidLoad

{

    [super viewDidLoad];

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerCameraDeviceFront] == YES)

    {

        self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

        

        if ([device hasTorch] && [device hasFlash])

        {

            if (device.torchMode == AVCaptureTorchModeOff)

            {

                NSLog(@"It's currently off.. turning on now.");

                

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

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

                

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

                

                [session beginConfiguration];

                [device lockForConfiguration:nil];

                

                [device setTorchMode:AVCaptureTorchModeOn];

                [device setFlashMode:AVCaptureFlashModeOn];

                

                [session addInput:flashInput];

                [session addOutput:output];

                

                [device unlockForConfiguration];

                

                [output release];

                

                [session commitConfiguration];

                [session startRunning];

                

                self.m_torchSession = session;

                [session release];

            }

            else

            {

                NSLog(@"It's currently on.. turning off now.");

                

                self.m_torchSession = nil;

                [device lockForConfiguration:nil];

                

                device.torchMode = AVCaptureTorchModeOff;

                device.flashMode = AVCaptureFlashModeOff;

                [device unlockForConfiguration];

            }

        }

        else

        {

            UIAlertView* NoFlash = [[UIAlertView alloc] initWithTitle:@"Uh-Oh"

                                                              message:@"Your device doesn't have a flash camera"

                                                             delegate:nil

                                                    cancelButtonTitle:@"OK"

                                                    otherButtonTitles:nil];

            [NoFlash show];

            [NoFlash release];

        }

    }

}


화면에 라이트 켜기 버튼 등을 눌렀을 때 생성하지 않고 view가 load 됐을 때 생성하는 이유는 속도 때문입니다.
약 0.3~0.5초 정도 시간이 소요되더군요.
그래서 끄기/켜기에만 필요한 AVCaptureDevice와 AVCaptureSession 객체를 멤버로 가지고 있습니다.


그 후 버튼을 눌렀을 때 카메라 상태에 따라서 껐다/켰다를 해줍니다..

- (IBAction) OnButtonPower

{

    if ([device hasTorch] && [device hasFlash])

    {

        if (device.torchMode == AVCaptureTorchModeOff)

        {

            NSLog(@"It's currently off.. turning on now.");

            // 플래시 상태에 따라 버튼 이미지를 바꿔줌.

            [m_btnPower setImage:[UIImage imageNamed:@"power_button_on.jpeg"] forState:UIControlStateNormal];

            AVCaptureSession *session = m_torchSession;

            

            [session beginConfiguration];

            [device lockForConfiguration:nil];

            

            [device setTorchMode:AVCaptureTorchModeOn];

            [device setFlashMode:AVCaptureFlashModeOn];

            

            [device unlockForConfiguration];


            [session commitConfiguration];

            [session startRunning];

        }

        else

        {

            NSLog(@"It's currently on.. turning off now.");

             
// 플래시 상태에 따라 버튼 이미지를 바꿔줌.

            [m_btnPower setImage:[UIImage imageNamed:@"power_button_off.jpeg"] forState:UIControlStateNormal];


            [device lockForConfiguration:nil];

            

            device.torchMode = AVCaptureTorchModeOff;

            device.flashMode = AVCaptureFlashModeOff;

            [device unlockForConfiguration];

        }

    }

}






※ 퍼가실땐 출처를 밝혀주세요. (http://shkam.tistory.com/)


Posted by 고독한 프로그래머

댓글을 달아 주세요




UCC 다바다를 찾아오신 분은 '여기'로 가주세요..

프로그램을 만들다 보면 함수를 일정 시간 이후에 호출해줘야 할 때가 있습니다.

보통 1회성 타이머를 이용해서 구현하는데 Objective-C에서는 기본적으로 제공하는 기능이 있습니다.


performSelector:withObject:afterDelay:  

이 메소드는는 Selector에 해당하는 메소드를 일정시간 이후에 호출해줍니다. (Objective-C에서는 '함수 호출'을 '메시지를 보낸다'고 표현하더군요)

SEL sMethod = @selector(TestMethod);

if
([self respondsToSelector:sMethod] == YES) 

[self performSelector:sMethod withObject:nil afterDelay:0.1];


respondsToSelector는 Selector가 구현되어 있는 녀셕인가를 체크해서 YES, NO로 리턴해주는 메소드입니다.

performSelector의 1번째 인자는 selector를 넘겨주고, 2번째 인자는 selector의 1번째 인자를 넘겨줍니다. (없는 경우 nil)
그 다음 afterDelay에 실수형으로 초 단위 값을 넘겨줍니다.  

이런식으로 메소드를 호출하는 경우 현재 스레드와 동일한 스레드 내에서 실행이 됩니다.

이렇게 일정시간 이후 실행되는 메소드의 호출을 취소하고 싶은 경우엔 cancelPreviousPerformRequestsWithTarget 메소드를 호출해줍니다.
[NSRunLoop cancelPreviousPerformRequestsWithTarget:self]; 

이렇게 하면 가장 마지막에 던진 메소드가 취소됩니다.
이렇게 하지 않고 특정 메소드를 취소시키려면 Selector를 지정해주면 됩니다. 

[NSRunLoop cancelPreviousPerformRequestsWithTarget:self selector:sMethod object:nil]; 


※ 퍼가실땐 출처를 밝혀주세요. (http://shkam.tistory.com/)

 


Posted by 고독한 프로그래머

댓글을 달아 주세요