How To Measure Ambient Temperature In Android
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
Find real temperature & remove Cold Device CPU Temperature
- Eg. 40°C - 29°C = 11°C Running Temperature
Get Battery Temperature & Compare with CPU Temperature
- battery > cpu = Charging/Holding/No Usage
- battery < cpu = Intensive CPU Task / Usage
Calculate Lowest Reading Over 30 Minutes
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"