SensorEvnetListener及AudioManager整合应用

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值