我想在安卓设备上测量环境温度,但我的设备没有温度计传感器。我该如何测量?谢谢。
我想在安卓设备上测量环境温度,但我的设备没有温度计传感器。我该如何测量?谢谢。
这是一个获取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
但大多数手机只包括cpu温度测量传感器设备实现可以但不应该包括温度计(即温度传感器)。如果设备实现确实包括温度计,则必须测量设备CPU的温度。它不能测量任何其他温度。(请注意,此传感器类型在Android 2.3 API中已弃用。)
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
***首先获取平均运行热量
找到实际温度并去除冷设备CPU温度
获取电池温度并与CPU温度进行比较
计算30分钟内的最低读数
计算比较热差异
`
// 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);
}
"sys/class/thermal/thermal_zone1/temp"
这样的绝对文件路径,那是很危险的。你会遇到崩溃。最好寻找一个合法的API。 - Csaba Toth