这个例子实现的是根据手机的”状态“改变手机现在的模式。
当手机正面朝上时,手机处于响铃的状态,当手机背面朝上时,手机处于静音的状态。
实现这个例子需要用到手机内置的传感器,并实现相应的方法判断手机的状态。同时还需要用到手机的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是Android系统提供的一个接口,用于监听设备的各种传感器事件,例如重力感应、加速度计、陀螺仪等。这个接口在处理与设备物理运动相关的应用程序时非常关键,如游戏、健康应用...
这项技术的核心是利用设备上的距离传感器和Android系统的API来检测手机与用户耳朵的距离,从而控制屏幕的开关状态。下面我们将深入探讨这个功能的实现原理和相关知识点。 1. **距离传感器**:这是实现语音通话息屏...
在Android开发中,陀螺仪(Gyroscope)是一种常用传感器,可以实时检测设备的旋转角度,从而实现更精确的用户交互。本示例"Android-陀螺仪滑动图片实现VR看房"是一个利用陀螺仪数据进行图片浏览的应用,让用户仿佛...
在Android应用开发中,有时我们需要实现一种功能,即检测用户设备的晃动行为,例如用于游戏、健身应用或任何需要用户交互的创新功能。"Android-shake-detector" 是一个专门为这种需求设计的工具类库,它能帮助开发者...
综上所述,Android-Orientation-Sensor库是Android开发者实现精确设备定向功能的一个强大工具,它通过融合多种传感器数据,提升了定向计算的精度和稳定性。开发者可以借助这个库,轻松地在自己的应用中实现更准确的...
在Android开发中,SensorEventListener是用于监听设备传感器事件的关键接口。这个接口让我们能够实时获取到...通过这种方式,我们能利用Android的SensorEventListener实现丰富的用户交互,提升应用的趣味性和实用性。
1. 获取手机传感器数据:使用SensorManager获取磁力感应器(Sensor.TYPE_MAGNETIC_FIELD)和陀螺仪(Sensor.TYPE_GYROSCOPE)的数据,通过SensorEventListener监听传感器事件。 2. 计算设备方向:将传感器数据转换为...
在Android应用开发中,创建一个类似华为相机的旋转动画并实现界面随重力360度旋转是一项技术挑战。这个项目"Android-仿华为相机旋转动画配置界面支持随重力360度旋转"旨在模拟华为相机的高级功能,允许用户在不同...
标题中的“Android-Beetle实现通过摇一摇手机就能够轻松地在GitHubGitLab和AzureDevOps上创建Bug报告”揭示了一个独特的Android应用程序——Beetle。这个应用旨在简化开发者和用户向GitHub、GitLab以及Azure DevOps...
这个"Android代码-Android摇一摇功能示例源码.zip"压缩包提供了一个实现该功能的示例项目,可以帮助开发者理解和实现摇一摇功能。 摇一摇功能的核心在于检测手机的加速度变化。Android系统提供了SensorManager服务...
同时,进行多设备和不同场景的测试,确保应用在各种条件下都能准确检测运动。 9. **源码结构** 该项目的源码结构可能包括Activity类(负责UI和事件处理)、Service类(用于后台持续监听)、BroadcastReceiver...
【Android-温度计】是一个基于安卓平台的Java程序,它能够实时显示室内的温度和湿度,并且具有数据记录和保存的功能。这个应用的核心是利用硬件传感器(如温湿度传感器)来获取环境信息,并通过用户界面展示,同时...
这个"Android-Android传感器融合Demo移动返回当前设备朝向"项目,专注于利用传感器数据来确定设备的实时朝向。在Android开发中,了解如何处理传感器数据对于创建交互式应用,特别是那些依赖于用户方向或位置的应用至...
在Android平台上,Kotlin语言以其简洁的语法和强大的功能逐渐成为了开发者们的首选。"Android-EasyCompass"项目就是一个很好的示例,展示了如何利用Kotlin来实现一个实用的指南针应用。下面,我们将深入探讨这个项目...
在Android平台上,微信的“摇一摇”功能是一项有趣且互动性强的功能,它允许用户通过晃动手机来触发特定的事件或活动。这个"Android-一个微信Android摇一摇"项目,显然旨在模拟并实现类似微信中的摇一摇体验。在...
在Android系统中,传感器事件通过SensorEvent对象传递,每个Sensor对象都有一个对应的SensorEventListener接口,应用程序通过实现这个接口来接收传感器数据。Android SDK提供了一系列的SensorManager类,用于注册...
根据你的需求选择合适的延迟,以平衡性能和响应速度。 ### 5. 注意事项 - 记得在`onResume()`中启动监听,在`onPause()`中停止,以避免浪费资源。 - 不是所有设备都支持方向感应,所以在创建监听器前应检查硬件支持...
在Android平台上,开发一个“摇一摇”功能的应用程序,主要涉及到的是设备的传感器技术,尤其是加速度计和震动传感器。下面将详细讲解这个过程涉及的技术点。 首先,我们需要了解Android系统的传感器框架。Android...
2. 实现SensorEventListener接口:为了接收传感器事件,我们需要在当前Activity或Service中实现SensorEventListener接口,并重写onSensorChanged()方法。在这个方法中,我们将根据加速度值判断设备的方向: ```java...
总结来说,通过Android手机内置的加速度传感器和磁场传感器,结合适当的算法,我们可以精确地确定手机在三维空间中的姿态,这对于实现导航、游戏、虚拟现实等应用场景至关重要。尽管Android 4.0以上版本不再提供方向...