iOS приложение отказано в доступе к камере iOS 9.1 (черный экран)


Я хочу получить доступ к камере в моем приложении. Я пытаюсь использовать следующий код.

  if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera])
            {
                UIImagePickerController *picker = [[UIImagePickerController alloc] init];
                picker.delegate = self;
                picker.allowsEditing = YES;
                picker.sourceType = UIImagePickerControllerSourceTypeCamera;
                if(isIOS8SystemVersion)
                {
                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                        [self presentViewController:picker animated:YES completion:NULL];
                    }];
                }
                else
                {
                    [self presentViewController:picker animated:YES completion:NULL];
                }
            }

Этот код отлично работает на моем другом приложении.Но в этом приложении он не спрашивает разрешения камеры или показывает его в настройках - > конфиденциальность - > камера.

Введите описание изображения здесь

Приложение предложит использовать местоположение.Но не показывает ничего для камеры или фотографий.

Появляется черный экран, и я не могу сделать снимок, если я непосредственно использую код камеры без проверки состояния.

3   3  

3 ответа:

У меня была точно такая же проблема в течение нескольких дней,

Попробуйте это его решило мою проблему, убедитесь, что есть значение

(имя приложения в виде строки) в вашей информации.plist > "отображаемое имя пакета".

В моем случае он был пуст, и из-за этого он не работал.

Дайте мне знать, если это помогло вам.

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

- (void)checkCameraPermission
{
    // *** check for hardware availability ***
    BOOL isCamera = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
    if(!isCamera)
    {
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:APPName message:@"Camera not detected" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];

        return;
    }

    // *** Store camera authorization status ***
    AVAuthorizationStatus _cameraAuthorizationStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];

    switch (_cameraAuthorizationStatus)
    {
        case AVAuthorizationStatusAuthorized:
        {
            _cameraAuthorizationStatus = AVAuthorizationStatusAuthorized;
            // *** Camera is accessible, perform any action with camera ***
        }
            break;
        case AVAuthorizationStatusNotDetermined:
        {
            NSLog(@"%@", @"Camera access not determined. Ask for permission.");

            [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted)
             {
                 if(granted)
                 {
                     NSLog(@"Granted access to %@", AVMediaTypeVideo);
                    // *** Camera access granted by user, perform any action with camera ***
                 }
                 else
                 {
                     NSLog(@"Not granted access to %@", AVMediaTypeVideo);
                    // *** Camera access rejected by user, perform respective action ***
                 }
             }];
        }
            break;
        case AVAuthorizationStatusRestricted:
        case AVAuthorizationStatusDenied:
        {
            // Prompt for not authorized message & provide option to navigate to settings of app.
            dispatch_async( dispatch_get_main_queue(), ^{
                NSString *message = NSLocalizedString( @"My App doesn't have permission to use the camera, please change privacy settings", @"Alert message when the user has denied access to the camera" );
                UIAlertController *alertController = [UIAlertController alertControllerWithTitle:APPName message:message preferredStyle:UIAlertControllerStyleAlert];
                UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:NSLocalizedString( @"OK", @"Alert OK button" ) style:UIAlertActionStyleCancel handler:nil];
                [alertController addAction:cancelAction];
                // Provide quick access to Settings.
                UIAlertAction *settingsAction = [UIAlertAction actionWithTitle:NSLocalizedString( @"Settings", @"Alert button to open Settings" ) style:UIAlertActionStyleDefault handler:^( UIAlertAction *action ) {
                    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
                }];
                [alertController addAction:settingsAction];
                [self presentViewController:alertController animated:YES completion:nil];
            });
        }
            break;
        default:
            break;
    }
}

Код работает в моем приложении:

UIImagePickerController *picker;
    if([self checkForCameraAcess]) 
    { 
    picker = [[UIImagePickerController alloc] init]; 
    picker.delegate = self; 
    picker.sourceType = UIImagePickerControllerSourceTypeCamera; 
    [self presentViewController:picker animated:YES completion:nil]; 
    } 
    else 
    { 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Camera",nil) message:NSLocalizedString(@"Access to camera seems to be turned off. Please enable it from settings",nil) delegate:self cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:NSLocalizedString(@"Settings",nil), nil]; 
    alert.tag = 101; 
    [alert show]; 
    }    

-(BOOL)checkForCameraAcess
{
    BOOL isAccess = YES;
    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)
    {
        AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];

        //Here we check condition for AVAuthorizationStatusNotDetermined, because when user install iLeads app first time in device (Nerver before iLeads app install in Device), then setup an event and tap on the scan button, at that time authStatus is AVAuthorizationStatusNotDetermined so its show alert for camera acess first. Then after our custom alert shows if we tap on 'Dont allow' button of the camera acess.
        if(authStatus == AVAuthorizationStatusAuthorized || authStatus == AVAuthorizationStatusNotDetermined)
        {
            isAccess = YES;
        }
        else
        {
            isAccess = NO;
        }
    }
    return isAccess;
}

Не забудьте добавить UIImagePickerControllerDelegate в свой .h

Я надеюсь, что это будет работать.