Skip to content Skip to sidebar Skip to footer

How To Measure Ambient Temperature In Android

I want to measure ambient temperature on android device. but my device doesn t include thermometer sensor. How can I measure it? Thanks.

Solution 1:

this is a basic example of how to get the Ambient Temperature in Android:

import android.support.v7.app.AppCompatActivity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Build;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;


publicclassMainActivityextendsAppCompatActivityimplementsSensorEventListener {

    privateTextView temperaturelabel;
    privateSensorManager mSensorManager;
    privateSensor mTemperature;
    private final staticStringNOT_SUPPORTED_MESSAGE = "Sorry, sensor not available for this device.";

    @OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        temperaturelabel = (TextView) findViewById(R.id.myTemp);
        mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.ICE_CREAM_SANDWICH){
            mTemperature= mSensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE); // requires API level 14.
        }
        if (mTemperature == null) {             
            temperaturelabel.setText(NOT_SUPPORTED_MESSAGE);
        }       
    }

    @OverridepublicbooleanonCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        returntrue;
    }

    @OverridepublicbooleanonOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            returntrue;
        }
        returnsuper.onOptionsItemSelected(item);
    }

    @OverrideprotectedvoidonResume() {
        super.onResume();
        mSensorManager.registerListener(this, mTemperature, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @OverrideprotectedvoidonPause() {                 
        super.onPause();
        mSensorManager.unregisterListener(this);
    }


    @OverridepublicvoidonSensorChanged(SensorEvent event) {
        float ambient_temperature = event.values[0];
        temperaturelabel.setText("Ambient Temperature:\n " + String.valueOf(ambient_temperature) + getResources().getString(R.string.celsius));     
    }

    @OverridepublicvoidonAccuracyChanged(Sensor sensor, int accuracy) {
        // Do something here if sensor accuracy changes.
    }
}

you can download the complete example from : https://github.com/Jorgesys/Android_Ambient_Temperature

Solution 2:

This cannot be done. The temperature sensor even if exists if for the battery temperature and cpu temperature.

Edit: As swayam pointed out there is Ambient Temperature sensor added in API 14 but gingerbread compatibility document explicitly says not to include temperature measurement

Device implementations MAY but SHOULD NOT include a thermometer (i.e. temperature sensor.) If a device implementation does include a thermometer, it MUST measure the temperature of the device CPU. It MUST NOT measure any other temperature. (Note that this sensor type is deprecated in the Android 2.3 APIs.)

But most phones only include cpu temperature measurement sensor Sensor.TYPE_TEMPERATURE which is deprecated. So this does not give accurate temperature. You should use Sensor.TYPE_AMBIENT_TEMPERATURE which I dont think many phones have.

Solution 3:

Have a go at this code:

publicclassSensorActivityextendsActivity, implementsSensorEventListener {
 privatefinal SensorManager mSensorManager;
 privatefinal Sensor mTemp;

 publicSensorActivity() {
     mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
     mtemp = mSensorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE);
 }

 protectedvoidonResume() {
     super.onResume();
     mSensorManager.registerListener(this, mTemp, SensorManager.SENSOR_DELAY_NORMAL);
 }

 protectedvoidonPause() {
     super.onPause();
     mSensorManager.unregisterListener(this);
 }

 publicvoidonAccuracyChanged(Sensor sensor, int accuracy) {
 }

 publicvoidonSensorChanged(SensorEvent event) {
 }

Plus you can go through the documentation of the SensorManager here : http://developer.android.com/reference/android/hardware/SensorManager.html

More about sensors here :

http://developer.android.com/guide/topics/sensors/sensors_overview.html

http://developer.android.com/guide/topics/sensors/sensors_environment.html

Solution 4:

Android 5.0

Using CPU & Battery to gain Ambient Temperature

  • ***Get Average Running Heat First

    1. Find real temperature & remove Cold Device CPU Temperature

      • Eg. 40°C - 29°C = 11°C Running Temperature
    2. Get Battery Temperature & Compare with CPU Temperature

      • battery > cpu = Charging/Holding/No Usage
      • battery < cpu = Intensive CPU Task / Usage
    3. Calculate Lowest Reading Over 30 Minutes

    4. Calculate Comparison Heat Difference

      • Using = averageTemp - 3°C
      • No Usage = averageTemp

`

// EXAMPLE ONLY - RESET HIGHEST AT 500°CpublicDouble closestTemperature = 500.0;
    public Long resetTime = 0L;
    publicString getAmbientTemperature(int averageRunningTemp, int period)
    {
    // CHECK MINUTES PASSED ( STOP CONSTANT LOW VALUE )  Boolean passed30 = ((System.currentTimeMillis() - resetTime) > ((1000 * 60)*period));
        if (passed30)
        {
            resetTime = System.currentTimeMillis();
            closestTemperature = 500.0;
        }

    // FORMAT DECIMALS TO 00.0°C
        DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
        dfs.setDecimalSeparator('.');
        DecimalFormat decimalFormat = new DecimalFormat("##.0", dfs);

    // READ CPU & BATTERYtry
        {
       // BYPASS ANDROID RESTRICTIONS ON THERMAL ZONE FILES & READ CPU THERMAL

            RandomAccessFile restrictedFile = new RandomAccessFile("sys/class/thermal/thermal_zone1/temp", "r");
            Double cpuTemp = (Double.parseDouble(restrictedFile.readLine()) / 1000);

        // RUN BATTERY INTENT
            Intent batIntent = this.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));    
       // GET DATA FROM INTENT WITH BATTERYDouble batTemp = (double) batIntent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0) / 10;

       // CHECK IF DATA EXISTSif (cpuTemp != null)
            {
           // CPU FILE OK - CHECK LOWEST TEMPif (cpuTemp - averageRunningTemp < closestTemperature)
                    closestTemperature = cpuTemp - averageRunningTemp;
            }
            elseif (batTemp != null)
            {
             // BAT OK - CHECK LOWEST TEMPif (batTemp - averageRunningTemp < closestTemperature)
                    closestTemperature = batTemp - averageRunningTemp;
            }
            else
            {
            // NO CPU OR BATTERY TEMP FOUND - RETURN 0°C
                closestTemperature = 0.0;
            }
        }
        catch (Exception e)
        {
            // NO CPU OR BATTERY TEMP FOUND - RETURN 0°C
            closestTemperature = 0.0;
        }
     // FORMAT & RETURNreturn decimalFormat.format(closestTemperature);
    }

I already know that bypassing restricted folders like this is not recommended, however the CPU temperature is always returned as a solid Degree, i need the full decimal places - So I've used this rather hacky approach to bypass restrictions using RandomAccessFile

Please do not comment saying - It's not possible, i know it isn't fully possible to detect the surrounding temperature using this technique, however after many days - I've managed to get it to 2°C Accuracy

My Average Heat was 11°C higher than the real temperature

Making my Usage,

getAmbientTemperature(11,30);

11 being Average Temperature

30 being Next Reset Time ( Period of minimum check )

NOTES, • Checking Screen UpTime can help to calculate heat changes over time • Checking Accelerometer can help to suggest the user Places the phone down to Cool the CPU & Battery for an increased accuracy. • Android 5.0+ Support needs to be added for Permissions

2°C Accuracy on my device

Post a Comment for "How To Measure Ambient Temperature In Android"