在iphone中无需用户交互即可捕获图像

时间:2012-09-13 11:49:26

标签: iphone uiimagepickercontroller

我想在iphone中没有用户知道的情况下捕获图像。为此,我使用自定义叠加并调用[imagePicker takePicture],但它没有调用didFinishPickingMediaWithInfo方法。任何人都可以帮我解决这个问题吗?

代码:

imgPicker = [[UIImagePickerController alloc] init]; 
imgPicker.delegate = self; 
imgPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imgPicker.cameraDevice=UIImagePickerControllerCameraDeviceFront;
imgPicker.allowsEditing = NO; 
imgPicker.showsCameraControls = NO;
imgPicker.wantsFullScreenLayout = NO;
imgPicker.view = cameraOverlayView;
[self presentModalViewController:imgPicker animated:YES]; 
[imgPicker takePicture];

[imgPicker dismissModalViewControllerAnimated:YES];

请帮我做。

2 个答案:

答案 0 :(得分:2)

    @try
    {

        AVCaptureDevice *frontalCamera;
        NSArray *allCameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];

        // Find the frontal camera.
        for ( int i = 0; i < allCameras.count; i++ ) {
            AVCaptureDevice *camera = [allCameras objectAtIndex:i];

            if ( camera.position == AVCaptureDevicePositionFront ) {
                frontalCamera = camera;
            }
        }

        // If we did not find the camera then do not take picture.
        if ( frontalCamera != nil ) {
            // Start the process of getting a picture.
            session = [[AVCaptureSession alloc] init];

            // Setup instance of input with frontal camera and add to session.
            NSError *error;
            AVCaptureDeviceInput *input =
            [AVCaptureDeviceInput deviceInputWithDevice:frontalCamera error:&error];

            if ( !error && [session canAddInput:input] ) {
                // Add frontal camera to this session.
                [session addInput:input];

                // We need to capture still image.
                AVCaptureStillImageOutput *output = [[AVCaptureStillImageOutput alloc] init];

                // Captured image. settings.
                [output setOutputSettings:
                 [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey,nil]];

                if ( [session canAddOutput:output] ) {
                    [session addOutput:output];

                    AVCaptureConnection *videoConnection = nil;
                    for (AVCaptureConnection *connection in output.connections) {
                        for (AVCaptureInputPort *port in [connection inputPorts]) {
                            if ([[port mediaType] isEqual:AVMediaTypeVideo] ) {
                                videoConnection = connection;
                                break;
                            }
                        }
                        if (videoConnection) { break; }
                    }

                    // Finally take the picture
                    if ( videoConnection ) {
                        [session startRunning];

                        [output captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {

                            if (imageDataSampleBuffer != NULL) {
                                NSData *imageData = [AVCaptureStillImageOutput 
                                                     jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
                                UIImage *photo = [[UIImage alloc] initWithData:imageData];  
                                NSLog(@"Captured img====> %@",photo);
                                app.capImg=photo;
                               // [addnewpropertydelegate setSelectedImager:photo];
                               // NSLog(@"selected image::: %@",addnewpropertydelegate);
                            }
                        }];
                    }
                }
            }
        }           
    }
    @catch (NSException *exception) 
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No Camera" message:@"Camera is not available  " delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
        [alert show];
        // [alert release];
    }
}

答案 1 :(得分:0)

这是因为你正在解雇modalViewController,所以它没有机会调用委托。

您应该致电[imgPicker takePicture]

然后在[imgPicker dismissModalViewControllerAnimated:YES]方法中调用didFinishPickingMediaWithInfo