传感器是第二代智能手机的重要标志之一,很多手机游戏和应用的某些功能依赖于传感器。android SDK 支持的传感器并不是每一部智能手机都全部支持,不同品牌,不同型号手机,内置的传感器皆有所不同。内置手机传感器可分为3类,分别是动作传感器,位置传感器,环境传感器。
android SDK 提供了Android Sensor Framework,可以用来访问当前设备的内置传感器。
我们需要重点了解这几个类:
<1>SensorManager
Android API:
SensorManager允许您访问设备的传感器
。 调用这个类的一个实例Context.getSystemService()
,参数为SENSOR_SERVICE
。该类提供了很多访问和枚举传感器,注册、注销传感器监听器的方法,而且还提供了与传感器精度,扫描频率,校正有关常量。
总是确保禁用不需要的传感器,尤其是当你的活动暂停。 未能这样做,会在几个小时内很大程度消耗电池。 注意,屏幕关闭时,系统将不会自动禁用传感器。
注意:不要使用这种机制触发传感器TriggerEventListener
。TYPE_SIGNIFICANT_MOTION
是一个触发传感器。
<2>Sensor
Android API:
代表一个传感器。 使用getSensorList(int)
得到可用的传感器的列表。
getSensorList(int) 原型:
public List<Sensor> getSensorList (int type)
<3>
这个类代表一个传感器
事件和持有信息如传感器的类型、时间戳、准确性和传感器的数据
。
使用的坐标系统的定义SensorEvent API。
定义的坐标系统是相对于屏幕的手机默认的方向。 轴不交换设备的屏幕取向的变化。
X轴是水平和指向右边,Y轴是垂直的点和Z轴指向外部的正面屏幕上。 在此系统中,坐标在屏幕后面有负Z值。
<4>SensorEventListener
用于从SensorManager时接收通知,传感器值已经改变了。
有两个回调函数
Public Methods
onAccuracyChanged(
Sensor sensor, int accuracy)
Called when the accuracy of the registered sensor has changed.
|
onSensorChanged(
SensorEvent event)
Called when sensor values have changed.
|
代码:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.shilixia.learnsensor.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="m3note传感器有:"
android:id="@+id/tv_showSensors"
android:layout_gravity="center_horizontal" />
</LinearLayout>
MainActivity.java
package com.shilixia.learnsensor;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private SensorManager sm;
private TextView tv_showSensors;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_showSensors = (TextView) findViewById(R.id.tv_showSensors);
sm = (SensorManager) getSystemService(SENSOR_SERVICE);
List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ALL);
//遍历枚举
for (Sensor sensor :sensors){
tv_showSensors.append(sensor.getName()+"\n");
}
}
}
结果如下:
有个小疑问,就是MPL MTK 是什么意思,貌似没有找到确切说明。。。???