Как измерить температуру окружающей среды в Android

Я хочу измерить температуру окружающей среды на устройстве Android. но мое устройство не включает датчик термометра. Как я могу это измерить? Благодарю.

3 ответа

Это основной пример того, как получить температуру окружающей среды в 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.
    }
}

Вы можете скачать полный пример с: https://github.com/Jorgesys/Android_Ambient_Temperature

Это не может быть сделано. Датчик температуры, даже если существует, если для температуры батареи и температуры процессора.

Редактировать: как указывал swayam, в API 14 добавлен датчик температуры окружающей среды, но в документе о совместимости пряников явно сказано, что измерение температуры не следует включать

Реализации устройства МОГУТ, но НЕ СЛЕДУЕТ включать термометр (т. Е. Датчик температуры). Если реализация устройства содержит термометр, она ДОЛЖНА измерять температуру ЦП устройства. НЕ ДОЛЖЕН измерять любую другую температуру. (Обратите внимание, что этот тип датчика устарел в API Android 2.3.)

Но большинство телефонов включают только датчик измерения температуры процессора Sensor.TYPE_TEMPERATURE что устарело. Так что это не дает точную температуру. Вы должны использовать Sensor.TYPE_AMBIENT_TEMPERATURE что я не думаю, что многие телефоны имеют.

Попробуйте этот код:

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) {
 }

Кроме того, вы можете просмотреть документацию SensorManager здесь: http://developer.android.com/reference/android/hardware/SensorManager.html

Подробнее о датчиках здесь:

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

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

Android 5.0

Использование процессора и батареи для увеличения температуры окружающей среды

  • *** Сначала получите средний беговой жар

    1. Найти реальную температуру и удалить температуру процессора холодного устройства

      • Например. 40°C - 29°C = 11°C рабочая температура
    2. Получите температуру батареи и сравните с температурой процессора

      • аккумулятор> cpu = зарядка / удержание / не используется
      • батарея
    3. Рассчитайте минимальное значение за 30 минут

    4. Рассчитать разницу тепла в сравнении

      • Использование = averageTemp - 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);
    }

Я уже знаю, что обход таких ограниченных папок не рекомендуется, однако температура процессора всегда возвращается в виде твердой степени, мне нужны полные десятичные разряды - поэтому я использовал этот довольно хакерский подход для обхода ограничений с помощью RandomAccessFile

Пожалуйста, не комментируйте, говоря: это невозможно, я знаю, что невозможно полностью определить температуру окружающей среды с помощью этой техники, однако через много дней мне удалось добиться ее точности до 2°C.

Моя средняя температура была на 11°C выше реальной температуры

Делая мое использование,

getAmbientTemperature(11,30);

11 - средняя температура

30 - время следующего сброса (период минимальной проверки)

ПРИМЕЧАНИЯ.• Проверка времени работы экрана может помочь рассчитать изменения тепла с течением времени.
• Проверка акселерометра может помочь предложить пользователю положить телефон в пол, чтобы охладить процессор и аккумулятор для повышения точности.
• Для получения разрешений необходимо добавить поддержку Android 5.0+.

2°C Точность на моем устройстве

Другие вопросы по тегам