Есть ли способ использовать датчик приближения iPhone для определения того, находится ли телефон в комнате без света?
Этот вопрос, кажется, подразумевает, что это невозможно... Позволяет ли iPhone разрешать датчики света в качестве входных данных?
Есть ли способ использовать датчик приближения iPhone для определения того, находится ли телефон в комнате без света?
Этот вопрос, кажется, подразумевает, что это невозможно... Позволяет ли iPhone разрешать датчики света в качестве входных данных?
Здесь намного проще использовать камеру, чтобы узнать, насколько яркой является сцена. (Очевидно, что он только считывает данные, которые можно "увидеть" в поле зрения камеры, поэтому это не настоящий датчик освещенности...)
Используя структуру 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 раз в секунду. Более низкие цифры темнее.
Датчик приближения не то, что вы должны искать. Датчик окружающего света это. По-видимому, этот API не документирован или вообще не доступен для разработчиков. Альтернативный способ обнаружения, если iPhone находится в темной комнате, будет использовать камеру и получить светимость. Вот хорошее руководство о том, как это сделать,
http://b2cloud.com.au/tutorial/obtaining-luminosity-from-an-ios-camera/
Версия 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
}
Несмотря на то, что доступ к данным датчика внешнего освещения через инфраструктуру IOKit, Apple не рекомендует разработчикам использовать его, и любые приложения, использующие его, будут отклонены из App Store.
Но можно вывести светимость окружающей среды примерно через камеру. То есть, реализуя камеру через AVFoundation framework и обрабатывая метаданные, поступающие через каждую из кадров камеры. Обратите внимание на этот ответ на вопрос: Как получить световую ценность от AVFoundation
Если вы делаете некоторые вещи с расширенной реальностью, используя ARKit, вы можете получить значение lightEstimate
для каждого кадра видеопотока из ARSession
.
Существует гораздо более простое решение для этого, если кому-то нужно. Используйте яркость экрана для определения условий освещения:
0 - 0,3 (темно)
0,4 - 1 (яркий)
Настроить по мере необходимости:
switch UIScreen.main.brightness {
case 0 ... 0.3:
print("LOW LIGHT")
default:
print("ENOUGH LIGHT")
}