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

问题描述:

过去已经完成了一些Android开发,但它已经有一段时间了 - 想要构建一个使用方向和接近传感器的应用程序。所以...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我可以得到它的方向传感器的TextView显示值(此电话不有一个接近传感器)

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

对不起,长的问题!但任何帮助将是一件好事,如果你需要更多的Infor只是问, LG手机是2.2的Nexus One是2.2.2 感谢,

大卫

+0

因此,我想要的东西是理所当然的 - 我为所有传感器设置了一个监听器,但似乎我需要两个监听器 - 一个用于定向,另一个用于Proximity – 2011-02-23 13:01:28

+0

我的印象是您可以使用相同的监听器。但是,请记住,方向传感器已弃用。 – CommonsWare 2011-02-23 13:03:43

+0

我读得很好,但Eclipse并未警告它? - 瞄准Android 2.1的应用程序 - 你知道如何快速使用.getOrientation? – 2011-02-25 20:50:16

您可以使用相同的监听所有传感器。 但如果你真的要听多甚至全部的传感器,你需要重写这一行:

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

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