Android入门笔记之 根据手机姿态改变手机模式

Android入门笔记之根据手机姿态改变手机模式

<1>简介

学习SensorManager和AudioManager

<2>关键步骤

       SensorManager 允许你访问设备的感应器。通过传入参数SENSOR_SERVICE参数调用Context.getSystemService方法可以获得一个sensor的实例。永远记得确保当你不需要的时候,特别是Activity暂定的时候,要关闭感应器。忽略这一点肯能导致几个小时就耗尽电池,注意当屏幕关闭时,系统不会自动关闭感应器。

 

下面显示了Sensor所提供的所有服务

Constants

int TYPE_ACCELEROMETER   A constant describing an accelerometersensor type. //三轴加速度感应器 返回三个坐标轴的加速度  单位m/s2

int  TYPE_ALL A constant describing all sensor types.  //用于列出所有感应器

int TYPE_GRAVITY  A constant describing a gravity sensor type.   //重力感应器

int TYPE_GYROSCOPE  A constant describing a gyroscope sensor type //陀螺仪 可判断方向 返回三个坐标轴上的角度

int TYPE_LIGHT  A constant describing an light sensor type.  //光线感应器 单位lux 勒克斯

int TYPE_LINEAR_ACCELERATION  A constant describing a linearacceleration sensor type. //线性加速度

intTYPE_MAGNETIC_FIELD  A constant describing a magnetic field sensor type.//磁场感应 返回三个

坐标轴的数值  微特斯拉

intTYPE_ORIENTATION  This constant is deprecated. useSensorManager.getOrientation() instead. //方向感应器 已过时 可以使用方法获得

int TYPE_PRESSURE   A constant describing a pressure sensor type //压力感应器  单位 千帕斯卡

int TYPE_PROXIMITY  A constant describing an proximity sensor type.//距离传感器

int   TYPE_ROTATION_VECTOR  A constant describing a rotation vector sensor type.//翻转传感器

int   TYPE_TEMPERATURE A constant describing a temperature sensor type //温度传感器 单位 摄氏度

此类中包含的方法都是get型的 用来获取所选sensor的一些属性,sensor类一般不需要new而是通过SensorManager的方法获得

sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);很显然我获得的是光线感应器的引用

 

SensorListener->Thisinterface was deprecated in API level 3.
Use SensorEventListener instead.

 

通过

AudioManageram=(AudioManager)getSystemService(Context.AUDIO_SERVICE)的getRingerMode()来获取状态参数,来判断手机状态。

<3>出现的问题

       不要忘记将新的Activity在android manifest.xml中注册一下。

<4>代码及解释

      

ChangeStateActivity:

package com.func;

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.test.R;

public class ChangeStateActivity extends Activity{
	/**   
	 * @ProjectName:  [androidtest] 
	 * @Package:      [com.func.ChangeStateActivity.java]  
	 * @ClassName:    [ChangeStateActivity]   
	 * @Description:    
	 * @Author:       [gmj]   
	 * @CreateDate:   [2013-9-15 下午1:26:00]   
	 * @Version:      [v1.0] 
	 */
	private SensorManager sm;
	int msg;
	EditText etYaw;
	EditText etPitch;
	EditText etRow;
	TextView tv;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_changestate);
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//强制竖屏
        etYaw=(EditText)this.findViewById(R.id.stateet1);
        etPitch=(EditText)this.findViewById(R.id.stateet2);
        etRow=(EditText)this.findViewById(R.id.stateet3);
        tv=(TextView)this.findViewById(R.id.statetv4);
        sm=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
        //获取当前的AudioManager模式
        try
        {
        	AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
        	if(am!=null)
        	{
        		msg=am.getRingerMode();//获取状态常数
        	}
        }catch(Exception e)
        {
        	e.printStackTrace();
        }
        switch(msg)
        {
	        case AudioManager.RINGER_MODE_NORMAL://正常模式
	        	Toast.makeText(
	        			ChangeStateActivity.this, 
						"正常模式", 
						Toast.LENGTH_SHORT
						).show();
	        	tv.setText("手机现在的模式为:"+"正常模式");
	        break;
	        case AudioManager.RINGER_MODE_SILENT://静音模式
	        	Toast.makeText(
	        			ChangeStateActivity.this, 
						"静音模式", 
						Toast.LENGTH_SHORT
						).show();
	        	tv.setText("手机现在的模式为:"+"静音模式");
	        break;
	        case AudioManager.RINGER_MODE_VIBRATE://震动模式
	        	Toast.makeText(
	        			ChangeStateActivity.this, 
						"震动模式", 
						Toast.LENGTH_SHORT
						).show();
	        	tv.setText("手机现在的模式为:"+"震动模式");
	        break;
        }
    }
    private SensorListener mySensorListener=new SensorListener()
    {

		@Override
		public void onAccuracyChanged(int sensor, int accuracy) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void onSensorChanged(int sensor, float[] values) {
			// TODO Auto-generated method stub
			float yaw=values[SensorManager.DATA_X];
			float pitch=values[SensorManager.DATA_Y];
			float row=values[SensorManager.DATA_Z];
			etYaw.setText(yaw+"");
			etPitch.setText(pitch+"");
			etRow.setText(row+"");
			if(pitch<-120)
			{//人为规定小于-120时为,手机反倒背面
				try
				{
					AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
					if(am!=null)
					{
						//am.setRingerMode(AudioManager.RINGER_MODE_SILENT);//静音模式
						am.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);//震动模式
						tv.setText("手机现在的模式为:"+"震动模式");
					}
				}catch(Exception e)
				{
					e.printStackTrace();
				}
			}else
			{
				try
				{
					AudioManager am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
					if(am!=null)
					{
						am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);//正常模式
						tv.setText("手机现在的模式为:"+"正常模式");
					}
				}catch(Exception e)
				{
					e.printStackTrace();
				}
			}
		}
    	
    };
    @Override
    public void onResume()
    {
    	super.onResume();
    	sm.registerListener(mySensorListener, SensorManager.SENSOR_ORIENTATION, SensorManager.SENSOR_DELAY_NORMAL);
    }
    @Override
    public void onPause()
    {
    	super.onPause();
    	sm.unregisterListener(mySensorListener);
    }
    @Override
	public boolean onKeyDown(int keyCode,KeyEvent e)//重写键按下方法
	{    	
    	if(keyCode==4)//按下返回键
		{
    		System.exit(0);
		}
    	return true;
	}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值