1

过去做过一些 Android 开发,但已经有一段时间了 - 想要构建一个使用方向和接近传感器的应用程序。所以...

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 上,我可以让它显示方向传感器的 TextViews 中的值(这款手机没有接近传感器)

但是在我的 Nexus One 上运行相同的代码会导致一个可爱的空白屏幕!?

对不起,很长的问题!但任何帮助都会很好,如果您需要更多信息,请询问,LG 手机是 2.2 Nexus One 是 2.2.2 谢谢,

大卫

4

1 回答 1

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

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

于 2011-03-12T20:59:35.947 回答