2011-02-23 142 views
1

過去已經完成了一些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

回答

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)的所有傳感器,並遍歷列表,以便分別註冊每個包含的傳感器。

關於你關於節約電池的問題 - 我不知道,如果傳感器永久運行。即使是這種情況,也可以通過減少不必要的處理來節省電池電量。如果您不需要特定傳感器提供的信息,請不要註冊接收來自它的消息。這減少了發送到您的應用程序的消息。