Android 返回限制值范围的光传感器代码
我正在尝试编写一个非常基本的光度表应用程序,用于使用Galaxy S2作为传感器的旧35毫米相机 我首先要指出的是,本手机有一个隐藏/测试模式,可通过在拨号键盘上输入星形哈希零星形哈希,然后选择“传感器”来选择。这使得光传感器可用,当我改变光照水平时,它以5步为单位显示介于5到2000之间的勒克斯值范围 我编写的非常简单的概念验证代码只会显示三个值,即相同照明条件范围内的10、100和1000。我的代码是:Android 返回限制值范围的光传感器代码,android,Android,我正在尝试编写一个非常基本的光度表应用程序,用于使用Galaxy S2作为传感器的旧35毫米相机 我首先要指出的是,本手机有一个隐藏/测试模式,可通过在拨号键盘上输入星形哈希零星形哈希,然后选择“传感器”来选择。这使得光传感器可用,当我改变光照水平时,它以5步为单位显示介于5到2000之间的勒克斯值范围 我编写的非常简单的概念验证代码只会显示三个值,即相同照明条件范围内的10、100和1000。我的代码是: public class LightMeterActivity extends Acti
public class LightMeterActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mLightSensor;
private float mLux = 0.0f;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
}
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mLightSensor,
SensorManager.SENSOR_DELAY_FASTEST);
}
@Override
protected void onPause() {
mSensorManager.unregisterListener(this);
super.onPause();
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
mLux = event.values[0];
String luxStr = String.valueOf(mLux);
TextView tv = (TextView) findViewById(R.id.textView1);
tv.setText(luxStr);
Log.d("LUXTAG", "Lux value: " + event.values[0] );
}
}
}
有人能解释为什么会这样吗
我已经看到了这个问题
这根本没用。我无法理解内置测试模式如何能看到整个范围,而我的代码却看不到。也许您的系统默认使用另一个光传感器。我编写了一个应用程序,只输出有关传感器的信息:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mLightSensorList = mSensorManager.getSensorList(Sensor.TYPE_LIGHT);
tvSensorList = (TextView) findViewById(R.id.tvSensorList);
StringBuilder sensorInfo = new StringBuilder("");
if (mLightSensorList != null) {
Log.d("Yury", mLightSensorList.toString());
for (Sensor s : mLightSensorList) {
sensorInfo.append("Sensor name: ");
sensorInfo.append(s.getName());
sensorInfo.append(" vendor: ");
sensorInfo.append(s.getVendor());
sensorInfo.append(" ver.: ");
sensorInfo.append(s.getVersion());
sensorInfo.append(" resolution: ");
sensorInfo.append(s.getResolution());
sensorInfo.append(" maxRange: ");
sensorInfo.append(s.getMaximumRange());
sensorInfo.append("\n");
}
tvSensorList.setText(sensorInfo.toString());
}
mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
}
您可以测试您的设备。
考虑Nexus One上的几个值。我在NexusOne上测试了您的应用程序,起初我只收到两个值10和225。但后来我把手机放在灯下,收到了很多价值观。但是,当传感器的分辨率为1f时,值集是有限的。我不知道为什么会发生这种情况。我只在Galaxy S2上测试过,但我能看到真实值的唯一方法是直接从系统设备文件中获取:
#cat "/sys/devices/virtual/lightsensor/switch_cmd/lightsensor_file_state"
或在java中:
Scanner st = new Scanner(new File("/sys/devices/virtual/lightsensor/switch_cmd/lightsensor_file_state"));
int lux = st.nextInt();
st.close();
对于这样一个复杂的问题,50个代表不是少了一点吗p@Michael当前位置你浪费了你的时间,是吗?如果你认为这种态度会让你在堆栈溢出上大受欢迎,那你就大错特错了。这款手机只有一个光传感器,它是由Capella Microsystems,Inc.制造的CM3663光传感器。这是意料之中的事,我想不出为什么一个设备会有两个或更多这样的传感器。在文档中我发现设备中可能有几个传感器。getDefaultSensor可以只返回第一个传感器,也可以制作一个假传感器,平均使用几个真实传感器。但是,试着把你的手机放在灯下,同时检查你的传感器的最大范围。我已经得到了传感器类型的列表。类型_LIGHT。如前所述,其中有一个条目。其最大范围为3000.0。当然我把手机放在强光下。它的读数是1000.0。这确实有效!非常感谢。我原以为它需要root权限,但事实并非如此。