- Android 系统概述
- 什么是智能手机?智能手机操作系统有哪些?
- Android(安卓)是什么?
- Android 系统架构(图解)
- Android 7 新特性介绍
- Android 开发环境搭建
- Android 开发环境搭建教程(图解)
- Android SDK 是什么?
- 通过 Android Studio 创建 Android 应用程序(附带解析)
- Android Studio 的基本调试
- Android 应用程序结构:Android 组件和资源详解
- Android 四大核心组件:Activity+Service+BroadcastReceiver+ContentProvider
- Android Activity 组件及其生命周期
- Android 资源(res 和 assets 目录)
- AndroidManifest.xml 配置文件详解
- Android App Widgets 组件详解
- Android 系统的进程和线程
- Android GUI(图形用户界面)开发
- Android View 和 ViewGroup
- Android 使用 XML 文件定义用户界面
- Android 五大布局:FrameLayout、LinearLayout、AbsoluteLayout、RelativeLayout 和 TableLayout
- Android 创建 Widget 组件实例详解
- Android Button:按钮控件
- Android CheckBox:多选按钮控件
- Android RadioGroup:单选按钮控件
- Android TextView:文本框控件
- Android EditText:编辑框控件
- Android Spinner:下拉列表控件
- Android AutoCompleteTextView:自动完成文本框控件
- Android DatePicker 和 TimePicker:时间日期选择器
- Android ProgressBar:进度条控件
- Android ScrollView:滚动视图
- Android SeekBar:拖动条控件
- Android RatingBar:评价条控件
- Android ImageView 和 ImageButton:图片视图和图片按钮
- Android ImageSwitcher 和 Gallery:图片切换器和图库
- Android GridView:网格视图
- Android Tab:面板标签控件
- Android 菜单:选项菜单+上下文菜单+子菜单
- Android Bitmap(点阵图像、绘制图像)
- Android 对话框(AlertDialog+ProgressDialog)
- Android 多窗口模式(分屏模式)
- Android 事件监听器和回调方法
- Android 电话短信拍照开发教程
- Android Intent:不同应用程序之间通信的桥梁
- Android 实现拨打电话功能
- Android 实现接收短信和发送短信功能
- Android 调用相机进行拍照
- Android 多媒体开发
- Android Service 生命周期和使用方法
- Android BroadcastReceiver:接收广播
- Android 音频以及音频播放器开发实例
- Android MediaRecorder 录制音频
- Android 视频以及视频播放器实例
- Android Camera 相机以及相机程序开发实例
- Android MediaRecorder 录制视频
- Android 数据存储(SQLite 数据库、Android App 数据备份和恢复 )
- Android 数据存储之 SharedPreferences
- Android 数据存储之文件存储
- Android 使用 SQLite 数据库存数数据
- Android SQLite 数据库操作实例
- Android ContentProvider(内容提供者)
- Android 使用系统提供的 ContentProvider
- Android 自定义 ContentProvider
- Android 使用自定义 ContentProvider
- Google App Engine 是什么?
- Android APP 数据备份与恢复
- Android BackupAgent 实现数据备份与恢复
- Android BackupAgentHelper 实现数据备份与恢复
- Android 网络编程
- 借助 GPE 让 Android APP 和 Google App Engine 通信
- Android HTTP 通信
- Android HttpURLConnection 访问互联网资源
- Android 通过 GET 方式获取互联网资源
- Android 通过 POST 方式获取互联网资源
- Android Socket 编程(附带实例)
- Bluetooth(蓝牙)是什么?
- Android 蓝牙通信开发教程(详解版)
- Android 蓝牙通信开发实例演示
- WIFI(无线局域网)是什么?
- Android WiFi 开发(WiFi 编程)实例演示
- WIFI Direct(WIFI 直连)是什么?
- Android WIFI Direct 开发教程
- Android WIFI Direct 开发实例演示
- NFC(近场通信)是什么?
- Android NFC 开发教程
- Android USB 开发简介
- Android USB 附件模式开发教程
- Android USB 主机模式开发教程
- Android SIP 开发教程
- Android 智能传感器
- LBS(位置服务)和 GPS(全球定位系统)简介
- Android LBS 位置服务开发简介
- Android GPS 定位开发教程
- Google Map API 开发简介
- Android Google Map API Key 详细申请步骤
- Google Map API 开发 Android 地图应用实例
- Android 传感器开发教程
- Android 运动传感器开发教程
- Android 位置传感器开发教程
- Android 环境传感器开发教程
- Android 绘图(2D 绘图、3D 绘图)
- Android 2D 绘图开发简介
- Android 使用自定义 View 绘图
- Android 使用 Bitmap 绘图
- Android 使用 SurfaceView 绘制静态图像
- Android 使用 SurfaceView 绘制动态图像
- Android Drawable 开发简介
- Android 3D 绘图开发简介
- Android 硬件加速开发简介
- Android RenderScript 开发简介
- Android App 的国际化和本地化
- Android 国际化和本地化开发简介
- Android 手机区域设置详细步骤
- Android 未本地化应用开发教程
- Android 本地化应用开发教程
- Android 文本输入与复制粘贴
- Android 剪贴板框架开发简介
- Android 剪贴板数据转文本开发简介
- Android 复制粘贴开发教程
- Android Content Provider 复制复杂数据开发教程
- Android 一键复制粘贴开发实例
- Android 企业级应用开发
- Android 设备管理 API 概述
- Android 开发设备管理 API 应用教程
- Android 文本语音 API 开发教程
- Android TV 应用开发教程
- Android TV 应用开发实例
- Android 可穿戴设备应用开发教程
- Android 应用程序的发布
- Android 应用程序发布的步骤
- Android 为什么要为应用程序签名?
- Android 导出未签名应用程序开发步骤
- Android 生成签名文件开发教程
- Android 应用程序签名开发教程
- zipalign 工具优化应用程序开发简介
- Google Play Store( Android Market)发布简介
Android 传感器开发教程
大部分的 Android 设备都带有内建的用于测量运动、方位以及各种环境条件的传感器。这些传感器能够提供高精度、高准确性的原始数据,当用户需要监控设备的三维运动和位置或者监控周围条件的变换时,这些传感器很有效。
举例来讲,一个游戏可以通过不断读取设备的重力传感器的方式推断用户的动作和运动,如倾斜、摇晃、旋转、摆动等;一个天气相关的应用程序可以通过设备的温度传感器和湿度传感器计算并报告露水情况;一个旅游相关的应用程序可以根据地磁传感器和加速传感器模拟一个罗盘。
总的来讲,Android 平台支持三种类型的传感器。
1) 运动传感器(Motion Sensors)
这种类型的传感器用于在三维方向测量加速力和旋转力,包括加速度传感器、重力传感器、陀螺仪和旋转向量传感器等。
2) 环境传感器(Environmental Sensors)
这种类型的传感器用于测量各种环境参量,如环境温度、气压和湿度等,例如气压计、光度计和温度计等。
3) 位置传感器(Position Sensors)
这种类型的传感器用于测量设备的物理位置,包括方向传感器和磁力计等。
开发者可以访问设备上支持的传感器,并且通过 Android 传感器框架获取相关的原始数据。
Android 传感器框架提供几个类和接口帮助开发者开发完成与传感器相关的各种任务。例如,可以使用传感器框架完成如下任务:
- 获取当前设备支持的传感器类型。
- 获取某个传感器的具体信息,例如最大范围、生产商、功耗和分辨率等。
- 从传感器获取原始信息以及获取信息的频率。
- 注册或者注销用于监测传感器变化的监听器。
Android 的传感器框架允许开发者访问当前设备上各种类型的传感器,包括硬件传感器和软件传感器。
硬件传感器指内建在 Android 设备中的硬件部分,它们直接测量具体数据并传递给应用程序。
软件传感器不是以硬件方式存在于设备中的,而是软件模拟出来的,因此又叫虚拟传感器或者合成传感器。它们的数据来自一个或者多个硬件传感器。线性加速度传感器和重力传感器是典型的软件传感器。
表 1 所示为 Android 平台支持的所有的传感器类型。
| 传感器 | 类型 | 用途 |
|---|---|---|
| TYPE_ACCELEROMETER | 硬件传感器 | 运动探测 |
| TYPE_AMBIENT_TEMPERATURE | 硬件传感器 | 监控环境温度 |
| TYPE_GRAVITY | 软件或者硬件传感器 | 运动探测 |
| TYPE_GYROSCOPE | 硬件传感器 | 旋转探测 |
| TYPE_LIGHT | 硬件传感器 | 控制屏幕亮度 |
| TYPE_LINEAR_ACCELERATION | 软件或者硬件传感器 | 探测某个方向的加速度 |
| TYPE_MAGNETIC_FIELD | 硬件传感器 | 创建罗盘 |
| TYPE_ORIENTATION | 软件传感器 | 探测设备方位 |
| TYPE_PRESSURE | 硬件传感器 | 探测空气压力变化 |
| TYPE_PROXIMITY | 硬件传感器 | 用于监测打电话时手机与耳朵的距离 |
| TYPE_RELATIVE_HUMIDITY | 硬件传感器 | 探测结露点、相对和绝对湿度 |
| TYPE_ROTATION_VECTOR | 软件或者硬件传感器 | 运动检测和旋转检测 |
| TYPE_TEMPERATURE | 硬件传感器 | 探测温度 |
以上传感器类型在 Android N 系统中都获得了支持,但是 TYPE_ ORIENTATION 和 TYPE_TEMPERATURE 两种类型已经被弃用。
如果应用程序要被发布在 Google Play 上,则可以通过应用程序的 Manifest 配置文件中的 <uses=features> 属性来设置应用程序的发布对象。例如以下代码:
<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true"/>
可以保证应用程序只能被带有加速度传感器的手机设备搜索到。
Android 传感器框架存放在 android.hardware 包中,主要涉及以下几个类和接口。
1)SensorManager
这个类被用于创建传感器服务实例。该类提供了访问和罗列传感器的各种方法,用于注册和注销传感器事件监听器并获取方向信息。该类也提供了几个常量,用于报告传感器的精度、数据获取率和校正传感器。
2)Sensor
这个类被用作创建某个特定传感器的实例。该类提供了用于确定传感器能力的各种方法。
3)SensorEvent
该类被用作创建传感器事件对象。传感器事件对象包含传感器事件的相关信息,包括原始的传感器数据、传感器类型、产生的事件、事件精度以及事件发生的时间戳等。
4)SensorEventListener
该接口包含两个回调方法。当传感器的值发生改变或者传感器的精度发生改变时,相关方法就会自动被调用。
通过传感器框架 API,开发者主要可以完成两件事:
- 识别传感器并且明确传感器功能。
- 监听传感器事件并进行处理。
标识传感器
识别传感器的工作要通过 SensorManager 类的实例来完成。获取 SensorManager 实例的代码如下:
private SensorManager mSensorManager;
...
mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
通过 SensorManager 获取当前设备的传感器列表的代码如下:
List<Sensor>deviceSensors=mSensorManager.getSensorList(Sensor.TYPE_ALL);
要获取特定类型的传感器实例,使用 SensorManager.getDefaultSensor() 方法。以下代码演示了获取磁场传感器的方法:
if(mSensorManager.getDefaultSensor(sensor.TYPE_MAGNETIC_FIELD) != null){
//Success!There's a magnetometer.
}else{
//Failure! No magnetometer.
}以下示例代码演示了获取当前设备的重力传感器的过程。要求重力传感器的销售商是“GoogleInc.”,如果满足该条件的传感器不存在,则尝试使用加速度传感器:
private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
if(mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY)!=null){
List<Sensor>gravSensors=mSensorManager.getSensorList(Sensor.TYPE_GRAVITY)
for(int i=0;i<gravSensors.size();i++){
if((gravSensors.get(i).getVendor().contains("Google Inc."))&&(gravSensors.get(i).getVersion()==3)){
// Use the version 3 gravity sensor.
mSensor=gravSensors.get (i);
}
}
}
else{
// Use the accelerometer.
if(mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)!=null){
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
else{
// Sorry, there are no accelerometers on your device.
// You can't play this game.
}传感器事件处理
传感器事件监听器接口提供两个方法:onAccuracyChanged() 和 onSensorChanged() 方法,分别对传感器的精度改变和传感器的数值改变事件进行处理。
以下代码演示了从光敏传感器获取数据的过程:
public class SensorActivity extends Activity implements SensorEventListener {
private SensorManager mSensorManager;
private Sensor mLight;
@Override
public final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
}
@Override
public final void onAccuracyChanged(Sensor sensor, int accuracy) {
// Do something here if sensor accuracy changes.
}
@Override
public final void onSensorChanged(SensorEvent event) {
// The light sensor returns a single value.
// Many sensors return 3 values, one for each axis,
float lux = event.values[0];
//Do something with this sensor value.
}
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
}其中:
@Override
protected void onPause(){
super.onPause();
mSensorManager.unregisterListener(this);
}这几行代码是很有必要的。如果当 Activity 暂停的时候,传感器的事件监听器没有被注销,则该监听器还会一直从传感器获取信息,这样会耗费大量的电力。
因此,当 Activity 暂停时,一定要使用上述代码在 onPause() 方法中注销对传感器事件的监听。
当 Activity 再次被激活时,在 onResume() 方法中使用 SensorManager.registerListener() 方法重新注册传感器事件监听器。
mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
表示注册的传感器事件监听器为当前类的实例,被监听的传感器为 mLight,获取数据的频率为 SENSOR_DELAY_NORMAL。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论