Чтение датчика внешнего освещения iPhone

Я заметил, что на моем iPhone после нескольких секунд нахождения под прямым солнечным светом экран будет становиться ярче, ярче и т. Д. Мне было интересно, есть ли способ взаимодействия с этим датчиком?

У меня есть приложение, которое используется снаружи. Когда вы переходите на прямой свет, становится очень трудно увидеть экран в течение нескольких моментов, прежде чем он настроится. И даже тогда это не всегда так ярко, как хотелось бы. Я хотел бы реализовать высококонтрастный скин для просмотра на улице и низкий контраст для просмотра в помещении.

Можно ли считывать данные датчика освещенности, и если да, то как мне извлечь эти значения датчика?

Я бы предположил, что есть датчик освещенности, поскольку камера знает, когда использовать вспышку.

6 ответов

Решение

Попробуйте использовать GSEventSetBacklightLevel();, что требует <GraphicsServices/GraphicsServices.h>, Вот как можно программно настроить уровни яркости. Также есть get вариант, поэтому я думаю, что может иметь информацию, которую вы ищете.

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

От 0,12 (темный) до 0,99 (светлый)

Следующая строка получит эти значения, попробует, включит и выключит свет на устройстве, чтобы получить другие значения.

NSLog(@"Screen Brightness: %f",[[UIScreen mainScreen] brightness]);

Очевидно, что функция автоматической яркости должна быть включена, чтобы это работало.

С уважением.

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

http://iphonedevwiki.net/index.php/AppleISL29003

http://iphonedevwiki.net/index.php/IOKit.framework

Однако для этого требуются частные заголовки, поэтому, если вы используете его, Apple, вероятно, не пустит ваше приложение в магазин приложений.

Я постоянно спрашиваю форумы iOS, будет ли в будущем поддержка показаний датчика внешней освещенности, но безрезультатно.

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

Вы читаете значение яркости из метаданных видеокадров, как я объясняю в ответе на переполнение стека.

Для iOS 14 и выше Apple предоставила SensorKit (https://developer.apple.com/documentation/sensorkit/srsensor/3377673-ambientlightsensor ) для явного доступа ко всем видам датчиков и системным журналам (журналам вызовов, журналам сообщений и т. Д.) .). В дополнение к исходному значению в люксах вы также можете получить цветность окружающего света и ориентацию относительно датчика устройства.

(Из https://developer.apple.com/documentation/sensorkit/srambientlightsample )

Измерение уровня освещенности

var chromaticity: SRAmbientLightSample.Chromaticity Пара координат, которая описывает яркость и оттенок света образца.

struct SRAmbientLightSample.Chromaticity Пара координат, которая описывает яркость и оттенок света.

var lux: Measurement Объект, описывающий световой поток образца.

var location: SRAmbientLightSample.SensorPlacement Расположение источника света относительно датчика.

enum SRAmbientLightSample.SensorPlacement Направленные значения, которые описывают расположение источника света по отношению к датчику.

Однако вам необходимо запросить одобрение для принятия и публикации такого приложения в App Store.

Для Swift 5 вот как использовать определение яркости, которое косвенно дает вам яркость снаружи:

/// A view controller (you can use any UIView or AnyObj)
class MyViewConroller: UIViewController { 

    /// Remove observers on deinit
    deinit {
        removeObservers()
    }

    // MARK: - Observers management helpers

    /// Add my observers to the vc
    func addObservers() {

        NotificationCenter.default.addObserver(self, selector: #selector(onScreenBrightnessChanged(_:)), name: UIScreen.brightnessDidChangeNotification, object:nil)
    }

    /// Clean up observers
    func removeObservers() {
        NotificationCenter.default.removeObserver(self)
    }

    /// Load the views
    func loadView() {
        // Add my observes to the vc
        addObservers()
    }

    /**
    Handles brightness changes
    */
    @objc func onScreenBrightnessChanged(_ sender: Notification) {

        // Tweak as needed: 0.5 is a good value for me
        let isDark = UIScreen.main.brightness < 0.5.   // in 0...1
        // Do whatever you want with the `isDark` flag: here I turn the headlights off
        vehicle.turnOnTheHeadlights( isDark )
    }
}
Другие вопросы по тегам