Android使用Sensor Manager来判断手机在真实环境的速度、倾斜、选择,正如BroadcastReceiver对象,可以监听系统广播的短信或PhoneState Listener对象,监听系统广播的。
Android的SensorManager事件则是使用SensorListener对象来实现。
为了让Activity程序在OnCreate()后的第一个进入点(onResume()方法)就能监听手机的旋转状态,所以在onResume()方法里创建IntentFilter,使用SensorListener.registerListener()
注册一个自定义的SensorEventListener,且在onPause()离开程序时,取消系统注册(unregisterListener)的SensorListener.
源代码:
public class MainActivity extends Activity {
private SensorManager mSensorManager01;
private TextView mTextView01;
private int strRingerMode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView01=(TextView)findViewById(R.id.myTextView1);
try{
mSensorManager01=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
}catch(Exception e){
e.printStackTrace();
}
GetAudioManagerMode();
switch(strRingerMode){
case AudioManager.RINGER_MODE_NORMAL:
mTextView01.setText(R.string.str_normal_mode);
break;
case AudioManager.RINGER_MODE_SILENT:
mTextView01.setText(R.string.str_silent_mode);
break;
case AudioManager.RINGER_MODE_VIBRATE:
mTextView01.setText(R.string.str_vibrate_mode);
break;
}
}
/*创建SensorListener捕捉onSensorChanger事件*/
private final SensorEventListener mSensorListener=new SensorEventListener(){
private float x,y,z;
public void onAccuracyChanged(Sensor sensor,int accuracy){
}
/*使用onSensorChanged方法来捕获手机传感器的状态*/
public void onSensorChanged(SensorEvent event){
synchronized (mSensorManager01){
switch(event.sensor.getType()){
case Sensor.TYPE_ACCELEROMETER: //用以判断onSensorChanged传入的三方向的值。
x=event.values[0];
y=event.values[1];
z=event.values[2];
if(z>9)
{
/*正面向上*/
//改变为正常模式
ChangeToNormalMode();
//调用改变模式后,再一次确认手机的模式是什么
switch(strRingerMode)
{
case AudioManager.RINGER_MODE_NORMAL:
mTextView01.setText(R.string.str_normal_mode);
break;
case AudioManager.RINGER_MODE_SILENT:
mTextView01.setText(R.string.str_silent_mode);
break;
case AudioManager.RINGER_MODE_VIBRATE:
mTextView01.setText(R.string.str_vibrate_mode);
break;
}
}
else if(z<-9){
/*正面向上*/
//改变为静音模式
ChangeToSilentMode();
//再设置为振动模式
ChangeToVibrateMode();
//判断铃声模式
switch(strRingerMode)
{
case AudioManager.RINGER_MODE_NORMAL:
mTextView01.setText(R.string.str_normal_mode);
break;
case AudioManager.RINGER_MODE_SILENT:
mTextView01.setText(R.string.str_silent_mode);
break;
case AudioManager.RINGER_MODE_VIBRATE:
mTextView01.setText(R.string.str_vibrate_mode);
break;
}
}
else if(x>9)
{
//正面向左
}
else if(x<-9)
{
//正面向右
}
else if(y>9)
{
//手掌正翻向自己直立
}
else if(y<-9)
{
//手掌反翻向自己直立
}
else{
//其他无法判断
}
break;
}
}
}
};
/*取得目前的AudioManager模式*/
private void GetAudioManagerMode(){
try{
//建立AudioManager对象,取得AUDIO_SEVICE
AudioManager audioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if(audioManager!=null){
strRingerMode=audioManager.getRingerMode();
}
}catch(Exception e){
mTextView01.setText(e.toString());
e.printStackTrace();
}
}
//更改为静音模式
private void ChangeToSilentMode()
{
try{
AudioManager audioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if(audioManager!=null){
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
strRingerMode=audioManager.getRingerMode();
}
}catch(Exception e){
mTextView01.setText(e.toString());
e.printStackTrace();
}
}
private void ChangeToVibrateMode()
{
try{
AudioManager audioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if(audioManager!=null){
audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
strRingerMode=audioManager.getRingerMode();
}
}catch(Exception e){
mTextView01.setText(e.toString());
e.printStackTrace();
}
}
private void ChangeToNormalMode()
{
try{
AudioManager audioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
if(audioManager!=null){
audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
strRingerMode=audioManager.getRingerMode();
}
}catch(Exception e){
mTextView01.setText(e.toString());
e.printStackTrace();
}
}
protected void onResume()
{
/*使用SensorManager调用getDfaultSensor方法拿到加速重力感应
* 的Sensor对象,因为本程序使用的是重力加速传感器所以参数为
* Sensor.TYPE_ACCELEROMETER.使用SensorManager调用registerListener
* 来注册,第三个参数是检测的灵敏精确度根据不同选择需求选择
* 精确度。例如:SENSOR_DELAY_FASTEST 最灵敏 因为太快了没必要使用
* SENSOR_DELAY_GAME 游戏开发中使用
*SENSOR_DELAY_NORMAL 正常速度
*SENSOR_DELAY_UI 最慢的速度
* */
mSensorManager01.registerListener(mSensorListener, mSensorManager01.getDefaultSensor(
Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);
super.onResume();
}
protected void onPause(){
mSensorManager01.unregisterListener(mSensorListener);
super.onPause();
}
}
注释:
手机屏幕向左侧方当X轴就朝向天空,垂直放置 这时候 Y 轴 与 Z轴没有重力分量,因为X轴朝向天空所以它的重力分量则最大 。这时候X轴 Y轴 Z轴的重力分量的值分别为(10,0,0)
手机屏幕向右侧方当X轴就朝向地面,垂直放置 这时候 Y 轴 与 Z轴没有重力分量,因为X轴朝向地面所以它的重力分量则最小 。这时候X轴 Y轴 Z轴的重力分量的值分别为(-10,0,0)
手机屏幕垂直竖立放置方当Y轴就朝向天空,垂直放置 这时候 X 轴 与 Z轴没有重力分量,因为Y轴朝向天空所以它的重力分量则最大 。这时候X轴 Y轴 Z轴的重力分量的值分别为(0,10,0)
手机屏幕垂直竖立放置方当Y轴就朝向地面,垂直放置 这时候 X 轴 与 Z轴没有重力分量,因为Y轴朝向地面所以它的重力分量则最小 。这时候X轴 Y轴 Z轴的重力分量的值分别为(0,-10,0)
手机屏幕向上当Z轴就朝向天空,水平放置 这时候 X 轴与Y轴没有重力分量,因为Z轴朝向天空所以它的重力分量则最大 。这时候X轴 Y轴 Z轴的重力分量的值分别为(0,0,10)
手机屏幕向上当Z轴就朝向地面,水平放置 这时候 X 轴与Y轴没有重力分量,因为Z轴朝向地面所以它的重力分量则最小 。这时候X轴 Y轴 Z轴的重力分量的值分别为(0,0,-10)
注释说明引用自:http://xys289187120.blog.51cto.com/3361352/656822。