Thursday, August 30, 2012

Access temperature sensor, TYPE_TEMPERATURE and TYPE_AMBIENT_TEMPERATURE.

The temperature sensors (Sensor.TYPE_TEMPERATURE/Sensor.TYPE_AMBIENT_TEMPERATURE) are used to determine temperature of the phone, for internal hardware. They are not available on all device. (It's not available on my HTC One X and HTC Flyer!)

Sensor.TYPE_TEMPERATURE is deprecated, use Sensor.TYPE_AMBIENT_TEMPERATURE instead.

Example:
package com.example.androidsensor;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;

public class MainActivity extends Activity {
 
 TextView textTEMPERATURE_available, textTEMPERATURE_reading;
 TextView textAMBIENT_TEMPERATURE_available, textAMBIENT_TEMPERATURE_reading;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        textTEMPERATURE_available 
         = (TextView)findViewById(R.id.TEMPERATURE_available);
        textTEMPERATURE_reading 
         = (TextView)findViewById(R.id.TEMPERATURE_reading);
     textAMBIENT_TEMPERATURE_available 
      = (TextView)findViewById(R.id.AMBIENT_TEMPERATURE_available);
     textAMBIENT_TEMPERATURE_reading 
      = (TextView)findViewById(R.id.AMBIENT_TEMPERATURE_reading);
     
     SensorManager mySensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
     
     Sensor TemperatureSensor = mySensorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE);
     if(TemperatureSensor != null){
      textTEMPERATURE_available.setText("Sensor.TYPE_TEMPERATURE Available");
      mySensorManager.registerListener(
        TemperatureSensorListener, 
        TemperatureSensor, 
        SensorManager.SENSOR_DELAY_NORMAL);
      
     }else{
      textTEMPERATURE_available.setText("Sensor.TYPE_TEMPERATURE NOT Available");
     }
     
     Sensor AmbientTemperatureSensor 
      = mySensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);
     if(AmbientTemperatureSensor != null){
      textAMBIENT_TEMPERATURE_available.setText("Sensor.TYPE_AMBIENT_TEMPERATURE Available");
      mySensorManager.registerListener(
        AmbientTemperatureSensorListener, 
        AmbientTemperatureSensor, 
        SensorManager.SENSOR_DELAY_NORMAL);
     }else{
      textAMBIENT_TEMPERATURE_available.setText("Sensor.TYPE_AMBIENT_TEMPERATURE NOT Available");
     }
    }
    
    private final SensorEventListener TemperatureSensorListener
     = new SensorEventListener(){

   @Override
   public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // TODO Auto-generated method stub
    
   }

   @Override
   public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_TEMPERATURE){
     textTEMPERATURE_reading.setText("TEMPERATURE: " + event.values[0]);
    }
   }
     
    };
    
    private final SensorEventListener AmbientTemperatureSensorListener
     = new SensorEventListener(){

   @Override
   public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // TODO Auto-generated method stub
   
   }

   @Override
   public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_AMBIENT_TEMPERATURE){
     textAMBIENT_TEMPERATURE_reading.setText("AMBIENT TEMPERATURE: " + event.values[0]);
    }
   }
 
    };

}


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        tools:context=".MainActivity" />
    
    <TextView
        android:id="@+id/TEMPERATURE_available"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/TEMPERATURE_reading"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/AMBIENT_TEMPERATURE_available"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/AMBIENT_TEMPERATURE_reading"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>


Related:
- Determine light level, Sensor.TYPE_LIGHT.

4 comments:

Anonymous said...

Hi, here http://developer.android.com/guide/topics/sensors/sensors_overview.html sad that TYPE_AMBIENT_TEMPERATURE is used for the ambient room temperature and TYPE_TEMPERATURE is used for the temperature of the device, is it correct? Thanks.

Anonymous said...

Awesome! Very helpful, clear, and thorough, thank you!

Erik said...

No, this one for internal sensor only (if available)

Unknown said...

Hi,

how can I change the temperature reading of the battery, my phone is not charging due to a low temperature, i replaced the charging port and the battery but still same error