【问题标题】:iDevice camera shows black instead of previewiDevice 相机显示黑色而不是预览
【发布时间】:2013-05-20 18:08:07
【问题描述】:

我正在开发一个应用程序,它可以从 iDevice 的相机中捕获图像并将其上传到网络服务。

没问题,除了设备的摄像头外,一切正常。设备的相机让我发疯。我正在使用下面的代码来允许用户捕获图像。有时相机显示预览,有时不显示。而不是预览只是在屏幕上显示完全黑暗。如果我从后置摄像头切换到前置摄像头开始工作正常。我什至尝试从设备中删除所有后台应用程序并尽可能多地清除内存;仍然没有运气,我被困住了。 :(

- (IBAction)addNewImage:(id)sender
{
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {
        // Take picture from camera
        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

        // set no to take as much pictures as user want.
        imagePicker.showsCameraControls = YES;

        // Show user the camera
        [self presentModalViewController:imagePicker
                                animated:YES];
    }
    else
    {
        imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        [self presentModalViewController:imagePicker
                                animated:YES];        
    }    
}

【问题讨论】:

  • 您的代码中没有任何内容不正确(除非我会在您确认isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera 返回YES 之后初始化您的UIImagePickerController)。它只发生在那个设备上吗?如果是这样,则可能是您的相机出现故障。你在其他设备上测试过吗?
  • 是的,我已经在 iPhone 4、iPad2 和 iPad4 上测试过了。它给出了同样的问题。请提供任何线索。
  • 我已附上我在相机上的视图的屏幕截图。
  • 您是否尝试过创建一个新的单视图项目,其中只有一个按钮会调用您的addNewImage:?我在我这边试过这个,它按预期工作。

标签: iphone ios ipad camera


【解决方案1】:

我在我的应用程序中遇到过这个问题。尽管我从未发现问题所在,但我重写了代码以定义 UIIMagePickerController 类型的属性并在 getter 中对其进行一次初始化。使用此属性初始化相机视图:

吸气剂:

-(UIImagePickerController *) imagePicker{
    if(!_imagePicker){
       _imagePicker = [[UIImagePickerController alloc] init];
       _imagePicker.delegate = self;
       if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
           _imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
       }
       else{
           _imagePicker.sourceType =UIImagePickerControllerSourceTypePhotoLibrary;
       }  

   }
    return _imagePicker;
}


- (IBAction)addNewImage:(id)sender{
  if (self.imagePicker)
  {
      [self presentViewController:self.imagePicker animated:YES completion:^{}];
  }
}

由于某种原因,这解决了预览有时会显示黑屏的问题

【讨论】:

  • 感谢凯达的回复。我尝试了你提供的代码 sn-p,但这个技巧似乎不起作用。
  • 相机显示预览但需要时间可以说 2 - 4 秒。有什么线索吗?
  • 在启动 imagepickercontroller 时,是否有一些块在 GCD 队列之一上运行?也看到了导致此问题的原因。
  • 抱歉,没有更明确的线索。当在优先级为 DISPATCH_QUEUE_PRIORITY_DEFAULT 的 CGD 队列中执行的块过多时,我遇到了问题。 NSOperationQueue 应该没问题。您仍然可以检查启动控制器时是否正在执行任何操作以及停止操作是否有帮助,但我认为它不相关。
  • 感谢 Kedar 的帮助。让我试试你的建议
【解决方案2】:

在 ios7 中,你应该设置 mainWindow.rootViewController = a class has kind is UIViewController。这对我有用。 如果rootViewController是其他的,例如:UITabbarController、UINavigationController...,会出现摄像头黑屏。

【讨论】:

  • 嗨,你试过这个苹果开发者的样本吗? developer.apple.com/LIBRARY/IOS/samplecode/PhotoPicker/…。没有显示黑色预览画面。一开始,我在mainWindow中设置了一个uitabbarcontroller是rootviewController。黑色预览有时会显示。之后,我将 uiviewcontroller 设置为 rootviewcontroller。没有黑色预览出现。
  • 谢谢分享链接,我试试这个。
【解决方案3】:

我在 iOS7 中遇到同样的问题大约一个月,在对整个应用程序进行长时间的代码审查后,我能够确定问题所在。 我在列举一个
IBOutletCollection(UILabel) NSArray *staticLabelsCollection; 数组同时更新标签文本,在多个线程上同时执行。

[self.labelsArr enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

    UILabel * label = (UILabel*)obj;

    label.text=[NSString stringWithFormat:@"%d",idx+2];

}];

这造成了在主线程之外更新 UIKit 元素的问题。 我能够通过在 Xcode 中启用环境变量 CA_DEBUG_TRANSACTIONS=1 来解决这个问题,这会在设备控制台中生成警告

Nov 20 18:40:26 iPad2 CameraTest[1757] <Warning>: CoreAnimation: warning, deleted thread with uncommitted CATransaction; created by:
 0   QuartzCore                          0x32a553b3 <redacted> + 266
 1   QuartzCore                          0x32a55269 <redacted> + 224
 2   QuartzCore                          0x32a56871 <redacted> + 24
 3   QuartzCore                          0x32a56eed <redacted> + 40
 4   QuartzCore                          0x32a619ed <redacted> + 412
 5   QuartzCore                          0x32a6184b <redacted> + 46
 6   QuartzCore                          0x32a61819 <redacted> + 44
 7   UIKit                               0x32ddfe53 <redacted> + 86
 8   CameraTest                          0x000923b5 __35-[ViewController blockEnumeration:]_block_invoke + 184
 9   CoreFoundation                      0x305aa821 <redacted> + 92
 10  libdispatch.dylib                   0x3b3308eb <redacted> + 134
 11  libdispatch.dylib                   0x3b32fd71 <redacted> + 220
 12  libdispatch.dylib                   0x3b32ff59 <redacted> + 56
 13  libsystem_pthread.dylib             0x3b46adbf _pthread_wqthread + 298
 14  libsystem_pthread.dylib             0x3b46ac84 start_wqthread + 8

通过强制它们在主线程上运行来修复这些“未提交的 CATransactions”,从而修复了黑色摄像头问题。 我可以通过从枚举中删除 Option: NSEnumerationConcurrent 来修复它。

可以不断重现问题的示例应用程序可以下载here

希望示例应用可以提供一些见解和解决问题的方法。

【讨论】:

    【解决方案4】:

    我有一位客户遇到了这个问题。他们必须选择不允许访问相机。我们必须在“设置”中更改应用程序的相机隐私设置。当我们重新打开它时,不再有黑色的相机屏幕。

    【讨论】:

    • 这些有趣的顾客。 :) 谢谢,终于弄清楚为什么它在我客户的手机上不起作用。
    • 是的,这是一种爱恨交织的关系......我们后来输入了代码来检测它何时被停用并在登录屏幕上发出警告。
    • 在设置->隐私->相机->我看不到我的应用列在这个部分。我做错了什么?我的相机显示为黑色。
    • 进入设置 -> 应用名称(例如:Youtube) -> 相机 -> 你可以看到开关按钮 -> 你已经启用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    相关资源
    最近更新 更多