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