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 的**** 博客 ,全文地址请点击:https://blog.****.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;
}
}
=====================================================================