2013-09-21 4 views
8

По какой-то причине в первый раз, когда я открываю UIImagePickerController в режиме камеры в своем приложении, он становится пустым. Мне нужно закрыть и снова открыть эту точку зрения, чтобы начать работу с питанием камеры. Я использую стандартный код, который отлично работает в iOS 6 для захвата камеры. Из приведенного ниже примера я запускаю метод capturePhoto:. Кто-нибудь еще сталкивается с этой jenkiness с камерой iOS 7? Я проверил форумы Apple dev, но почти невозможно найти ответы там.iOS 7 UIImagePickerController Camera No Image

- (IBAction)capturePhoto:(id)sender { 
    [self doImagePickerForType:UIImagePickerControllerSourceTypeCamera]; 
} 

- (void)doImagePickerForType:(UIImagePickerControllerSourceType)type { 
    if (!_imagePicker) { 
     _imagePicker = [[UIImagePickerController alloc] init]; 
     _imagePicker.mediaTypes = @[(NSString*)kUTTypeImage]; 
     _imagePicker.delegate = self; 
    } 
    _imagePicker.sourceType = type; 
    [self presentViewController:_imagePicker animated:YES completion:nil]; 
} 

why so empty?

ответ

16

Я также использую UIImagePickerController и столкнулся с тем же вопросом с пустым экраном. Я хотел бы немного рассказать о том, что сказал klaudz относительно авторизации iOS 7 для камеры.

Ссылка: https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVCaptureDevice_Class/Reference/Reference.html

«аудио Записи всегда требует явного разрешения от пользователя, запись видео также требуется разрешение пользователя на устройствах, продаваемых в некоторых регионах.»

Вот некоторые фрагменты кода, которые вы можете начать, чтобы проверить, есть ли у вас разрешение на камеру и запросить его, если ваше приложение ранее не запрашивало его.Если вам отказано в связи с более ранним запросом, вашему приложению может потребоваться внести уведомление пользователю, чтобы он входил в настройки, чтобы вручную разрешать доступ, как указывал Клаудз.

IOS 7 Пример

NSString *mediaType = AVMediaTypeVideo; // Or AVMediaTypeAudio 

AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType]; 

// This status is normally not visible—the AVCaptureDevice class methods for discovering devices do not return devices the user is restricted from accessing. 
if(authStatus == AVAuthorizationStatusRestricted){ 
    NSLog(@"Restricted"); 
} 

// The user has explicitly denied permission for media capture. 
else if(authStatus == AVAuthorizationStatusDenied){ 
    NSLog(@"Denied"); 
} 

// The user has explicitly granted permission for media capture, or explicit user permission is not necessary for the media type in question. 
else if(authStatus == AVAuthorizationStatusAuthorized){ 
    NSLog(@"Authorized"); 
} 

// Explicit user permission is required for media capture, but the user has not yet granted or denied such permission. 
else if(authStatus == AVAuthorizationStatusNotDetermined){ 

    [AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) { 

     // Make sure we execute our code on the main thread so we can update the UI immediately. 
     // 
     // See documentation for ABAddressBookRequestAccessWithCompletion where it says 
     // "The completion handler is called on an arbitrary queue." 
     // 
     // Though there is no similar mention for requestAccessForMediaType, it appears it does 
     // the same thing. 
     // 
     dispatch_async(dispatch_get_main_queue(), ^{ 

      if(granted){ 
       // UI updates as needed 
       NSLog(@"Granted access to %@", mediaType); 
      } 
      else { 
       // UI updates as needed 
       NSLog(@"Not granted access to %@", mediaType); 
      } 
     }); 

    }]; 

} 

else { 
    NSLog(@"Unknown authorization status"); 
} 
+0

как я могу это сделать в iOS 6? – jianpx

+0

Я сталкиваюсь с проблемой во время захвата изображения. как я могу его решить. – Nirav

+0

где использовать это решение? – Nirav

7

В прошивке 7, приложение может получить доступ к камере, прежде чем санкционировать пользователь. Когда приложение обращается к камере в первый раз, iOS показывает предупреждение, чтобы спросить пользователя. Пользователи также могут установить разрешение в Settings--Privacy--Camera--[Your app's name].

Камера останется в черном пустом месте, если переключатель выключен.

  1. При вызове камеры с помощью AVCaptureDeviceInput, вы можете проверить, как:

    NSError *inputError = nil; 
    AVCaptureDeviceInput *captureInput = 
        [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:&inputError]; 
    if (inputError && 
        inputError.code == AVErrorApplicationIsNotAuthorizedToUseDevice) 
    { 
        // not authorized 
    } 
    
  2. Если вы звоните с помощью UIImagePickerController, я до сих пор ищет способ, чтобы проверить ли получил Авторизовать.

    Я попробовал эти два метода:

    [UIImagePickerController isSourceTypeAvailable:] 
    [UIImagePickerController isCameraDeviceAvailable:] 
    

    но они did't работу, что все они вернулись YES.

UPDATE

Спасибо за расширяющейся Скотта. [AVCaptureDevice authorizationStatusForMediaType:] - лучший способ проверить.

AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; 
if (authStatus == AVAuthorizationStatusAuthorized) { 
    // successful 
} else { 
    // failed, such as 
    // AVAuthorizationStatusNotDetermined 
    // AVAuthorizationStatusRestricted 
    // AVAuthorizationStatusNotDetermined 
} 

Но помните, чтобы проверить версию IOS, потому что [AVCaptureDevice authorizationStatusForMediaType:] и AVAuthorizationStatus доступны выше прошивкой 7.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { 
    // code for AVCaptureDevice auth checking 
} 
+0

Что использовать в iOS6 для авторизации .... ваш первый пункт, который использует «AVErrorApplicationIsNotAuthorizedToUseDevice» в состоянии if? –

+1

Нет настроек в PRIVACY в iOS6, поэтому просто проверьте с помощью '[UIImagePickerController isSourceTypeAvailable:]' и ' [UIImagePickerController isCameraDeviceAvailable:]' если вам нужно. – klaudz

+3

Вместо '[[[UIDevice currentDevice] systemVersion] floatValue]> = 7.0' вы должны вместо этого проверить' [AVCaptureDevice отвечаетSoSelector: @selector (authorizationStatusForMediaType :)) ' – user102008

4

я испытал точно такая же проблема, и перепробовал все решения в Интернете не повезло. Но, наконец, я узнал, что фоновый поток помешал экрану камеры показать. Если у вас есть фоновый поток, работающий при попытке открыть камеру, как я, попробуйте заблокировать фоновый поток и посмотреть, что произойдет. Надеюсь, вы сможете обойти это.

+0

Это похоже на вероятного виновника, я буду копать мой код и попробуйте и решите это. Спасибо за ответ. – KyleStew

+0

любой прогресс здесь? я отправил TSI для Apple, но ответа нет, удаление GCD из моего приложения невозможно, и я просто надеюсь, что есть способ приостановить или остановить GCD, чтобы показать камеру, если это отдаленно верно = ( –

+0

Мне не удалось попасть на точный шаг событий, чтобы воспроизводить его последовательно, и что-то, что я делал в своей кодовой базе, похоже, решил проблемы, поскольку я больше не вижу проблемы. Надеюсь, вы тоже сможете разобраться. – KyleStew

0

Я наткнулся на этот контроль AQPhotoPicker. Это довольно легко использовать, и, надеюсь, это поможет вам

Смежные вопросы