Подтвердить что ты не робот

Запросить разрешение на доступ к Camera Roll

У меня есть представление настроек, в котором пользователь может выбрать включение или выключение функции "Экспорт в Camera Roll"

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

Я видел поведение во многих приложениях, но не могу найти способ сделать это.

4b9b3361

Ответ 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
}
  • Вам нужно будет решить, какую медиа-коллекцию вы хотите использовать в качестве источника, это продиктовано устройством, которое ваше приложение. будет работать и какую версию ОС она использует.

  • Возможно, вы захотите направить пользователя к настройкам, если пользователю будет отказано в авторизации.