Android入门笔记之根据手机姿态改变手机模式
<1>简介
学习SensorManager和AudioManager
<2>关键步骤
SensorManager 允许你访问设备的感应器。通过传入参数SENSOR_SERVICE参数调用Context.getSystemService方法可以获得一个sensor的实例。永远记得确保当你不需要的时候,特别是Activity暂定的时候,要关闭感应器。忽略这一点肯能导致几个小时就耗尽电池,注意当屏幕关闭时,系统不会自动关闭感应器。
下面显示了Sensor所提供的所有服务
Constants
int TYPE_ACCELEROMETER A constant describing an accelerometersensor type. //三轴加速度感应器 返回三个坐标轴的加速度 单位m/s2
int TYPE_ALL A constant describing all sensor types. //用于列出所有感应器
int TYPE_GRAVITY A constant describing a gravity sensor type. //重力感应器
int TYPE_GYROSCOPE A constant describing a gyroscope sensor type //陀螺仪 可判断方向 返回三个坐标轴上的角度
int TYPE_LIGHT A constant describing an light sensor type. //光线感应器 单位lux 勒克斯
int TYPE_LINEAR_ACCELERATION A constant describing a linearacceleration sensor type. //线性加速度
intTYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type.//磁场感应 返回三个
坐标轴的数值 微特斯拉
intTYPE_ORIENTATION This constant is deprecated. useSensorManager.getOrientation() instead. //方向感应器 已过时 可以使用方法获得
int TYPE_PRESSURE A constant describing a pressure sensor type //压力感应器 单位 千帕斯卡
int TYPE_PROXIMITY A constant describing an proximity sensor type.//距离传感器
int TYPE_ROTATION_VECTOR A constant describing a rotation vector sensor type.//翻转传感器
int TYPE_TEMPERATURE A constant describing a temperature sensor type //温度传感器 单位 摄氏度
此类中包含的方法都是get型的 用来获取所选sensor的一些属性,sensor类一般不需要new而是通过SensorManager的方法获得
sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);很显然我获得的是光线感应器的引用
SensorListener->Thisinterface was deprecated in API level 3.
Use SensorEventListener instead.
通过
AudioManageram=(AudioManager)getSystemService(Context.AUDIO_SERVICE)的getRingerMode()来获取状态参数,来判断手机状态。
<3>出现的问题
不要忘记将新的Activity在android manifest.xml中注册一下。
<4>代码及解释
ChangeStateActivity:
package com.func;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.test.R;
public class ChangeStateActivity extends Activity{
/**
* @ProjectName: [androidtest]
* @Package: [com.func.ChangeStateActivity.java]
* @ClassName: [ChangeStateActivity]
* @Description:
* @Author: [gmj]
* @CreateDate: [2013-9-15 下午1:26:00]
* @Version: [v1.0]
*/
private SensorManager sm;
int msg;
EditText etYaw;
EditText etPitch;
EditText etRow;
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_changestate);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//强制竖屏
etYaw=(EditText)this.findViewById(R.id.stateet1);
etPitch=(EditText)this.findViewById(R.id.stateet2);
etRow=(EditText)this.findViewById(R.id.stateet3);
tv=(TextView)this.findViewById(R.id.statetv4);
sm=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
//获取当前的AudioManager模式
try
{
AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if(am!=null)
{
msg=am.getRingerMode();//获取状态常数
}
}catch(Exception e)
{
e.printStackTrace();
}
switch(msg)
{
case AudioManager.RINGER_MODE_NORMAL://正常模式
Toast.makeText(
ChangeStateActivity.this,
"正常模式",
Toast.LENGTH_SHORT
).show();
tv.setText("手机现在的模式为:"+"正常模式");
break;
case AudioManager.RINGER_MODE_SILENT://静音模式
Toast.makeText(
ChangeStateActivity.this,
"静音模式",
Toast.LENGTH_SHORT
).show();
tv.setText("手机现在的模式为:"+"静音模式");
break;
case AudioManager.RINGER_MODE_VIBRATE://震动模式
Toast.makeText(
ChangeStateActivity.this,
"震动模式",
Toast.LENGTH_SHORT
).show();
tv.setText("手机现在的模式为:"+"震动模式");
break;
}
}
private SensorListener mySensorListener=new SensorListener()
{
@Override
public void onAccuracyChanged(int sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(int sensor, float[] values) {
// TODO Auto-generated method stub
float yaw=values[SensorManager.DATA_X];
float pitch=values[SensorManager.DATA_Y];
float row=values[SensorManager.DATA_Z];
etYaw.setText(yaw+"");
etPitch.setText(pitch+"");
etRow.setText(row+"");
if(pitch<-120)
{//人为规定小于-120时为,手机反倒背面
try
{
AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if(am!=null)
{
//am.setRingerMode(AudioManager.RINGER_MODE_SILENT);//静音模式
am.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);//震动模式
tv.setText("手机现在的模式为:"+"震动模式");
}
}catch(Exception e)
{
e.printStackTrace();
}
}else
{
try
{
AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if(am!=null)
{
am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);//正常模式
tv.setText("手机现在的模式为:"+"正常模式");
}
}catch(Exception e)
{
e.printStackTrace();
}
}
}
};
@Override
public void onResume()
{
super.onResume();
sm.registerListener(mySensorListener, SensorManager.SENSOR_ORIENTATION, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onPause()
{
super.onPause();
sm.unregisterListener(mySensorListener);
}
@Override
public boolean onKeyDown(int keyCode,KeyEvent e)//重写键按下方法
{
if(keyCode==4)//按下返回键
{
System.exit(0);
}
return true;
}
}