Android 利用重力感应调整手机模式

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

}

Demo下载

你可能感兴趣的:(android)