Android传感器 - 获取接近传感器的问题值和使用不同手机的问题

时间:2011-02-23 11:51:49

标签: android accelerometer sensor proximity

过去做过一些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 谢谢,

大卫

1 个答案:

答案 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)可用的所有传感器的列表,并遍历列表,以便分别注册每个包含的传感器。

关于节省电池的问题 - 我不知道传感器是否永久运行。即使是这种情况,也可以通过减少不必要的处理来节省电池电量。如果您不需要特定传感器提供的信息,请不要注册以接收来自它的消息。这会减少发送到您的应用程序的消息。