Reputation: 2674
I am using a UIImagePicker to present the users photos so that the user can choose an image to be used in my app.
My problem is that on the first time a user opens the image picker they are presented with a prompt saying: '"my App" Would like to Access your Photos' with two options, Don't allow and OK.
My requirement is that when the user clicks Don't Allow, the Image picker gets dismissed.
Is there a way to detect that the user has chosen Don't allow?
Currently it leaves the user in an ugly blank modal view. If the user opens the image picker again they are show the nice apple provided message that says "this app does not have access to your photos etc etc"
here is how I use the image picker:
self.imagePickerController = [[UIImagePickerController alloc] init];
self.imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:self.imagePickerController animated:YES];
Upvotes: 6
Views: 5018
Reputation: 205
I had a similar problem. You can look at my code below if it can help anyone in future who may have similar problem.I have an IBAction which helps me load the images. I struggled with this method for 4-5 hours.
(IBAction)loadImages:(id)sender {
ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
if (status == AVAuthorizationStatusAuthorized || status == AVAuthorizationStatusNotDetermined) {
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]init];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if (*stop) {
self.imagePicker = [[UIImagePickerController alloc] init];
self.imagePicker.delegate = self;
self.imagePicker.allowsEditing = NO;
self.imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.mediaTypes =[UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
[self presentViewController:imagePicker animated:YES completion:^{
//TODO
}];
return;
}
*stop = TRUE;
} failureBlock:^(NSError *error) {
[imagePicker dismissViewControllerAnimated:YES completion:nil];
}];
}
if (status == AVAuthorizationStatusDenied || status == AVAuthorizationStatusRestricted) {
UIAlertView *cameraAlert = [[UIAlertView alloc]initWithTitle:NSLocalizedString(@"Camera Access Required", nil) message:NSLocalizedString(@"Please allow us to access your camera roll in your device Settings.", nil) delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil];
[cameraAlert show];
}
}
Upvotes: 0
Reputation: 2674
Got it!
if ([ALAssetsLibrary authorizationStatus] == ALAuthorizationStatusNotDetermined) {
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if (*stop) {
// INSERT CODE TO PERFORM WHEN USER TAPS OK eg. :
return;
}
*stop = TRUE;
} failureBlock:^(NSError *error) {
// INSERT CODE TO PERFORM WHEN USER TAPS DONT ALLOW, eg. :
self.imagePickerController dismissViewControllerAnimated:YES completion:nil];
}];
}
Upvotes: 13
Reputation: 318884
Use ALAssetsLibrary authorizationStatus
. There is a specific return value that indicates your app has been denied.
Doing a search here on that method will reveal some sample code for properly handling the various authorization states.
Upvotes: 2