过去做过一些Android Dev但已经有一段时间了 - 想要构建一个使用Orientation和Proximity Sensors的应用程序。所以...
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ALL) , SensorManager.SENSOR_DELAY_GAME);
所以设置听众 - 听取所有传感器 - 我想知道我应该听两个吗? (这会省电吗?)
Sensor mySensor = event.sensor;
// if (mySensor.getType() != Sensor.TYPE_ORIENTATION) return;
if (mySensor.getType() == Sensor.TYPE_ORIENTATION)
{
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
tv.setText("Rotation around X, Azimuth = " + x);
tv1.setText("Rotation around Y, Pitch = " + y);
tv2.setText("Rotation around Z, Roll = " + z);
}
if (mySensor.getType() == SensorManager.SENSOR_PROXIMITY)
{
float p = event.values[0];
tv3.setText("Proximity = " + p);
}
然后在onSensorChanged上 - 见上文
在我的LG Optimus One上我可以让它在Orientation传感器的TextViews中显示值(这款手机没有接近传感器)
但是在我的Nexus One上运行相同的代码会导致可爱的空白屏幕!?
很抱歉这个问题很长!但任何帮助都会很好,如果你需要更多信息,请问, LG手机是2.2 Nexus One是2.2.2 谢谢,
大卫
答案 0 :(得分:1)
您可以为所有传感器使用相同的侦听器。 但如果你真的想听多个甚至所有传感器,你需要重写这一行:
mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ALL) , SensorManager.SENSOR_DELAY_GAME);
因为getDefaultSensor(int type)
的实际实现只返回一个传感器,如源代码所示:
public Sensor getDefaultSensor(int type) {
// TODO: need to be smarter, for now, just return the 1st sensor
List<Sensor> l = getSensorList(type);
return l.isEmpty() ? null : l.get(0);
}
public List<Sensor> getSensorList(int type) {
// cache the returned lists the first time
List<Sensor> list;
final ArrayList<Sensor> fullList = sFullSensorsList;
synchronized(fullList) {
list = sSensorListByType.get(type);
if (list == null) {
if (type == Sensor.TYPE_ALL) {
list = fullList;
} else {
list = new ArrayList<Sensor>();
for (Sensor i : fullList) {
if (i.getType() == type)
list.add(i);
}
}
list = Collections.unmodifiableList(list);
sSensorListByType.append(type, list);
}
return list;
}
在Sensor.TYPE_ALL
的情况下,方法getSensorList(int type)
提供了所有可用传感器的(无序)列表,而getDefaultSensor(int type)
仅返回其中的第一个传感器。
由于包含所有传感器的列表是无序的,因此getDefaultSensor(Sensor.TYPE_ALL)提供随机传感器。我尝试了它,然后首先得到了加速度计,下次是光传感器。由于您只处理侦听器中的方向和接近度更改,我怀疑getDefaultSensor(Sensor.TYPE_ALL)在您的Nexus上提供了不同的传感器。
您应该会收到mSensorManager.getSensorList(Sensor.TYPE_ALL)
可用的所有传感器的列表,并遍历列表,以便分别注册每个包含的传感器。
关于节省电池的问题 - 我不知道传感器是否永久运行。即使是这种情况,也可以通过减少不必要的处理来节省电池电量。如果您不需要特定传感器提供的信息,请不要注册以接收来自它的消息。这会减少发送到您的应用程序的消息。