Android的传感器—Sensor(一)

 学习新的内容了,就是那个神奇的传感器,在手机游戏里面的重力感应,指南针的导航,这些都是传感器的使用。接下来我们来逐渐揭开它的神秘面纱。

通过三步使用传感器

1、写个截获传感器事件的类,这个类必须实现SensorEventListener接口

2、获得传感器管理对象SensorManager对象

3、注册指定的传感器类型

下面看一个例子

package mobile.android.sensor;

import java.util.List;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;

public class Main extends Activity implements SensorEventListener
{
	private TextView tvAccelerometer;
	private TextView tvMagentic;
	private TextView tvLight;
	private TextView tvOrientation;
	private TextView tvSensors;
	private SensorManager sensorManager;
	private float[] accelerometerValues;
	private float[] geomagneticValues;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
		sensorManager.registerListener(this,
				sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
				SensorManager.SENSOR_DELAY_FASTEST);

		sensorManager.registerListener(this,
				sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
				SensorManager.SENSOR_DELAY_FASTEST);

		sensorManager.registerListener(this,
				sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),
				SensorManager.SENSOR_DELAY_FASTEST);

		sensorManager.registerListener(this,
				sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
				SensorManager.SENSOR_DELAY_FASTEST);

		tvAccelerometer = (TextView) findViewById(R.id.tvAccelerometer);
		tvMagentic = (TextView) findViewById(R.id.tvMagentic);
		tvLight = (TextView) findViewById(R.id.tvLight);
		tvOrientation = (TextView) findViewById(R.id.tvOrientation);
		tvSensors = (TextView) findViewById(R.id.tvSensors);

		List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
		for (Sensor sensor : sensors)
		{
			tvSensors.append(sensor.getName() + "\n");
		}
		
	}

	@Override
	public void onSensorChanged(SensorEvent event)
	{

		switch (event.sensor.getType())
		{
			case Sensor.TYPE_ACCELEROMETER:
				String accelerometer = "加速度\n" + "X:" + event.values[0] + "\n"
						+ "Y:" + event.values[1] + "\n" + "Z:"
						+ event.values[2] + "\n";
				tvAccelerometer.setText(accelerometer);
				accelerometerValues = event.values.clone();
				break;
			case Sensor.TYPE_LIGHT:
				tvLight.setText("亮度:" + event.values[0]);

				break;
			case Sensor.TYPE_MAGNETIC_FIELD:
				String magentic = "磁场\n" + "X:" + event.values[0] + "\n" + "Y:"
						+ event.values[1] + "\n" + "Z:" + event.values[2]
						+ "\n";
				tvMagentic.setText(magentic);
				geomagneticValues = event.values.clone();
				
				break;
			
			case Sensor.TYPE_ORIENTATION:
				if (geomagneticValues != null && accelerometerValues != null)
				{
					float[] R = new float[16];
					float[] I = new float[16];
					float[] outR = new float[16];

					sensorManager.getRotationMatrix(R, I, accelerometerValues,
							geomagneticValues);
					sensorManager.remapCoordinateSystem(R,
							SensorManager.AXIS_X, SensorManager.AXIS_Y, outR);

					float[] actual_orientation = new float[3];
					actual_orientation = sensorManager.getOrientation(outR, actual_orientation);

					String orientation = "方向\n" + "X:" + event.values[0] + "\n"
							+ "Y:" + event.values[1] + "\n" + "Z:"
							+event.values[2] + "\n";
					tvOrientation.setText(orientation);
				}
				break;
			
		}

	}

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

	}

}

上面的代码是使用了event。values数组中的数据来获得传感器传回来的数据。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值