我注意到在我的iPhone上,在阳光直射下几秒钟后,屏幕会调整得更亮、更暗等。我想知道是否有办法与这个传感器交互?
我有一个在外面使用的应用程序。当你进入直射光下时,在屏幕调整之前,很难看到屏幕几个小时。即便如此,它也不总是像我希望的那样明亮。我想在户外观看时使用高对比度皮肤,在室内观看时使用低对比度皮肤。
这可以读取光传感器数据吗?如果可以,我如何提取这些传感器值?
然而,我认为有一个光传感器,因为相机知道何时使用闪光灯。
另一方面,这是一个不同的想法(可能是一个愚蠢的想法),使用设备屏幕的亮度可以获得一些外部条件的值。
从0.12(深色)到0.99(浅色)
下一行将获得这些值,尝试一下,在设备上打开和关闭一些灯,以获得不同的值。
NSLog(@"Screen Brightness: %f",[[UIScreen mainScreen] brightness]);
显然,应该打开自动亮度功能才能使其工作。
谨致问候。
要读取环境光传感器数据,需要在IOKit框架中使用IOHID。
http://iphonedevwiki.net/index.php/AppleISL29003
http://iphonedevwiki.net/index.php/IOKit.framework
然而,这需要私人标头,所以如果你使用它,苹果可能不会让你的应用进入应用商店。
我不断询问iOS论坛,未来是否会支持环境光传感器读数,但都无济于事。
您实际上可以使用相机来实现这一点,这与用户的屏幕亮度设置无关(即使"自动亮度"处于关闭状态也能工作)。
正如我在Stack Overflow回答中所解释的,您可以从视频帧的元数据中读取亮度值。
尝试使用GSEventSetBacklightLevel();
,它需要<GraphicsServices/GraphicsServices.h>
。这就是通过编程调整亮度级别的方法。还有一个get
选项,所以我认为这可能有你想要的信息。
对于iOS 14及以上版本,苹果提供了SensorKit(https://developer.apple.com/documentation/sensorkit/srsensor/3377673-ambientlightsensor),用于显式访问各种传感器和系统日志(调用日志、消息日志等)。除了原始勒克斯值,您还可以获得环境光的色度和相对于设备传感器的方向。
(发件人https://developer.apple.com/documentation/sensorkit/srambientlightsample)
测量光照水平
var色度:SRAmbientLightSample.色度坐标对描述样品的光亮度和色调。
struct SRAmbientLightSample.Chromacity一个坐标对描述了灯光的亮度和色调。
var lux:测量描述样品的光通量。
var放置: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 )
}
}