Обнаружить наличие камеры в приложении для iPhone?

Я пишу приложение для iOS, и мне нужно иметь возможность определять, есть ли на устройстве камера. Раньше я бы проверял, является ли устройство iPhone или нет, поскольку камера есть только в iPhone, но с выпуском iPod Touch 4 это больше не является жизнеспособным вариантом. Приложение работает без камеры, но наличие камеры добавляет функциональности.

Итак, может ли кто-нибудь предоставить мне код, который возвращает, есть ли камера или нет?


person Origamiguy    schedule 04.09.2010    source источник
comment
Быстрая версия: Ссылка   -  person Juan Boero    schedule 28.02.2016


Ответы (8)


Вы можете использовать метод +isSourceTypeAvailable: в UIImagePickerController:

if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera])
   // Has camera
person Vladimir    schedule 04.09.2010
comment
Осторожно: если камера ограничена, это вернет false, даже если камера существует. - person pulse4life; 26.09.2016
comment
Я работаю над приложением прямо сейчас с ограниченным доступом к камере, но это возвращает истину, поэтому комментарий @ pulse4life неверен (по крайней мере, больше не - с использованием iOS 10). Для авторизации доступа вы должны использовать AVAuthorizationStatus. - person shim; 05.06.2017
comment
Я только что снова проверил это на iOS 10.3.2. Он вернет false, если камера была ограничена на вашем устройстве. Под ограничением я подразумеваю зайти в Настройки ›Общие› Ограничения и выключить камеру (обычно это делает системный администратор). Я считаю, что это предполагаемое поведение, которое требовалось от Apple, поскольку оно технически недоступно, даже если камера существует. - person pulse4life; 06.06.2017
comment
Однако иногда камера моего iPhone не работает должным образом, что может быть связано как с программным, так и с аппаратным обеспечением. Как узнать, работает ли камера программно в Swift или Objective-C? - person vikramarkaios; 30.10.2018
comment
@vikramarkaios, вы имеете ввиду в случаях, когда камера по каким-то причинам дает сбой? Я сомневаюсь, что есть API, чтобы это обнаружить. - person Vladimir; 30.10.2018
comment
@Vladimir, дайте мне знать, что это за api? - person vikramarkaios; 09.11.2018
comment
@vikramarkaios то, что я имел в виду, я думаю, что api не существует - person Vladimir; 09.11.2018

Как написал Хуан Боэро, проверьте:

    if UIImagePickerController.isSourceTypeAvailable(.camera) {...}

Но я бы добавил еще одну проверку, чтобы увидеть, разрешил ли пользователь доступ к камере, как предлагает Apple в своем примере PhotoPicker (Пример PhotoPicker Objective-C):

* обратите внимание, что вам необходимо импортировать AVFoundation

SWIFT 5

    let authStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video)
    switch authStatus {
        /*
         Status Restricted -
         The client is not authorized to access the hardware for the media type. The user cannot change the client's status, possibly due to active restrictions such as parental controls being in place.
         */
    case .denied, .restricted:
        // Denied access to camera
        // Explain that we need camera access and how to change it.
        let dialog = UIAlertController(title: "Unable to access the Camera", message: "To enable access, go to Settings > Privacy > Camera and turn on Camera access for this app.", preferredStyle: UIAlertController.Style.alert)

        let okAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil)

        dialog.addAction(okAction)
        self.present(dialog, animated:true, completion:nil)
    case .notDetermined:
        // The user has not yet been presented with the option to grant access to the camera hardware.
        // Ask for it.
        AVCaptureDevice.requestAccess(for: AVMediaType.video, completionHandler: { (grantd) in
        // If access was denied, we do not set the setup error message since access was just denied.
           if grantd {
           // Allowed access to camera, go ahead and present the UIImagePickerController.
            self.showImagePickerForSourceType(sourceType: UIImagePickerController.SourceType.camera)
            }
        })
    case .authorized:
        // Allowed access to camera, go ahead and present the UIImagePickerController.
        self.showImagePickerForSourceType(sourceType: UIImagePickerController.SourceType.camera)
    @unknown default:
        break; //handle other status
    }

SWIFT 3

let authStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo)
    
if authStatus == AVAuthorizationStatus.denied {
    // Denied access to camera
    // Explain that we need camera access and how to change it.
    let dialog = UIAlertController(title: "Unable to access the Camera", message: "To enable access, go to Settings > Privacy > Camera and turn on Camera access for this app.", preferredStyle: UIAlertControllerStyle.alert)
        
    let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)
        
    dialog.addAction(okAction)
    self.present(dialog, animated:true, completion:nil)
        
} else if authStatus == AVAuthorizationStatus.notDetermined {     // The user has not yet been presented with the option to grant access to the camera hardware.
    // Ask for it.
    AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo, completionHandler: { (grantd) in
    // If access was denied, we do not set the setup error message since access was just denied.
       if grantd {
       // Allowed access to camera, go ahead and present the UIImagePickerController.
            self.showImagePickerForSourceType(sourceType: UIImagePickerControllerSourceType.camera)
        }
    })
} else {
        
    // Allowed access to camera, go ahead and present the UIImagePickerController.
    self.showImagePickerForSourceType(sourceType: UIImagePickerControllerSourceType.camera)

}

func showImagePickerForSourceType(sourceType: UIImagePickerControllerSourceType) {
    
    let myPickerController = UIImagePickerController()
    myPickerController.delegate = self;
    myPickerController.sourceType = sourceType  
    self.present(myPickerController, animated: true, completion: nil)
}
person Boaz Frenkel    schedule 03.05.2017
comment
По состоянию на май 2018 года статус авторизации может быть одним из {authorized, notDetermined, denied, limited} - статус с ограничениями (т. Е. Администратор вообще заблокировал пользователя от использования камеры) выше не обрабатывается. Вы можете захотеть switch вместо if {} else if {}, если это важно для вашего варианта использования. - person ReactiveRaven; 22.05.2018

Если вы используете классы AV Foundation вместо UIImagePickerController, вы можете:

BOOL hasCamera = ([[AVCaptureDevice devices] count] > 0);

Если вы используете UIImagePickerController, это, вероятно, того не стоит, поскольку вам придется добавить AVFoundation.framework в свой проект.

person prewett    schedule 22.01.2014
comment
Это не обязательно сработает. Если ограничения отключили камеру, это может выводить микрофон как устройство, но камера не будет доступна. Лучше использовать [[AVCaptureDevice devicesWithMediaType: AVMediaTypeVideo] count] - person Jbryson; 26.08.2014

Да, для этого есть API:

BOOL isCamera = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
person Ben Zotto    schedule 04.09.2010

Swift:

if UIImagePickerController.isSourceTypeAvailable(.Camera){

    //Your code goes here
    //For example you can print available media types:

    print(UIImagePickerController.availableMediaTypesForSourceType(.Camera))

    }
person Juan Boero    schedule 13.11.2015

Если вам нужно знать, есть ли у устройства конкретно передняя или задняя камера, используйте это:

isCameraAvailable = [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];
person RawMean    schedule 04.07.2014
comment
Это должен быть хороший ответ, поскольку он не зависит от статуса с ограничениями. - person iGranDav; 27.10.2016

Доступна проверка камеры (Swift)

if(!UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera))
person Usman Nisar    schedule 30.08.2016

Вы можете проверить доступность определенного типа источника с помощью сеанса обнаружения (Swift 5):

let discovery = AVCaptureDevice.DiscoverySession.init(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaType.video, position: .back)
let isWideAngleCameraSupported = !discovery.devices.isEmpty
person Jovan Stankovic    schedule 11.08.2019