如何在android中测量环境温度

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11987134/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 09:23:20  来源:igfitidea点击:

how to measure ambient temperature in android

androidtemperatureambient

提问by Furkan

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

我想在 android 设备上测量环境温度。但我的设备不包括温度计传感器。我该如何衡量?谢谢。

回答by Jorgesys

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

这是如何在 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

您可以从以下位置下载完整示例:https: //github.com/Jorgesys/Android_Ambient_Temperature

回答by nandeesh

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

这是无法做到的。温度传感器即使存在电池温度和cpu温度。

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

编辑:正如 swayam 指出的那样,API 14 中添加了环境温度传感器,但姜饼兼容性文件明确表示不包括温度测量

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.)

设备实现可以但不应该包含温度计(即温度传感器)。如果设备实现确实包含温度计,则它必须测量设备 CPU 的温度。它不得测量任何其他温度。(请注意,此传感器类型在 Android 2.3 API 中已弃用。)

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

但大多数手机仅包含Sensor.TYPE_TEMPERATURE已弃用的CPU 温度测量传感器。所以这不能给出准确的温度。你应该使用Sensor.TYPE_AMBIENT_TEMPERATURE我认为很多手机都没有的。

回答by Swayam

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 SensorManagerhere : http://developer.android.com/reference/android/hardware/SensorManager.html

另外,您可以在此处浏览SensorManager的文档: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_overview.html

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

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

回答by Gadget Guru

Android 5.0

安卓 5.0

Using CPU & Battery to gain Ambient Temperature

使用 CPU 和电池获得环境温度

  • ***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
  • ***首先获得平均运行热度

    1. 查找真实温度并删除冷设备 CPU 温度

      • 例如。40°C - 29°C = 11°C 运行温度
    2. 获取电池温度并与 CPU 温度进行比较

      • 电池 > cpu = 充电/保持/不使用
      • 电池 < cpu = 密集的 CPU 任务/使用
    3. 计算 30 分钟内的最低读数

    4. 计算比较热差

      • 使用 = 平均温度 - 3°C
      • 不使用 = 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

我已经知道不建议绕过这样的受限文件夹,但是 CPU 温度总是作为一个可靠的度数返回,我需要完整的小数位 - 所以我使用了这种相当笨拙的方法来绕过使用 RandomAccessFile 的限制

请不要评论说 - 这是不可能的,我知道使用这种技术不可能完全检测到周围的温度,但是在很多天之后 - 我已经设法让它达到 2°C 的准确度

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

我的平均热量比实际温度高 11°C

Making my Usage,

使我的用法,

getAmbientTemperature(11,30);

getAmbientTemperature(11,30);

11 being Average Temperature

11 是平均温度

30 being Next Reset Time ( Period of minimum check )

30 是下一次重置时间(最小检查周期)

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

笔记,?检查屏幕正常运行时间可以帮助计算随时间的热量变化
吗?检查加速度计可以帮助建议用户将手机放下以冷却 CPU 和电池以提高准确性。
? 需要为权限添加 Android 5.0+ 支持

2°C Accuracy on my device

我的设备上的 2°C 精度