• android light sensor port


     

    基于android 2.2 添加Light Sensor支持:

    1) UI部分

    2) framework部分

    3) HAL 部分

    4) Driver 部分

    下面分别讨论:

    1) UI部分

        a) 打开亮度设置菜单的自动调整亮度checkbox

            frameworks/base/core/res/res/values/config.xml :

            -  <bool name="config_automatic_brightness_available">false</bool>

            + <bool name="config_automatic_brightness_available">true</bool>

        b) 同时设置Lux级,亮度级,以5级亮度为例

           <integer-array name="config_autoBrightnessLevels">

    +    <item>1000</item>
    +    <item>2000</item>
    +    <item>3000</item>
    +    <item>4000</item>    
         </integer-array>
         <integer-array name="config_autoBrightnessLcdBacklightValues">
    +    <item>20</item>
    +    <item>80</item>  
    +    <item>120</item>
    +    <item>160</item>   
    +    <item>250</item>  
         </integer-array>     
         
         autoBrightnessLevels 随便设,HAL层传上来的数据落在这几个值之间以区分级别
         LcdBacklightValues 是5级亮度的实际值
     2) framework部分
         a) framework层的相关文件
    ./core/java/android/hardware/SensorEvent.java
    ./core/java/android/hardware/SensorListener.java
    ./core/java/android/hardware/ISensorService.aidl
    ./core/java/android/hardware/Sensor.java
    ./core/java/android/hardware/SensorEventListener.java
    ./core/jni/android_hardware_SensorManager.cpp     //SensorManager JNI
    ./core/java/android/hardware/SensorManager.java    //SensorManager
    ./services/jni/com_android_server_SensorService.cpp //SensorSersvice JNI
    ./services/java/com/android/server/SensorService.java //SensorService
            ./services/java/com/android/server/PowerManagerService.java
           Sensor系统相对比较简单,我们需要修改的更少:
           添加Light Sensor只需要修改SensorManager.java, PowerManagerService.java两个文件
          b) SensorManager.java:
          
    1. @@ -582,6 +582,8 @@ public class SensorManager  
    2.                  return SENSOR_ORIENTATION_RAW;  
    3.              case Sensor.TYPE_TEMPERATURE:  
    4.                  return SENSOR_TEMPERATURE;  
    5. +            case Sensor.TYPE_LIGHT:  
    6. +                return SENSOR_LIGHT;                  
    7.          }  
    8.          return 0;  
    9.      }  
    10. @@ -606,6 +608,9 @@ public class SensorManager  
    11.                      result |= SensorManager.SENSOR_ORIENTATION |  
    12.                                      SensorManager.SENSOR_ORIENTATION_RAW;  
    13.                      break;  
    14. +                case Sensor.TYPE_LIGHT:  
    15. +                    result |= SensorManager.SENSOR_LIGHT;  
    16. +                    break;  
    17.              }  
    18.          }  
    19.          return result;  
    20. @@ -707,6 +712,8 @@ public class SensorManager  
    21.                  listener, sensors, rate) || result;  
    22.          result = registerLegacyListener(SENSOR_TEMPERATURE, Sensor.TYPE_TEMPERATURE,  
    23.                  listener, sensors, rate) || result;  
    24. +        result = registerLegacyListener(SENSOR_LIGHT, Sensor.TYPE_LIGHT,  
    25. +                listener, sensors, rate) || result;  
    26.          return result;  
    27.      }  
    28.    
    29. @@ -766,6 +773,8 @@ public class SensorManager  
    30.                  listener, sensors);  
    31.          unregisterLegacyListener(SENSOR_TEMPERATURE, Sensor.TYPE_TEMPERATURE,  
    32.                  listener, sensors);  
    33. +        unregisterLegacyListener(SENSOR_LIGHT, Sensor.TYPE_LIGHT,  
    34. +                listener, sensors);  
    35.      }  
     
         c) PowerManagerService.java:
           这里似乎一个系统bug
          
    1.                  int lcdValue = getAutoBrightnessValue(  
    2. -                        (mIsDocked ? value : mHighestLightSensorValue),  
    3. -                        mLcdBacklightValues);  
    4. +                        (true ? value : mHighestLightSensorValue),  
    5. +                        mLcdBacklightValues);     
     
      3) HAL 部分      
          实现hardware/libhardware/include/hardware/sensor.h接口,写一个HAL层,
          这部分请参考我上一篇文章: android sensor HAL范例,那个例子写的好级啦
          需要说明的一点是,android系统的所有sensor公用一个HAL层文件,所以如果你的系统已有其他sensor那么需要在其他
          sensor的HAL实现中添加light sensor
          HAL层最终生成 /system/lib/hw/sensors.xxx.so 
      4) Driver 部分
          不管啥接口的light sensor,请把它写成一个input设备,
          通过/dev/input/eventX来提供数据
          这样在HAL层polling的时候就可以
          nread = read(ls_fd, &event, sizeof(event));
          
    1. if (event->type == EV_ABS) {  
    2.     LOGV("light-level type: %d code: %d value: %-5d time: %ds",  
    3.          event->type, event->code, event->value,  
    4.          (int)event->time.tv_sec);  
    5.     if (event->code == EVENT_TYPE_LIGHT) {  
    6.         struct input_absinfo absinfo;  
    7.         int index;  
    8.         if (!ioctl(fd, EVIOCGABS(ABS_DISTANCE), &absinfo)) {  
    9.             index = event->value;  
    10.             if (index >= 0) {  
    11.                 new_sensors |= SENSORS_LIGHT;  
    12.                 if (index >= ARRAY_SIZE(sLuxValues)) {  
    13.                     index = ARRAY_SIZE(sLuxValues) - 1;  
    14.                 }  
    15.                 dev->sensors[ID_L].light = sLuxValues[index];  
    16.             }  
    17.         }  
    18.     }  
    19. }  
     
          .light 最终传给 PowerManager, PowerManager根据config_autoBrightnessLevels数组
          得到config_autoBrightnessLcdBacklightValues数据具体亮度值,然后调整亮度
          比如 .light = 2500.0
             3000.0  <  2500.0 < 4000.0 对应的LcdBacklightValues 就是160
          -- THE END --
  • 相关阅读:
    WebRTC视频采集中的约束有哪些和具体的使用方法
    解决WebRTC中不同的浏览器之间适配的问题
    WebRTC如何获取音频视频设备
    用C#调用外部DLL
    null值与非null只比较大小时,只会返回false
    jsonp实现js跨域请求
    同一域名的ASP.NET网站实现Session共享
    machinekey相关信息
    从bbs.3dmgame.com与qq的登录解析oauth2.0协议
    asp.net使用wsdl文件调用接口,以及调用SSL接口报错“根据验证过程 远程证书无效”的处理
  • 原文地址:https://www.cnblogs.com/chengliu/p/3636433.html
Copyright © 2020-2023  润新知