SensorEvnetListener及AudioManager整合应用

来源:互联网 发布:阿里云 共享计算型 编辑:程序博客网 时间:2024/06/04 23:19

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
原创粉丝点击