Запросить разрешение на доступ к Camera Roll
У меня есть представление настроек, в котором пользователь может выбрать включение или выключение функции "Экспорт в Camera Roll"
Когда пользователь впервые включает его (а не когда он берет первое изображение), я хотел бы, чтобы приложение попросило у него разрешение на доступ к ролику камеры.
Я видел поведение во многих приложениях, но не могу найти способ сделать это.
Ответы
Ответ 1
Я не уверен, есть ли какой-нибудь метод сборки для этого, но простой способ - использовать ALAssetsLibrary, чтобы вытащить бессмысленный бит информации из библиотеки фотографий, когда вы включите эту функцию. Затем вы можете просто аннулировать всю информацию, которую вы вытащили, и вы попросите пользователя получить доступ к их фотографиям.
Следующий код, например, не более чем позволяет получить количество фотографий в кадре камеры, но будет достаточно, чтобы вызвать запрос на разрешение.
#import <AssetsLibrary/AssetsLibrary.h>
ALAssetsLibrary *lib = [[ALAssetsLibrary alloc] init];
[lib enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
NSLog(@"%zd", [group numberOfAssets]);
} failureBlock:^(NSError *error) {
if (error.code == ALAssetsLibraryAccessUserDeniedError) {
NSLog(@"user denied access, code: %zd", error.code);
} else {
NSLog(@"Other error code: %zd", error.code);
}
}];
EDIT: Просто наткнувшись на это, ниже показано, как вы можете проверить статус авторизации ваших приложений для доступа к фотоальбомам.
ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
if (status != ALAuthorizationStatusAuthorized) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Attention" message:@"Please give this app permission to access your photo library in your settings app!" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil, nil];
[alert show];
}
Ответ 2
Так как iOS 8 с Фрейм рамки использует:
Swift 3.0:
PHPhotoLibrary.requestAuthorization { status in
switch status {
case .authorized:
<#your code#>
case .restricted:
<#your code#>
case .denied:
<#your code#>
default:
// place for .notDetermined - in this callback status is already determined so should never get here
break
}
}
Objective-C
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
switch (status) {
case PHAuthorizationStatusAuthorized:
<#your code#>
break;
case PHAuthorizationStatusRestricted:
<#your code#>
break;
case PHAuthorizationStatusDenied:
<#your code#>
break;
default:
break;
}
}];
Важное примечание от documentation:
Этот метод всегда возвращается немедленно. Если пользователь ранее предоставил или отказал в доступе доступа к библиотечной библиотеке, он выполняет блок обработчика при вызове; в противном случае он отображает предупреждение и выполняет блок только после того, как пользователь ответил на предупреждение.
Ответ 3
С iOS 10 нам также необходимо предоставить описание использования библиотеки фотографий в файле info.plist
, который я описал там. И тогда просто используйте этот код, чтобы каждый раз появлялось предупреждение:
- (void)requestAuthorizationWithRedirectionToSettings {
dispatch_async(dispatch_get_main_queue(), ^{
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusAuthorized)
{
//We have permission. Do whatever is needed
}
else
{
//No permission. Trying to normally request it
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status != PHAuthorizationStatusAuthorized)
{
//User don't give us permission. Showing alert with redirection to settings
//Getting description string from info.plist file
NSString *accessDescription = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSPhotoLibraryUsageDescription"];
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:accessDescription message:@"To give permissions tap on 'Change Settings' button" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
[alertController addAction:cancelAction];
UIAlertAction *settingsAction = [UIAlertAction actionWithTitle:@"Change Settings" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}];
[alertController addAction:settingsAction];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alertController animated:YES completion:nil];
}
}];
}
});
}
Также есть некоторые распространенные случаи, когда предупреждение не появляется. Чтобы избежать копирования, я хотел бы, чтобы вы посмотрели на этот ответ.
Ответ 4
В первый раз, когда пользователь пытается записать в кадр камеры на ios 6, у него автоматически запрашивается разрешение. Вам не нужно добавлять дополнительный код (до этого авторизационное состояние - ALAuthorizationStatusNotDetermined).
Если пользователь отрицает первый раз, вы не можете снова спросить (насколько я знаю). Пользователь должен вручную изменить этот параметр приложения в разделе настроек → privacy- > photos.
Есть еще одна опция, и это значит, что пользователь не может дать разрешение из-за других ограничений, таких как родительский контроль, в этом случае статус ALAuthorizationStatusRestricted
Ответ 5
Swift:
import AssetsLibrary
var status:ALAuthorizationStatus = ALAssetsLibrary.authorizationStatus()
if status != ALAuthorizationStatus.Authorized{
println("User has not given authorization for the camera roll")
}
Ответ 6
#import <AssetsLibrary/AssetsLibrary.h>
//////
ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
switch (status) {
case ALAuthorizationStatusRestricted:
{
//Tell user access to the photos are restricted
}
break;
case ALAuthorizationStatusDenied:
{
// Tell user access has previously been denied
}
break;
case ALAuthorizationStatusNotDetermined:
case ALAuthorizationStatusAuthorized:
// Try to show image picker
myPicker = [[UIImagePickerController alloc] init];
myPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
myPicker.delegate = self;
[self presentViewController: myPicker animated:YES completion:NULL];
break;
default:
break;
}
Ответ 7
iOS 9.2.1, Xcode 7.2.1, ARC включен
"ALAuthorizationStatus" устарел: сначала устарел в iOS 9.0 - Вместо этого используйте PHAuthorizationStatus в фреймворке
Пожалуйста, просмотрите этот пост для обновленного решения:
Определите, установлен ли доступ к библиотеке фотографий или нет - PHPhotoLibrary (iOS 8)
Ключевые примечания:
- Скорее всего, вы разрабатываете iOS7.0 + на сегодняшний день, из-за этого вам нужно будет обрабатывать как
ALAuthorizationStatus
, так и PHAuthorizationStatus
.
Проще всего сделать...
if ([PHPhotoLibrary class])
{
//Use the Photos framework
}
else
{
//Use the Asset Library framework
}
-
Вам нужно будет решить, какую медиа-коллекцию вы хотите использовать в качестве источника, это продиктовано устройством, которое ваше приложение. будет работать и какую версию ОС она использует.
-
Возможно, вы захотите направить пользователя к настройкам, если пользователю будет отказано в авторизации.