2011-02-23 2 views
1

과거에는 Android Dev를 사용해 왔지만 오리엔테이션 및 근접 센서를 사용하는 앱을 만들고 싶습니다. 그래서 ...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에 - 나는 그것이 방향 센서의 TextViews의 값을 표시하기 위해 얻을 수있는이 휴대 전화는하지 않습니다 (내 LG 옵티머스 원에

위 참조 근접 센서 있음)

Nexus One에서 동일한 코드를 실행하면 멋진 빈 화면이 나타납니다.

대단히 죄송합니다. 하지만 어떤 도움이 좋은 당신이 더 INFOR 필요하면 그냥 물어 보곤, LG 폰은 하나는 2.2.2 감사합니다 2.2 넥서스,

데이비드

+0

So .. 나는 모든 센서에 대해 하나의 청취자를 설정하고 있었지만 두 청취자가 필요했습니다. 하나는 오리엔테이션 용이고 다른 하나는 근접 용입니다. –

+0

나는 동일한 청취자를 사용할 수 있다는 인상하에있었습니다. 그러나 오리엔테이션 센서는 더 이상 사용되지 않습니다. – CommonsWare

+0

나는 그것을 읽었다. 그러나 Eclipse는 그것에 대해 경고하지 않는다? - Android 2.1 용 앱을 겨냥하고있었습니다. - .getOrientation을 빠르게 사용하는 방법을 알고 계십니까? –

답변

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)과 함께 사용 가능한 모든 센서 목록을 받아서 목록을 반복해야합니다.

배터리 절약에 관한 질문은 센서가 영구적으로 작동하는지 모르겠습니다. 이 경우에도 불필요한 처리를 줄임으로써 배터리 전력을 절약 할 수 있습니다. 특정 센서가 제공하는 정보가 필요하지 않은 경우 등록하지 말고 메시지를 수신하십시오. 이렇게하면 응용 프로그램으로 보내는 메시지가 줄어 듭니다.

관련 문제