Search code examples
iosobjective-cuiimagepickercontrollerphphotolibrary

if photolibrary permission is given and camera permission is not given then camera opens and take a blank photo


I have denied permission of camera but given permission of photolibrary previously. But camera opens with black screen. and I can see the option to take photo. Is there any way to not open camera.

My code is like this

-(void)showImagePickerWithSoureType:(UIImagePickerControllerSourceType)type
{
    if([UIImagePickerController isSourceTypeAvailable:type])
    {
        pickerObj = [UIImagePickerController new];
        pickerObj.sourceType = type;
        UIViewController *topMostViewController = [CommonFunctions getTopMostViewControllerFromRootViewController:[CommonFunctions getAppDelegateObject].window.rootViewController];
        dispatch_async(dispatch_get_main_queue(), ^{
           [topMostViewController presentViewController:pickerObj animated:YES completion:NULL];
            pickerObj.delegate = self;
            pickerObj.editing = true;
            pickerObj.allowsEditing = true;
        });


        if([PHPhotoLibrary authorizationStatus] == PHAuthorizationStatusNotDetermined)
        {
            [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
                switch (status) {
                    case PHAuthorizationStatusAuthorized:
                        break;
                    case PHAuthorizationStatusRestricted:
                        [self imagePickerControllerDidCancel:pickerObj];
                        break;
                    case PHAuthorizationStatusDenied:
                        [self imagePickerControllerDidCancel:pickerObj];
                        break;
                    default:
                        break;
                }
            }];
        }
    }
}

Solution

  • Try like this :

    For camera:

        AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
        if(authStatus == AVAuthorizationStatusAuthorized)
        {
            [self accessCamera];
        }
        else if(authStatus == AVAuthorizationStatusNotDetermined)
        {
    
            [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted)
             {
                 if(granted)
                 {
                     [self accessCamera];
                 }
                 else
                 {
                     [self deniedCamera];
                 }
             }];
        }
    else
     {
                [self deniedCamera];
     }
    

    For PhotoLibrary :

    PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
    
    if (status == PHAuthorizationStatusAuthorized) {
        [self accessPhotoLibrary];
    }
    else if (status == PHAuthorizationStatusNotDetermined) {
    
        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
    
            if (status == PHAuthorizationStatusAuthorized) {
                [self accessPhotoLibrary];
            }else {
                [self deniedPhotoLibrbary];
            }
        }];
    }
    else  {
        [self deniedPhotoLibrbary];
    }
    

    And the methods to call pickerView delegates

    -(void)accessCamera{        
    
    
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.delegate = self;
        picker.allowsEditing = YES;
        picker.sourceType = UIImagePickerControllerSourceTypeCamera;
            dispatch_async(dispatch_get_main_queue(), ^{
                [self presentViewController:picker animated:YES completion:NULL];
            });
    }
    
    
    -(void)accessPhotoLibrary{
            UIImagePickerController *picker = [[UIImagePickerController alloc] init];
            picker.allowsEditing = YES;
            picker.delegate = self;
            picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
            dispatch_async(dispatch_get_main_queue(), ^{
                [self presentViewController:picker animated:YES completion:NULL];
            });
    
    }
    

    Then you can get image from didFinishPickingMediaWithInfo method.