Android--SensorEventListener和AudioManager实现根据条件转换手机震动和响铃

这个例子实现的是根据手机的”状态“改变手机现在的模式。

当手机正面朝上时,手机处于响铃的状态,当手机背面朝上时,手机处于静音的状态。

实现这个例子需要用到手机内置的传感器,并实现相应的方法判断手机的状态。同时还需要用到手机的AudioManager类改变手机的模式。

首先,我么需要在AndroidManifest.xml文件中添加如下的代码:

 <uses-permission android:name="android.permission.VIBRATE"/>

这行代码的功能是使得程序可以使用手机的震动模式。

下面给出具体的实现代码和相应的注释:

public class EX06_12 extends Activity
{
  /* 建立SensorManager对象 */
  private SensorManager mSensorManager01;
  private TextView mTextView01;
  
  /* 以私有类成员保存AudioManager模式 */
  private int strRingerMode;
  
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
    mTextView01 = (TextView)findViewById(R.id.myTextView1);
    
    /* 建立SensorManager对象,取得SENSOR_SERVICE服务 */
  
    try
    {
      mSensorManager01 = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
    
    /* 取得现有的AudioManager模式 */
    GetAudioManagerMode();
    
    /* 依据现有的AudioManager模式,显示于TextView当中 */
    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捕捉onSensorChanged事件 */
  private final SensorEventListener mSensorListener = new SensorEventListener()
  {
    private float x, y, z;
    
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy)
    {
      // TODO Auto-generated method stub
    }
    
    @Override
    public void onSensorChanged(SensorEvent event)
    {
      // TODO Auto-generated method stub
      synchronized(mSensorManager01)
      {
        switch (event.sensor.getType())
        {
        case Sensor.TYPE_ACCELEROMETER:
          x = event.values[0];
          y = event.values[1];
          z = event.values[2];
          if(z>9)
          {
            /* 正面向上 */
            //mTextView01.setText("Face Up");
            /* 变更为正常模式 */
            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)
          {
            /* 正面向下 */
            //mTextView01.setText("Face Down");
            
            /* 先设定为静音模式 */
            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)
          {
            /* 正面向左 */
            //mTextView01.setText("Left Side");
          }
          else if(x<-9)
          {
            /* 正面向右 */
            //mTextView01.setText("Right Side");
          }
          else if(y>9)
          {
            /* 手掌正翻向自己直立 */
            //mTextView01.setText("Standing Up");
          }
          else if(y<-9)
          {
            /* 手掌反翻反向直立 */
            //mTextView01.setText("On Head");
          }
          else
          {
            /* 其他无法判別 */
            //mTextView01.setText("In Between");
          }
          break;
        }
      }
    }
  };

  
  /* 取得当前的AudioManager模式 */
  private void GetAudioManagerMode()
  {
    try
    {
      /* 建立AudioManager对象,取得AUDIO_SERVICE */
      AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
      if (audioManager != null)
      {
        /* RINGER_MODE_NORMAL | RINGER_MODE_SILENT  | RINGER_MODE_VIBRATE */
        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)
      {
        /* RINGER_MODE_NORMAL | RINGER_MODE_SILENT  | RINGER_MODE_VIBRATE */
        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)
      {
        /* 调用setRingerMode方法,设定模式 */
        audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
        /* RINGER_MODE_NORMAL | RINGER_MODE_SILENT  | 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)
      {
        /* RINGER_MODE_NORMAL | RINGER_MODE_SILENT  | RINGER_MODE_VIBRATE */
        audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
        strRingerMode = audioManager.getRingerMode();
      }
    }
    catch(Exception e)
    {
      mTextView01.setText(e.toString());
      e.printStackTrace();
    }
  }
  
  @Override
  protected void onResume()
  {
    // TODO Auto-generated method stub
    mSensorManager01.registerListener 
    ( 
      mSensorListener, 
      mSensorManager01.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
      SensorManager.SENSOR_DELAY_NORMAL
    );
    super.onResume();
  }
  
  @Override
  protected void onPause()
  {
    // TODO Auto-generated method stub
    
    /* 重写onPause事件,取消mSensorListener */
    mSensorManager01.unregisterListener(mSensorListener);
    super.onPause();
  }
}


你可能感兴趣的:(listener)