A Day In The Life

とあるプログラマの備忘録

Dev Phoneの温度センサはバッテリーの温度を測っているらしい。

Android(HTC Dev Phoneで検証、G1では未検証)の温度センサを試してみました。
気温20℃で33と表示されるのでなんかおかしいと思い、いろいろ調べてみるとインテントレシーバでバッテリーの温度が取れるらしいこと発見しました。もしやこれはセンサーの温度計を使ってるんじゃないかと思いインテントレシーバで取れる温度とセンサーで取れる温度を比べてみました。

public class TemperatureActivity extends Activity 
    implements SensorEventListener {
  TextView intentText;
  TextView sensorText;
  private SensorManager sensorManager;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    intentText = (TextView)findViewById(R.id.intent);
    sensorText = (TextView)findViewById(R.id.sensor);
    sensorManager = (SensorManager)this.getSystemService(SENSOR_SERVICE);
  }
  @Override
  protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_BATTERY_CHANGED);
    registerReceiver(mBroadcastReceiver, filter);
    //
    List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_TEMPERATURE);
    sensorManager.registerListener(this, sensors.get(0), SensorManager.SENSOR_DELAY_UI);
  }

  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
      int temperature = intent.getIntExtra("temperature", 0);
      intentText.setText("Temperature by Intent:" + temperature/10.0);
    }
  }
  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
    //
  }
  @Override
  public void onSensorChanged(SensorEvent e) {
    if (e.sensor.getType() == Sensor.TYPE_TEMPERATURE) {
      TextView x = (TextView)findViewById(R.id.sensor);
      x.setText("Temperature by Sensor:" + String.valueOf(e.values[SensorManager.DATA_X]));
    }
  }
  @Override
  protected void onPause() {
    super.onPause();
    unregisterReceiver(mBroadcastReceiver);
  }
  private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
     if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
        int temperature = intent.getIntExtra("temperature", 0);
        intentText.setText("Temperature by Intent:" + temperature/10.0);
      }
    }
  };
}

2009年5月9日17時55分に計測
2009年5月9日17時55分に計測

2009年5月9日17時56分に計測
2009年5月9日17時56分に計測
結果はほとんど同じでした。センサで取得した値にローパスフィルタかけてインテント飛ばしてるのではないかと思います。
今のところ確証はないです。APIドキュメントにも端末の仕様にも何も書いてないし...。