Adroid传感器应用_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Adroid传感器应用

Adroid传感器应用

 2013/7/18 0:14:01  monsterhuan  程序员俱乐部  我要评论(0)
  • 摘要:最近在学习通信和Android,打算将这两个知识联系在一起,和小组的人一起做一个小项目,利用Android手机上的传感器搜集数据,把手机充当一个带有重力感应的游戏手柄。在这个项目中用到了Android中的Sensor类,SensorManager类,SensorEvent类,SensorEventListener类。在Android中,Sensor类的常量有
  • 标签:应用
   最近在学习通信和Android,打算将这两个知识联系在一起,和小组的人一起做一个小项目,利用Android手机上的传感器搜集数据,把手机充当一个带有重力感应的游戏手柄。在这个项目中用到了Android中的Sensor类,SensorManager类,SensorEvent类,SensorEventListener类。
    在Android中,Sensor类的常量有:TYPE_ACCELEROMETER/TYPR_ALL  TYPE_AMBIENT_TEMPERATURE/TYPE_GRAVITY/TYPE_GYROSCOPE/TYPE_LIGHT/  TYPE_LINEAR_ACCELERATION/TYPE_MAGNETIC_FIELD/TYPE_ORIENTATION/TYPE_PRESSURE/TYPE_PROXIMITY/TYPE_RELATIVE_HUMIDITY/TYPE_ROTATION_VECTOR/ TYPR_TEMPERATURE,但是在这个项目中,我们只用到了TYPE_ACCELERAMETER,加速度传感器。
    通过SensorManager连接设备的传感器,通过以下语句进行实例化:
Context.getSystenmService(SENSOR_SERVICE)。
下面是测试传感器的简单的代码,其作用是读取加速度传感器的X,Y,Z轴上的加速度变化,并用Toast把变化呈现出来。
class="java" name="code">
public class MainActivity extends Activity {
	
	private SensorManager manager;
    private Sensor sensor;
    private SensorEventListener listener;
    private TextView text;
    //waystate记录赛车行驶方向,默认值为向前
    private String waystate="forward";
    
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//设置为全屏显示
		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN );
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		//保持屏幕常亮
		getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
		setContentView(R.layout.activity_main);
		
		text=(TextView)findViewById(R.id.TextView01);
		//初始化屏幕显示字符串
		text.setText("摇摆手机,观察传感器数字变化\nx=0,y=0,z=0");
		//初始化加速度传感器
		manager=(SensorManager)this.getSystemService(SENSOR_SERVICE);
		sensor=manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
		
		
		//初始化加速度变化事件监听器
		listener =new SensorEventListener(){
			int x,y,z;
			//当sensor的有效值改变时,从SensorManager中接收通知。
			public void onSensorChanged(SensorEvent e) {
				//立体坐标系的加速度
				x=(int)e.values[SensorManager.DATA_X];
				y=(int)e.values[SensorManager.DATA_Y];
				z=(int)e.values[SensorManager.DATA_Z];
			 if(y<2.5&&y>-2.5){
				 if(waystate!="forward")
				 {
					 //运动操作:让赛车向哪个方向跑的动作,这里先由吐司提示代替~
					 Toast.makeText(MainActivity.this,"forward",1).show();
				 }
				 waystate="forward";
			 }
			 if(y>=2.5){
				 if(waystate!="right")
				 {
					 Toast.makeText(MainActivity.this,"right",1).show();
				 }
				 waystate="right";
			 }
			 if(y<=-2.5){
				 if(waystate!="left")
				 {
					 Toast.makeText(MainActivity.this,"left",1).show();
				 }
				 waystate="left";
			 }
				text.setText("摇摆手机,观察传感器数字变化\nx="+x+",y="+y+",z="+z);
		}

			@Override
			public void onAccuracyChanged(Sensor sensor, int accuracy) {
				// TODO Auto-generated method stub
			}
			
			};
		
	}
	
	//自定义方法,传感器停止工作,300毫秒后恢复
		private void makeSensorDalay(){
			//加速度传感器休眠300毫秒,方法是先注销监听器,再注册监听器
			manager.unregisterListener(listener);
			Handler handler=new Handler(){
				public void handleMessage(Message msg){
		            if(msg.what==1){
						//注册监听器
						manager.registerListener(listener, sensor,SensorManager.SENSOR_DELAY_GAME);
					}
				}
			};
			Message message=Message.obtain();
			message.what=1;
			/*
			 * 傻瓜注释一:这里可以设置延时时间
			 * 延时时间是传感器休眠时间!!
			 */
			handler.sendMessageDelayed(message,600);
		}
	
		
		
	public void onResume(){
		super.onResume();
		//注册监听器
		manager.registerListener(listener, sensor,SensorManager.SENSOR_DELAY_GAME);
	}
	
	
	public void onPause(){
		//注销监听器
		manager.unregisterListener(listener);
		super.onPause();
	}

	
	
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

上一篇: 事件机制(监听器使用) 下一篇: 浅谈线程
发表评论
用户名: 匿名