Android之传感器

传感器 ——Sensor 使用方法

一丶计算手机中的传感器的代码

public class SensorDetectorActivity extends Activity {
	//SensorManager对象引用
	SensorManager mySensorManager;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		//设置为竖屏模式
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
		//获得SensorManager对象
		mySensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

		List<Sensor> ll=mySensorManager.getSensorList(Sensor.TYPE_ALL);
		StringBuilder sb=new StringBuilder();
		sb.append("传感器总数:");
		sb.append(ll.size());
		sb.append("\n==========================\n");
		for(Sensor s:ll)
		{
			sb.append("编号:");
			sb.append(s.getType());
			sb.append("\n");
			sb.append("名称:");
			sb.append(s.getName());
			sb.append("\n");
			sb.append("工作电流:");
			sb.append(s.getPower());
			sb.append("mA\n");
			sb.append("分辨率:");
			sb.append(s.getResolution());
			sb.append("\n");
			sb.append("最大测量范围:");
			sb.append(s.getMaximumRange());
			sb.append("\n");
			sb.append("供应商:");
			sb.append(s.getVendor());
			sb.append("\n");
			sb.append("版本号:");
			sb.append(s.getVersion());
			sb.append("\n==========================\n");
		}

		setContentView(R.layout.main);
		EditText et=(EditText)this.findViewById(R.id.EditText01);
		et.setKeyListener(null);
		et.setText(sb.toString());
	}
}

下面逐步分析
在这里插入图片描述
1.创建SensorManager的对象引用
SensorManager主要是通过它来访问设备的传感器,同时SensorManager也提供了方法

2.设置竖屏模式
方案1 :在manifests.xml中配置

<activity
	android:name=".SketchpadActivity"
	android:screenOrientation="landscape"/><!--让该Activity总是显示为横屏-->

screenOrientations属性共有7中可选值(常量定义在 android.content.pm.ActivityInfo类中 )
landscape:横屏(风景照) ,显示时宽度大于高度;
portrait:竖屏 (肖像照) , 显示时 高 度大于 宽 度 ;
user:用户当前的首选方向;
behind:继承Activity堆栈中当前Activity下面的那个Activity的方向;
sensor:由物理感应器决定显示方向,它取决于用户如何持有设备,当 设备 被旋转时方向会随之变化——在横屏与竖屏之间;
nosensor:忽略物理感应器——即显示方向与物理感应器无关,不管用户如何旋转设备显示方向都不会随着改变("unspecified"设置除外);
unspecified:未指定,此为默认值,由Android系统自己选择适当的方向,选择策略视具体设备的配置情况而定,因此不同的设备会有不同的方向选择;


本文来自 gundumw100 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/gundumw100/article/details/69966834?utm_source=copy

方案二:使用setRequestedOrientation
在这里插入图片描述

3.使用SensorManager提供的方法getSystemService()
里面传入一参数 SENSOR_SERVICE 来获得SenManager的对象

4.调用SensorManager的方法getSensorList() 来获得所有的传感器

===================================================================
二丶加速度传感器–Accelerometer
该传感器是接受的矢量数据 即X,Y,Z轴方向都需要涉及

1.想使用该传感器 前面是引用对象我就不多说了
使用SensorManager提供的getDefaultSensor方法传入一常量值-即Sensor的类型
在这里插入图片描述

2.使用特定的传感器 必须要在生命周期方法 onResume 和onPause 中注册监听以及取消监听
注册监听的方法 (监听的对象,监听的传感器类型,常量值:监听的频率(这个当然越高越好,不过越高越耗电))
取消监听的方法 参数直接传监听对象就可以了
在这里插入图片描述

这是监听添加的方法(匿名内部类) 以及对数据的操作 当然只是获取了数据 具体干什么看自己了 基本onAccuracyChanged 这个精确度改变的方法通常都没写
onSensorChanged()要写以及数据处理
由于该传感器是矢量类型的所以有三个参数(x,y,z)
在这里插入图片描述

3.理解一些KeyCode的用法 手机中键盘被按下的时候触发
在这里插入图片描述

public class MyActivity extends Activity {
	SensorManager mySensorManager;	//SensorManager对象引用
	Sensor myAccelerometer; 	//传感器类型
	TextView tvX;	//TextView对象引用
	TextView tvY;	//TextView对象引用
	TextView tvZ;	//TextView对象引用
	TextView info;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		tvX = (TextView)findViewById(R.id.tvX);	//用于显示x轴方向加速度
		tvY = (TextView)findViewById(R.id.tvY);	//用于显示y轴方向加速度
		tvZ = (TextView)findViewById(R.id.tvZ); //用于显示z轴方向加速度
		info= (TextView)findViewById(R.id.info);//用于显示手机中加速度传感器的相关信息
		//获得SensorManager对象
		mySensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
		//传感器的类型
		myAccelerometer=mySensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

		//创建一个StringBuffer
		StringBuffer strb=new StringBuffer();
		strb.append("\n名称: ");
		strb.append(myAccelerometer.getName());
		strb.append("\n耗电量(mA): ");
		strb.append(myAccelerometer.getPower());
		strb.append("\n类型编号 : ");
		strb.append(myAccelerometer.getType());
		strb.append("\n制造商: ");
		strb.append(myAccelerometer.getVendor());
		strb.append("\n版本: ");
		strb.append(myAccelerometer.getVersion());
		strb.append("\n最大测量范围: ");
		strb.append(myAccelerometer.getMaximumRange());

		info.setText(strb.toString());	//将信息字符串赋予名为info的TextView
	}
	@Override
	protected void onResume(){ //重写onResume方法
		super.onResume();
		mySensorManager.registerListener(
				mySensorListener, 		//添加监听
				myAccelerometer, 		//传感器类型
				SensorManager.SENSOR_DELAY_NORMAL	//传感器事件传递的频度
		);
	}
	@Override
	protected void onPause(){//重写onPause方法
		super.onPause();
		mySensorManager.unregisterListener(mySensorListener);//取消注册监听器
	}
	private SensorEventListener mySensorListener =
			new SensorEventListener(){//开发实现了SensorEventListener接口的传感器监听器
				@Override
				public void onAccuracyChanged(Sensor sensor, int accuracy){}
				@Override
				public void onSensorChanged(SensorEvent event){
					float []values=event.values;//获取三个轴方向上的加速度值
					tvX.setText("x轴方向上的加速度为:"+values[0]);
					tvY.setText("y轴方向上的加速度为:"+values[1]);
					tvZ.setText("z轴方向上的加速度为:"+values[2]);
				}
			};

	@Override
	public boolean onKeyDown(int keyCode,KeyEvent e)
	{
		switch(keyCode)
		{
			case 4:
				System.exit(0);
				break;
		}
		return true;
	}
}

=====================================================================

猜你喜欢

转载自blog.csdn.net/qq_41910103/article/details/82899702