赞
踩
作者:杜伟 (Intel)
在搭载英特尔® 凌动™ 处理器的 Android* 手机和平板电脑上开发传感器应用 [PDF 607KB]
本指南将为应用开发人员介绍 Android 传感器框架和讨论如何使用一些通常在搭载英特尔® 凌动™ 处理器的手机和平板电脑上提供的传感器。 包含在本讨论之列的有运动、位置和环境传感器。 按照 Android 框架的规定, GPS 未被严格视为一种传感器,尽管如此,本指南也会讨论基于 GPS 的位置服务。 本指南中的讨论以 Android 4.2 — Jelly Bean 为基础。
搭载英特尔凌动处理器的 Android 手机和平板电脑可以支持各种不同的硬件传感器。 这些传感器被用于检测运动和位置改变,以及报告周围环境参数。 图 1 中的方块图显示了在一个搭载英特尔凌动处理器的标准 Android 设备上可能会用到的传感器配置。
图 1. 搭载英特尔® 凌动™ 处理器的 Android 系统上的传感器
根据它们报告的数据,我们可以将 Android 传感器分成表 1 中所示的类和类型。
运动传感器 | 加速计 (TYPE_ACCELEROMETER) |
测量一台设备的加速度,按 m/s2 | 运动检测 |
陀螺仪 (TYPE_GYROSCOPE) |
测量一台设备的旋转速度 | 旋转检测 | |
位置传感器 | 磁力计 (TYPE_MAGNETIC_FIELD) |
测量地球的地磁场强度,按 µT | 罗盘 |
距离 (TYPE_PROXIMITY) |
测量一个物体的距离,按 cm | 附近物体检测 | |
GPS (不属于 android.hardware.Sensor 的类型) |
获得设备准确的地理位置 | 准确的地理位置检测 | |
环境传感器 | ALS (TYPE_LIGHT) |
测量环境光线等级,按 lx | 自动屏幕亮度控制 |
气压计 | 测量周围空气压力,按 mbar | 高度检测 |
Android 传感器框架提供了可以访问传感器和传感器数据的机制,而作为例外的 GPS 则可以通过 Android 位置服务进行访问。 我们稍后将在本文中讨论该问题。 本传感器框架是 android 硬件包的一部分。 表 2 列出了传感器框架的主类和接口。
姓名 | 类型 | 描述 |
---|---|---|
SensorManager | 类 | 用于创建一个传感器服务的实例。 提供各种方法访问传感器、注册和注销传感器事件侦听器等等。 |
传感器 | 类 | 用于创建一个特定传感器的实例。 |
SensorEvent | 类 | 系统在公布传感器数据时会用到该类。 包含原始传感器数据值、传感器类型、数据精度和一个时间戳。 |
SensorEventListener | 接口 | 提供回调方法,在传感器数据或传感器精度改变的情况下从 SensorManager 接收通知。 |
设备制造商决定设备上提供什么传感器。 您必须使用一个参数“Sensor.TYPE_ALL”调用传感器框架的 SensorManager getSensorList() 方法查看有哪些传感器在运行时可用。 代码示例 1 显示了一列可用的传感器,以及每个传感器的厂商、功耗和精度信息。
001
package com.intel.deviceinfo;
002
003
import java.util.ArrayList;
004
import java.util.HashMap;
005
import java.util.List;
006
import java.util.Map;
007
008
import android.app.Fragment;
009
import android.content.Context;
010
import android.hardware.Sensor;
011
import android.hardware.SensorManager;
012
import android.os.Bundle;
013
import android.view.LayoutInflater;
014
import android.view.View;
015
import android.view.ViewGroup;
016
import android.widget.AdapterView;
017
import android.widget.AdapterView.OnItemClickListener;
018
import android.widget.ListView;
019
import android.widget.SimpleAdapter;
020
021
public
class
SensorInfoFragment extends Fragment {
022
023
private
View mContentView;
024
025
private
ListView mSensorInfoList;
026
SimpleAdapter mSensorInfoListAdapter;
027
028
private
List<Sensor> mSensorList;
029
030
private
SensorManager mSensorManager;
031
032
@Override
033
public
void
onActivityCreated(Bundle savedInstanceState) {
034
super.onActivityCreated(savedInstanceState);
035
}
036
037
@Override
038
public
void
onPause()
039
{
040
super.onPause();
041
}
042
043
@Override
044
public
void
onResume()
045
{
046
super.onResume();
047
}
048
049
@Override
050
public
View onCreateView(LayoutInflater inflater, ViewGroup container,
051
Bundle savedInstanceState) {
052
mContentView = inflater.inflate(R.layout.content_sensorinfo_main, null);
053
mContentView.setDrawingCacheEnabled(
false
);
054
055
mSensorManager = (SensorManager)getActivity().getSystemService(Context.SENSOR_SERVICE);
056
057
mSensorInfoList = (ListView)mContentView.findViewById(R.id.listSensorInfo);
058
059
mSensorInfoList.setOnItemClickListener(
new
OnItemClickListener() {
060
061
@Override
062
public
void
onItemClick(AdapterView<?> arg0, View view,
int
index,
long
arg3) {
063
064
// with the index, figure out what sensor was pressed
065
Sensor sensor = mSensorList.get(index);
066
067
// pass the sensor to the dialog.
068
SensorDialog dialog =
new
SensorDialog(getActivity(), sensor);
069
070
dialog.setContentView(R.layout.sensor_display);
071
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。