Android温度计

Android高度計

設計手機高度計!外出旅遊必備!

利用手機的氣壓傳感器,計算當前海拔高度!

安桌手機的通常帶有氣壓的監聽器

1.獲取感測器管理器

Sensor_Manager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);

2.判斷是否有氣壓計,這個判斷很種要,如過返回則代表沒有可用的感測器!

if(Sensor_Manager.getSensorList(Sensor.TYPE_PRESSURE).size() == 0)

return false;

3.獲取默認的氣壓計

Pressure_Sensor = Sensor_Manager.getDefaultSensor(Sensor.TYPE_PRESSURE);

或者獲取的首個氣壓計

Pressure_Sensor = Sensor_Manager.getSensorList(Sensor.TYPE_PRESSURE).get(0);

4.生成氣監聽器

Pressure_Listener = new PressureListener();

5.註冊感測器事件

Sensor_Manager.registerListener(Pressure_Listener, Pressure_Sensor, SensorManager.SENSOR_DELAY_UI);

6.創建氣壓的監聽器類,用於獲取氣壓!

static class PressureListener implements SensorEventListener{

7.氣壓盤改變

@Override

public void onSensorChanged(SensorEvent event)

{

Pressure = event.values[0]; //獲取氣壓

}

}

8.氣壓轉高度

每上升12米,氣壓計中的水銀柱下降1毫米,

hPa是百帕

在海平面的平均氣壓 約為1013.25百帕斯卡(760毫米水銀柱),這個值也被稱為標準大氣壓

1百帕=1毫巴=3/4毫米水銀柱

所以901HPA(氣壓)

901HPA=901*3/4=682.5MM水銀柱

760-682.5=77.5MM

77.5*12=930米

public static float PressureToAltitude(float Pressure)

{

float Altitude = 0;// 高度

float PRESSURE_STANDARD_ATMOSPHERE = 1013.25f;// 在海平面的平均氣壓(百帕斯卡)

 

// 轉換為水銀柱

Altitude = (float) (44330000f* (1f- Math.pow( Pressure/PRESSURE_STANDARD_ATMOSPHERE, 1.0f/5255.0f )));

return Altitude;

}

 

10.退出應用時釋放感測器監聽

Sensor_Manager.unregisterListener(Pressure_Listener);

//米轉英尺

static float m2ft(float m)

{

float ft=0;

ft = m * 3.2808398950131f;

return ft;

}

 

//米轉英尺

static float ft2m(float ft)

{

float m=0;

m = ft * 0.3048f;

return m;

}

沒有氣壓傳感器則通過GPS確定高度,後續.

Android分贝仪

android分贝仪
邻居的音响影响你的睡眠?工地的噪音影响你的听力?
利用手机的咪克风,测量声音强度.
你需要android的录音AudioRecord接收声音
static android.media.AudioRecord          Audio_Record;
每个采样单位所占空间
static int BitsPerSample = 16;
设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025
static int    Audio_Frequency = 44100;音频采样率
设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道
设置声道配置-单声道,双声道除非你有两个咪克风,否则无意义.
static int    Audio_Channel   = AudioFormat.CHANNEL_CONFIGURATION_MONO;
static int    Audio_Channel_Count = 1;// 一个声道
static int    Audio_Encoding  =  AudioFormat.ENCODING_PCM_16BIT;// 音频编码
static byte   Audio_Buffer[];
static int    Audio_Buffer_Size;

1.计算缓冲的大小
Audio_Buffer_Size = android.media.AudioRecord.getMinBufferSize(Audio_Frequency, Audio_Channel, Audio_Encoding);
2.分配内存空间
Audio_Buffer = new byte[Audio_Buffer_Size];
3.分配录音对象
Audio_Record = new android.media.AudioRecord(MediaRecorder.AudioSource.MIC,
Audio_Frequency, Audio_Channel, Audio_Encoding,
Audio_Buffer_Size);
4.启动录音
Audio_Record.startRecording();
5.退出时要释放资源
Audio_Record.stop();// 停止
Audio_Record.release();// 释放

读取音频数据
size = Audio_Record.read(Audio_Buffer,0, Audio_Buffer_Size);
if(size == android.media.AudioRecord.ERROR_INVALID_OPERATION )
return true;
v = 0;
Audio_Size = Audio_Size + size;// 文件的大小

for(int i=0;i<size;i=i+2)
{
value = (Audio_Buffer[i+1] << 8) + Audio_Buffer[i];
v = v + (value * value);
}
平方和除以数据总长度,得到音量大小。
mean = v /(double)(size);  // 音量
最后计算分贝
Decibel_Val = 10 * Math.log10(mean);

创建新的线程
Audio_Thread = new Thread(new Runnable() {
public void run() {
while(Audio_State == STATE_RUN)
{
Read(); // 读取

}

Audio_Record.stop();// 停止
Audio_Record.release();// 释放
Audio_Record = null;
Audio_Thread = null;
}} );

Android罗盘又稱指南針,指北針

罗盘
罗盘又稱指南針,指北針,遊行必備,尋找目的地的方位!
支持磁偏角,真北极与磁北极之间转换!
偏航度:0-360
傾斜度:-90 ~ +90
橫搖度:-180 ~ +180
利用安桌手机的加速度传感器与磁场传感器,我在这里同时注册两个传感器.
1.获取传感器管理器
Sensor_Manager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
2.创建罗盘监听器对像
Compass_Listener = new CompassListener();
3.判断是否有加速度计
if(Sensor_Manager.getSensorList(Sensor.TYPE_ACCELEROMETER).size() == 0)
return false;
4.获取第一个加速度计
Sensor_Accelerometer = Sensor_Manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
或着获取默认的加速度计
Sensor_Accelerometer = Sensor_Manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
5.注册传感器事件
Sensor_Manager.registerListener(Compass_Listener, Sensor_Accelerometer, SensorManager.SENSOR_DELAY_UI);

6.判断是否有磁场传感器
if(Sensor_Manager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD).size() == 0)
return false;
7.获取第一个磁场传感器
Sensor_Magnetic = Sensor_Manager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD).get(0);
或着获取默认的磁场传感器
Sensor_Magnetic = Sensor_Manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
5.注册传感器事件
Sensor_Manager.registerListener(Compass_Listener, Sensor_Magnetic, SensorManager.SENSOR_DELAY_UI);
退出时释放传感器监听
Sensor_Manager.unregisterListener(Compass_Listener);
Sensor_Manager.unregisterListener(Sensor_Manager);

6.生成罗盘的监听器
static class CompassListener implements SensorEventListener{
7.罗盘改变
@Override
public void onSensorChanged(SensorEvent event)
{
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
{
Accelerometer_Values = event.values.clone();// 获取重力
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
GetAcceleration(x,y,z);// 获取重力
}
else
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
{
Magnetic_Values = event.values.clone();  // 获取磁场
}
GetYaw();// 偏航度
GetPitch(); // 倾斜度
GetRoll();//  横摇度
//发送选择通知
notifyVisibility();
}
}

public static float Yaw=0;// 偏航度
public static float Pitch=0;//倾斜度
public static float Roll=0;//  横摇度

static float[] inR = new float[9];
static float[] outR = new float[9];
static float[] V = new float[3];

计算横摇度
倾斜度为0度时横摇度最准确
获取旋转矩阵
SensorManager.getRotationMatrix(inR, null,Accelerometer_Values,Magnetic_Values);
获取设备的方向
Window_Manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
display = Window_Manager.getDefaultDisplay();
if(SYSTEM.GetVersion() >= 8)
rotation = display.getRotation();
else
rotation = display.getOrientation();
与设备的方向配合修正方向,省略.
x_axis = SensorManager.AXIS_X;
y_axis = SensorManager.AXIS_Y;
校正后的方向
SensorManager.remapCoordinateSystem(inR, x_axis, y_axis, outR);
提取弧度
SensorManager.getOrientation(outR, V);
弧度转为角度,横摇度
Roll =  (float) Math.toDegrees(V[2]);

获取倾斜度
获取旋转矩阵
SensorManager.getRotationMatrix(inR, null,Accelerometer_Values,Magnetic_Values);
获取设备的方向
Window_Manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
display = Window_Manager.getDefaultDisplay();
if(SYSTEM.GetVersion() >= 8)
rotation = display.getRotation();
else
rotation = display.getOrientation();
与设备的方向配合修正方向,省略.
x_axis = SensorManager.AXIS_X;
y_axis = SensorManager.AXIS_MINUS_Z;

校正后的方向
SensorManager.remapCoordinateSystem(inR, x_axis, y_axis, outR);
提取弧度
SensorManager.getOrientation(outR, V);
弧度转为角度
Pitch = (float) Math.toDegrees(V[1]);

获取偏航度
获取旋转矩阵
SensorManager.getRotationMatrix(inR, null,Accelerometer_Values,Magnetic_Values);
获取设备的方向
Window_Manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
display = Window_Manager.getDefaultDisplay();
if(SYSTEM.GetVersion() >= 8)
rotation = display.getRotation();
else
rotation = display.getOrientation();
与设备的方向配合修正方向,省略.
x_axis = SensorManager.AXIS_Y;
y_axis = SensorManager.AXIS_MINUS_X;
校正后的方向
SensorManager.remapCoordinateSystem(inR, x_axis, y_axis, outR);
提取弧度
SensorManager.getOrientation(outR, V);
弧度转为角度
Yaw = (float) Math.toDegrees(V[0]);
磁北极=正北极+偏磁角
正北极=磁北极-偏磁角
Yaw = Yaw – GPSService.Declination;

http://shouji.baidu.com/software/8452414.html

Android高度計

設計手機高度計!外出旅遊必備!
利用手機的氣壓傳感器,計算當前海拔高度!
安桌手機的通常帶有氣壓的監聽器
1.獲取感測器管理器
Sensor_Manager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
2.判斷是否有氣壓計,這個判斷很種要,如過返回則代表沒有可用的感測器!
if(Sensor_Manager.getSensorList(Sensor.TYPE_PRESSURE).size() == 0)
return false;
3.獲取默認的氣壓計
Pressure_Sensor = Sensor_Manager.getDefaultSensor(Sensor.TYPE_PRESSURE);
或者獲取的首個氣壓計
Pressure_Sensor = Sensor_Manager.getSensorList(Sensor.TYPE_PRESSURE).get(0);
4.生成氣監聽器
Pressure_Listener = new PressureListener();
5.註冊感測器事件
Sensor_Manager.registerListener(Pressure_Listener, Pressure_Sensor, SensorManager.SENSOR_DELAY_UI);
6.創建氣壓的監聽器類,用於獲取氣壓!
static class PressureListener implements SensorEventListener{
7.氣壓盤改變
@Override
public void onSensorChanged(SensorEvent event)
{
Pressure = event.values[0]; //獲取氣壓
}
}
8.氣壓轉高度
每上升12米,氣壓計中的水銀柱下降1毫米,
hPa是百帕
在海平面的平均氣壓 約為1013.25百帕斯卡(760毫米水銀柱),這個值也被稱為標準大氣壓
1百帕=1毫巴=3/4毫米水銀柱
所以901HPA(氣壓)
901HPA=901*3/4=682.5MM水銀柱
760-682.5=77.5MM
77.5*12=930米
public static float PressureToAltitude(float Pressure)
{
float Altitude = 0;// 高度
float PRESSURE_STANDARD_ATMOSPHERE = 1013.25f;// 在海平面的平均氣壓(百帕斯卡)

// 轉換為水銀柱
Altitude = (float) (44330000f* (1f- Math.pow( Pressure/PRESSURE_STANDARD_ATMOSPHERE, 1.0f/5255.0f )));
return Altitude;
}

10.退出應用時釋放感測器監聽
Sensor_Manager.unregisterListener(Pressure_Listener);

//米轉英尺
static float m2ft(float m)
{
float ft=0;
ft = m * 3.2808398950131f;
return ft;
}

//米轉英尺
static float ft2m(float ft)
{
float m=0;
m = ft * 0.3048f;
return m;
}
沒有氣壓傳感器則通過GPS確定高度,後續.