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

Обнаружение, если iPhone находится в темной комнате

Есть ли способ использовать датчик приближения iPhone для определения того, находится ли телефон в комнате без света?

Этот вопрос, кажется, подразумевает, что это невозможно... Позволяет ли iPhone разрешать датчики света в качестве входных данных?

4b9b3361

Ответ 1

Здесь намного проще использовать камеру, чтобы узнать, насколько яркой является сцена. (Очевидно, что он только считывает данные, которые можно "увидеть" в поле зрения камеры, поэтому это не настоящий датчик освещенности...)

Используя структуру AVFoundation, настройте видеовход и затем, используя инфраструктуру ImageIO, прочитайте метаданные, входящие в каждый кадр видеоподачи (вы можете игнорировать фактические видеоданные):

#import <ImageIO/ImageIO.h>

- (void)captureOutput:(AVCaptureOutput *)captureOutput
      didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
             fromConnection:(AVCaptureConnection *)connection
{
  CFDictionaryRef metadataDict = CMCopyDictionaryOfAttachments(NULL, 
    sampleBuffer, kCMAttachmentMode_ShouldPropagate);
  NSDictionary *metadata = [[NSMutableDictionary alloc] 
    initWithDictionary:(__bridge NSDictionary*)metadataDict];
  CFRelease(metadataDict);
  NSDictionary *exifMetadata = [[metadata 
    objectForKey:(NSString *)kCGImagePropertyExifDictionary] mutableCopy];
  float brightnessValue = [[exifMetadata 
    objectForKey:(NSString *)kCGImagePropertyExifBrightnessValue] floatValue];
}

Теперь у вас есть значение яркости для сцены (обычно - вы можете настроить это) 15-30 раз в секунду. Более низкие цифры темнее.

Ответ 2

Датчик приближения не то, что вы должны искать. Датчик окружающего света это. По-видимому, этот API не документирован или вообще не доступен для разработчиков. Альтернативный способ обнаружения, если iPhone находится в темной комнате, будет использовать камеру и получить светимость. Вот хорошее руководство о том, как это сделать,

http://b2cloud.com.au/tutorial/obtaining-luminosity-from-an-ios-camera/

Ответ 3

Версия Swift 4.2, основанная на коде Wildaker. Xcode 10 отказался позволить ему быть Float, но двойной работал.

func getBrightness(sampleBuffer: CMSampleBuffer) -> Double {
    let rawMetadata = CMCopyDictionaryOfAttachments(allocator: nil, target: sampleBuffer, attachmentMode: CMAttachmentMode(kCMAttachmentMode_ShouldPropagate))
    let metadata = CFDictionaryCreateMutableCopy(nil, 0, rawMetadata) as NSMutableDictionary
    let exifData = metadata.value(forKey: "{Exif}") as? NSMutableDictionary
    let brightnessValue : Double = exifData?[kCGImagePropertyExifBrightnessValue as String] as! Double
    return brightnessValue
}

Ответ 4

Несмотря на то, что доступ к данным датчика внешнего освещения через инфраструктуру IOKit, Apple не рекомендует разработчикам использовать его, и любые приложения, использующие его, будут отклонены из App Store.

Но можно вывести светимость окружающей среды примерно через камеру. То есть, реализуя камеру через AVFoundation framework и обрабатывая метаданные, поступающие через каждую из кадров камеры. Обратите внимание на этот ответ на вопрос: Как получить световую ценность от AVFoundation

Ответ 5

Если вы делаете некоторые вещи с расширенной реальностью, используя ARKit, вы можете получить значение lightEstimate для каждого кадра видеопотока из ARSession.

См. Документацию по этому вопросу.

Ответ 6

Существует гораздо более простое решение для этого, если кому-то нужно. Используйте яркость экрана для определения условий освещения:

0 - 0,3 (темно)

0,4 - 1 (яркий)

Настроить по мере необходимости:

switch UIScreen.main.brightness {
    case 0 ... 0.3:
        print("LOW LIGHT")
    default:
        print("ENOUGH LIGHT")
    }