how to measure ambient temperature in android
Asked Answered
A

4

12

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

Axel answered 16/8, 2012 at 12:28 Comment(1)
#11987634Inattentive
H
13

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;


public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private TextView temperaturelabel;
    private SensorManager mSensorManager;
    private Sensor mTemperature;
    private final static String NOT_SUPPORTED_MESSAGE = "Sorry, sensor not available for this device.";

    @Override
    protected void onCreate(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);
        }       
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

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

    @Override
    protected void onPause() {                 
        super.onPause();
        mSensorManager.unregisterListener(this);
    }


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

    @Override
    public void onAccuracyChanged(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

Hype answered 26/3, 2015 at 17:42 Comment(2)
Do you happen to know if there are phones that support this? or is this just for special devices?Gainly
Just some devices have temperature sensor.You can check by Sensor mTemperature= mSensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE); if mTemperature == null the device doesn´t have temperature sensor.Hype
S
3

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.

Sid answered 16/8, 2012 at 12:30 Comment(5)
but I have a application I downloaded from googleplay. it measures. how?Axel
maybe it is just contacting some server like accuweather and returning the city temperature based on your locationSid
@Sid : Forgive me if I am wrong but Ambient Temperature can be measured from API 14 and upwards. They introduced this in the ICS. Please have a look here : developer.android.com/guide/topics/sensors/…Schlegel
@Sid can u pls tell how u find current cpu level values ?Imagery
What is the status on this issue today? Is there a way to get the environment temp around the phone even if the phone does not have a thermometer sensor? I have read a lot on this and some say it is possible to get it combining battery/CPU temp? And some say it is not possible. What is the actual truth? What is the expert opinionMedial
S
2

Have a go at this code:

public class SensorActivity extends Activity, implements SensorEventListener {
 private final SensorManager mSensorManager;
 private final Sensor mTemp;

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

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

 protected void onPause() {
     super.onPause();
     mSensorManager.unregisterListener(this);
 }

 public void onAccuracyChanged(Sensor sensor, int accuracy) {
 }

 public void onSensorChanged(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

Schlegel answered 16/8, 2012 at 12:34 Comment(5)
Yes, you device needs to have a thermometer if you want to measure the temperature, right ?Schlegel
yes, right but I have heard there are some algorithm . they can create ambient temperature with using battery temperatureAxel
Forgive my ignorance, but I guess your battery would heat up according to the usage of your phone. If you are using your phone for a long time and accessing the web and running app that consume a lot of battery then your battery might get heated up. Now, the temperature of the battery goes up but the temperature of the room would remain the same. So, if you are trying to determine the temperature of the room by using the battery temperature, don't you think that you would get the ambient temperature much higher than the actual value ?Schlegel
you need to use Sensor.TYPE_AMBIENT_TEMPERATURE and not Sensor.TYPE_TEMPERATURE which is deprecatedSid
@Axel : Not a problem to help. :)Schlegel
I
0

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°C
    public Double closestTemperature = 500.0;
    public Long resetTime = 0L;
    public String 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 & BATTERY
        try
        {
       // 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 BATTERY
            Double batTemp = (double) batIntent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0) / 10;

       // CHECK IF DATA EXISTS
            if (cpuTemp != null)
            {
           // CPU FILE OK - CHECK LOWEST TEMP
                if (cpuTemp - averageRunningTemp < closestTemperature)
                    closestTemperature = cpuTemp - averageRunningTemp;
            }
            else if (batTemp != null)
            {
             // BAT OK - CHECK LOWEST TEMP
                if (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 & RETURN
        return 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

Inattentive answered 18/1, 2020 at 5:42 Comment(2)
If you start to dig into absolute file paths like "sys/class/thermal/thermal_zone1/temp" that's dangerous. You gonna run into crashes. It's better to seek a legitimate API.Felucca
You cannot guess the room's temperature based on a comparison between battery temp and CPU temp.Aleksandropol

© 2022 - 2024 — McMap. All rights reserved.