Android 通过SensorManager可获取手机相对位置,然后通过AudioManager修改手机模式,代码较为简单,具体代码如下,相关代码已给出注释。打开软件后若正面朝上则设置正常模式,朝下则设置震动模式。
手机通过重力感应获取相对自身的坐标,而不是空间坐标,然后通过自身坐标判断自身位置,其原理图如下:
如何判断手机相关位置具体内容本文不做介绍,可自行百度相关内容。本例全部代码如下,若需demo可在文章底部给出链接自行下载。
package com.example.changephonemode;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.os.Bundle;
import android.os.Vibrator;
import android.widget.TextView;
public class MainActivity extends Activity {
private SensorManager mSensorManager;
private TextView mTextView;
private int strRingerMode;// 存储AudioManager模式
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.mytxt);
try {
/*
* 获取SENSOR_SERVICE服务 在1.5的AVD模拟器中会死机
*/
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
} catch (Exception e) {
e.printStackTrace();
}
GetAudioManagerMode();
setTextViewValue();
}
@Override
protected void onResume() {
mSensorManager.registerListener(mSensorListener,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
super.onResume();
}
@Override
protected void onPause() {
mSensorManager.unregisterListener(mSensorListener);
super.onPause();
}
// 设置文字内容
public void setTextViewValue() {
switch (strRingerMode) {
case AudioManager.RINGER_MODE_NORMAL:
mTextView.setText("正常模式");
break;
case AudioManager.RINGER_MODE_SILENT:
mTextView.setText("静音模式");
break;
case AudioManager.RINGER_MODE_VIBRATE:
mTextView.setText("震动模式");
break;
default:
break;
}
}
private final SensorEventListener mSensorListener = new SensorEventListener() {
private float x, y, z;
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
synchronized (mSensorManager) {
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
x = event.values[0];
y = event.values[1];
z = event.values[2];
if (z > 9) {
/* 正面向上,改为正常模式 */
ChangeToNormaoMode();
setTextViewValue();
} else if (z < -9) {
/* 正面向上,先设置静音模式,再设置震动模式 */
ChangeToSilentMode();
ChangeToVobrateMode();
setTextViewValue();
} else if (x > 9) {
/* 正面向左 */
} else if (x < -9) {
/* 正面向右 */
} else if (y > 9) {
/* 手掌正翻向自己直立 */
} else if (y < -9) {
/* 手掌反翻背向自己直立 */
} else {
/* 无法判断情况 */
}
break;
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
};
// 改为正常模式
private void ChangeToNormaoMode() {
try {
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null) {
/*
* strRingerMode的值为: RINGER_MODE_NORMAL RINGER_MODE_SILENT
* RINGER_MODE_VIBRATE
*/
audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
strRingerMode = audioManager.getRingerMode();
}
} catch (Exception e) {
mTextView.setText(e.toString());
e.printStackTrace();
}
}
// 改为静音模式
private void ChangeToSilentMode() {
try {
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null) {
/*
* strRingerMode的值为: RINGER_MODE_NORMAL RINGER_MODE_SILENT
* RINGER_MODE_VIBRATE
*/
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
strRingerMode = audioManager.getRingerMode();
}
} catch (Exception e) {
mTextView.setText(e.toString());
e.printStackTrace();
}
}
// 改为震动模式
private void ChangeToVobrateMode() {
try {
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null) {
/*
* strRingerMode的值为: RINGER_MODE_NORMAL RINGER_MODE_SILENT
* RINGER_MODE_VIBRATE
*/
audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
strRingerMode = audioManager.getRingerMode();
}
} catch (Exception e) {
mTextView.setText(e.toString());
e.printStackTrace();
}
}
private void GetAudioManagerMode() {
try {
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null) {
/*
* strRingerMode的值为: RINGER_MODE_NORMAL RINGER_MODE_SILENT
* RINGER_MODE_VIBRATE
*/
strRingerMode = audioManager.getRingerMode();
}
} catch (Exception e) {
mTextView.setText(e.toString());
e.printStackTrace();
}
}
}