【问题标题】:Reading the iPhone's Ambient Light sensor读取 iPhone 的环境光传感器
【发布时间】:2011-06-10 16:54:45
【问题描述】:

我注意到在我的 iPhone 上,在阳光直射几秒钟后,屏幕会调整为更亮、更暗等。我想知道是否有办法与这个传感器交互?

我有一个在外面使用的应用程序。当您进入直射光时,在调整之前,您很难在一段时间内看到屏幕。即便如此,它并不总是像我希望的那样明亮。我想为户外观看实现高对比度皮肤,为室内观看实现低对比度。

这是否可以读取光传感器数据,如果可以,我如何提取这些传感器值?

我会假设有一个光传感器,因为相机知道何时使用闪光灯。

【问题讨论】:

  • 这个问题(和the answer about using screen brightness)并没有出现在大多数 S.O.我在这个主题上进行的搜索。即使知道问题和答案都在这里,我也找不到。幸运的是,我会在代码的注释中添加一个链接。
  • 我已将标题编辑为我希望在结果中显示的内容——如果不合适,请见谅!

标签: objective-c ios cocoa-touch iphone-4


【解决方案1】:

另一方面,这是一个不同的想法(可能是一个愚蠢的想法),使用设备屏幕的亮度可以得到一些外部条件的值。

从 0.12(暗)到 0.99(亮)

下一行将获取这些值,试一试,在设备上打开和关闭一些灯以获得不同的值。

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

显然应该打开自动亮度功能才能使其正常工作。

问候。

【讨论】:

  • 非常聪明,工作起来就像一个魅力! :D 虽然根据 Apple 文档,它不会从 0.12 变为 0.99:“此属性的值应该是介于 0.0 和 1.0 之间的数字,包括 0.0 和 1.0。”
  • UIScreen 也会在级别更改时发布UIScreenBrightnessDidChangeNotification
【解决方案2】:

要读取环境光传感器数据,需要在 IOKit 框架中使用 IOHID。

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

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

但是,这需要私有标头,因此如果您使用它,Apple 可能不会让您的应用进入应用商店。

我不断询问 iOS 论坛将来是否会支持环境光传感器读数,但无济于事。

【讨论】:

    【解决方案3】:

    您实际上可以使用相机来执行此操作,这与用户的屏幕亮度设置无关(即使自动亮度关闭也可以使用)。

    正如我在this Stack Overflow answer 中解释的那样,您可以从视频帧的元数据中读取亮度值。

    【讨论】:

    • 这会打开相机吗?因此还要求用户允许这样做?
    • 是的,会的。任何使用相机都可以做到这一点。
    • 它也会比环境光传感器消耗更多的电池,对于我的用例来说,这会达不到目的。
    【解决方案4】:

    尝试使用GSEventSetBacklightLevel();,这需要<GraphicsServices/GraphicsServices.h>。这就是人们可以通过编程方式调整亮度级别的方式。还有一个get 选项,所以我认为这可能包含您想要的信息。

    【讨论】:

    • @George,好的,所以请阅读当前设置并在更改时设置通知。然后你可以做相应的调整。
    • 抱歉,我没有看到这个get 选项。能发个链接吗?
    【解决方案5】:

    对于 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 )
        }
    }
    

    【讨论】:

      【解决方案6】:

      对于 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 位置:SRAmbientLightSample.SensorPlacement 灯光的 相对于传感器的位置。

      枚举 SRAmbientLightSample.SensorPlacement 方向值 描述相对于传感器的光源位置。

      但是,您需要请求批准此类应用程序才能被接受并在 App Store 上发布。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多