0
回答
Android: Android Light Sensor HOWTO
【寻找人气王】邀新用户免费体验华为云服务,百元话费等你拿!   

基于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:
      
@@ -582,6 +582,8 @@ public class SensorManager
                 return SENSOR_ORIENTATION_RAW;
             case Sensor.TYPE_TEMPERATURE:
                 return SENSOR_TEMPERATURE;
+            case Sensor.TYPE_LIGHT:
+                return SENSOR_LIGHT;                
         }
         return 0;
     }
@@ -606,6 +608,9 @@ public class SensorManager
                     result |= SensorManager.SENSOR_ORIENTATION |
                                     SensorManager.SENSOR_ORIENTATION_RAW;
                     break;
+                case Sensor.TYPE_LIGHT:
+                    result |= SensorManager.SENSOR_LIGHT;
+                    break;
             }
         }
         return result;
@@ -707,6 +712,8 @@ public class SensorManager
                 listener, sensors, rate) || result;
         result = registerLegacyListener(SENSOR_TEMPERATURE, Sensor.TYPE_TEMPERATURE,
                 listener, sensors, rate) || result;
+        result = registerLegacyListener(SENSOR_LIGHT, Sensor.TYPE_LIGHT,
+                listener, sensors, rate) || result;
         return result;
     }
 
@@ -766,6 +773,8 @@ public class SensorManager
                 listener, sensors);
         unregisterLegacyListener(SENSOR_TEMPERATURE, Sensor.TYPE_TEMPERATURE,
                 listener, sensors);
+        unregisterLegacyListener(SENSOR_LIGHT, Sensor.TYPE_LIGHT,
+                listener, sensors);
     }
 
     c) PowerManagerService.java:
       这里似乎一个系统bug
      
                 int lcdValue = getAutoBrightnessValue(
-                        (mIsDocked ? value : mHighestLightSensorValue),
-                        mLcdBacklightValues);
+                        (true ? value : mHighestLightSensorValue),
+                        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));
      
    if (event->type == EV_ABS) {
        LOGV("light-level type: %d code: %d value: %-5d time: %ds",
             event->type, event->code, event->value,
             (int)event->time.tv_sec);
        if (event->code == EVENT_TYPE_LIGHT) {
            struct input_absinfo absinfo;
            int index;
            if (!ioctl(fd, EVIOCGABS(ABS_DISTANCE), &absinfo)) {
                index = event->value;
                if (index >= 0) {
                    new_sensors |= SENSORS_LIGHT;
                    if (index >= ARRAY_SIZE(sLuxValues)) {
                        index = ARRAY_SIZE(sLuxValues) - 1;
                    }
                    dev->sensors[ID_L].light = sLuxValues[index];
                }
            }
        }
    }
 
      .light 最终传给 PowerManager, PowerManager根据config_autoBrightnessLevels数组
      得到config_autoBrightnessLcdBacklightValues数据具体亮度值,然后调整亮度
      比如 .light = 2500.0
         3000.0  <  2500.0 < 4000.0 对应的LcdBacklightValues 就是160
      -- THE END --
   

 


原文链接:http://blog.csdn.net/zmyde2010/article/details/6272071
<无标签>
举报
长平狐
发帖于6年前 0回/626阅
顶部