ios - 如何拍摄照片然后将 iOS 应用程序最小化?

标签 ios objective-c cocoa-touch avfoundation avcapturesession

如何在 iOS 应用程序最小化时从相机拍照?
(即在 applicationDidEnterBackground:/applicationWillResignActive: 之后)

AppDelegate.m: ( thank you link )

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    //To make the code block asynchronous
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        //### background task starts
        NSLog(@"Running in the background\n");
        while(TRUE)
        {
            printf("Called"); //////Work fine

            [self.window.rootViewController captureNow]; /////Capture picture!

            [NSThread sleepForTimeInterval: 10.0]; //wait for 10 sec
        }
    });

    return YES;
}

OurViewController.m: ( thank you link )

-(IBAction)captureNow {

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

    NSLog(@"about to request a capture from: %@", _stillImageOutput);
    [_stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error)
     {
         CFDictionaryRef exifAttachments = CMGetAttachment( imageSampleBuffer, kCGImagePropertyExifDictionary, NULL);

         if (error)
         {
             NSLog(@"ERROR = %@", error); ///// Error!
         }

         NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; ////SIGABRT, cause imageSampleBuffer is nil
         UIImage *image = [[UIImage alloc] initWithData:imageData];

         UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

         [image release];
     }];
}

此代码在应用程序处于事件状态时工作正常。但是当应用程序最小化时出现错误(SIGABRT)。

也许有其他图书馆可以负担得起吗?

最佳答案

出于隐私原因,当您的应用处于后台时,您不能使用相机。

为什么?

好吧,我很高兴你问这个。故事时间!


Bob 是一名在美国国家安全局工作的人,负责开发控制鲨鱼的 super secret 猴子。为什么?他不能说。

Bob 有一天在他的 iPhone 上下载了一个应用程序,名为 John's Secret Stealer。 Bob 不看应用标题。

由于 Bob 是一个非常健忘的人,有一天他在工作之外忘记将手机留在储物柜中。站在 super secret 的鲨鱼食谱旁,他摸到口袋里的手机,然后把它拿出来。它响了,因为他刚收到一条短信。

在那一刻,John's Secret Stealer 使用 Bob 手机的后置摄像头拍了一张照片,并将其发送到 John 的服务器,而 Bob 并不知道。

第二天,全世界都知道了控制鲨鱼的 secret 项目。


这是一个极端的例子,但它是规则的主要内容。 Apple 的政策是用户始终处于控制之中 - 避免像 Bob 这样的情况。

关于ios - 如何拍摄照片然后将 iOS 应用程序最小化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17664392/

相关文章:

ios - Sinch 在 iOS 中隐藏 webview 音频

ios - 复选标记字符防止文本颜色与 UIColor

iphone - 无法信任 iphone 上的自签名证书

iphone - 仅在屏幕的有限区域内保持 UIView 可见

iphone - 调用方法时 UIView 无法正确显示

ios - 在 Swift 中使用显式类型进行迭代

ios - 启动屏幕旋转不适用于 iPhone 6s 和更小的屏幕

ios - Game Center 未经身份验证,在 iOS 12 中请求身份验证

ios - 点击图像全屏

ios - NSBundle.allFrameworks 不返回一些框架