`
nanjingjiangbiao_T
  • 浏览: 2739616 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

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();
  }
}


分享到:
评论

相关推荐

    android-SensorEventListener-.zip_SensorEventListener_android

    在Android开发中,SensorEventListener是Android系统提供的一个接口,用于监听设备的各种传感器事件,例如重力感应、加速度计、陀螺仪等。这个接口在处理与设备物理运动相关的应用程序时非常关键,如游戏、健康应用...

    Android-语音通话时息屏的实现

    这项技术的核心是利用设备上的距离传感器和Android系统的API来检测手机与用户耳朵的距离,从而控制屏幕的开关状态。下面我们将深入探讨这个功能的实现原理和相关知识点。 1. **距离传感器**:这是实现语音通话息屏...

    Android-陀螺仪滑动图片实现VR看房

    在Android开发中,陀螺仪(Gyroscope)是一种常用传感器,可以实时检测设备的旋转角度,从而实现更精确的用户交互。本示例"Android-陀螺仪滑动图片实现VR看房"是一个利用陀螺仪数据进行图片浏览的应用,让用户仿佛...

    Android-android-shake-detector检测设备的晃动

    在Android应用开发中,有时我们需要实现一种功能,即检测用户设备的晃动行为,例如用于游戏、健身应用或任何需要用户交互的创新功能。"Android-shake-detector" 是一个专门为这种需求设计的工具类库,它能帮助开发者...

    Android-Orientation-Sensor,android传感器定向库使用所有可用的设备传感器,帮助您获得更精确的定向矢量值。.zip

    综上所述,Android-Orientation-Sensor库是Android开发者实现精确设备定向功能的一个强大工具,它通过融合多种传感器数据,提升了定向计算的精度和稳定性。开发者可以借助这个库,轻松地在自己的应用中实现更准确的...

    Android的SensorEventListener例子(摇晃手机)

    在Android开发中,SensorEventListener是用于监听设备传感器事件的关键接口。这个接口让我们能够实时获取到...通过这种方式,我们能利用Android的SensorEventListener实现丰富的用户交互,提升应用的趣味性和实用性。

    Android-ChaosCompass自定义View实现小米指南针和时钟

    1. 获取手机传感器数据:使用SensorManager获取磁力感应器(Sensor.TYPE_MAGNETIC_FIELD)和陀螺仪(Sensor.TYPE_GYROSCOPE)的数据,通过SensorEventListener监听传感器事件。 2. 计算设备方向:将传感器数据转换为...

    Android-仿华为相机旋转动画配置界面支持随重力360度旋转

    在Android应用开发中,创建一个类似华为相机的旋转动画并实现界面随重力360度旋转是一项技术挑战。这个项目"Android-仿华为相机旋转动画配置界面支持随重力360度旋转"旨在模拟华为相机的高级功能,允许用户在不同...

    Android-Beetle实现通过摇一摇手机就能够轻松地在GitHubGitLab和AzureDevOps上创建Bug报告

    标题中的“Android-Beetle实现通过摇一摇手机就能够轻松地在GitHubGitLab和AzureDevOps上创建Bug报告”揭示了一个独特的Android应用程序——Beetle。这个应用旨在简化开发者和用户向GitHub、GitLab以及Azure DevOps...

    Android代码-Android摇一摇功能示例源码.zip

    这个"Android代码-Android摇一摇功能示例源码.zip"压缩包提供了一个实现该功能的示例项目,可以帮助开发者理解和实现摇一摇功能。 摇一摇功能的核心在于检测手机的加速度变化。Android系统提供了SensorManager服务...

    Android-Motion-Detector-源码.rar

    同时,进行多设备和不同场景的测试,确保应用在各种条件下都能准确检测运动。 9. **源码结构** 该项目的源码结构可能包括Activity类(负责UI和事件处理)、Service类(用于后台持续监听)、BroadcastReceiver...

    Android-温度计

    【Android-温度计】是一个基于安卓平台的Java程序,它能够实时显示室内的温度和湿度,并且具有数据记录和保存的功能。这个应用的核心是利用硬件传感器(如温湿度传感器)来获取环境信息,并通过用户界面展示,同时...

    Android-Android传感器融合Demo移动返回当前设备朝向

    这个"Android-Android传感器融合Demo移动返回当前设备朝向"项目,专注于利用传感器数据来确定设备的实时朝向。在Android开发中,了解如何处理传感器数据对于创建交互式应用,特别是那些依赖于用户方向或位置的应用至...

    Android-EasyCompass一个使用kotlin开发的简易指南针

    在Android平台上,Kotlin语言以其简洁的语法和强大的功能逐渐成为了开发者们的首选。"Android-EasyCompass"项目就是一个很好的示例,展示了如何利用Kotlin来实现一个实用的指南针应用。下面,我们将深入探讨这个项目...

    Android-一个微信Android摇一摇

    在Android平台上,微信的“摇一摇”功能是一项有趣且互动性强的功能,它允许用户通过晃动手机来触发特定的事件或活动。这个"Android-一个微信Android摇一摇"项目,显然旨在模拟并实现类似微信中的摇一摇体验。在...

    Android-sensor-system.zip_Android sensor_Android sensor _androi

    在Android系统中,传感器事件通过SensorEvent对象传递,每个Sensor对象都有一个对应的SensorEventListener接口,应用程序通过实现这个接口来接收传感器数据。Android SDK提供了一系列的SensorManager类,用于注册...

    Android-Android根据OrientationEventListener获取设备的方向

    根据你的需求选择合适的延迟,以平衡性能和响应速度。 ### 5. 注意事项 - 记得在`onResume()`中启动监听,在`onPause()`中停止,以避免浪费资源。 - 不是所有设备都支持方向感应,所以在创建监听器前应检查硬件支持...

    android震动传感器之摇一摇

    在Android平台上,开发一个“摇一摇”功能的应用程序,主要涉及到的是设备的传感器技术,尤其是加速度计和震动传感器。下面将详细讲解这个过程涉及的技术点。 首先,我们需要了解Android系统的传感器框架。Android...

    Android-加速传感器或者OrientationEventListener做横竖屏切换

    2. 实现SensorEventListener接口:为了接收传感器事件,我们需要在当前Activity或Service中实现SensorEventListener接口,并重写onSensorChanged()方法。在这个方法中,我们将根据加速度值判断设备的方向: ```java...

    利用android手机自带的加速度传感器和磁场传感器确定手机的姿态

    总结来说,通过Android手机内置的加速度传感器和磁场传感器,结合适当的算法,我们可以精确地确定手机在三维空间中的姿态,这对于实现导航、游戏、虚拟现实等应用场景至关重要。尽管Android 4.0以上版本不再提供方向...

Global site tag (gtag.js) - Google Analytics