在搭载英特尔® 凌动™ 处理器的 Android* 手机和平板电脑上开发传感器应用

下载文章

在搭载英特尔® 凌动™ 处理器的 Android* 手机和平板电脑上开发传感器应用 [PDF 607KB]

在搭载英特尔® 凌动™ 处理器的 Android* 手机和平板电脑上开发传感器应用


本指南将为应用开发人员介绍 Android 传感器框架和讨论如何使用一些通常在搭载英特尔® 凌动™ 处理器的手机和平板电脑上提供的传感器。 包含在本讨论之列的有运动、位置和环境传感器。 按照 Android 框架的规定, GPS 未被严格视为一种传感器,尽管如此,本指南也会讨论基于 GPS 的位置服务。 本指南中的讨论以 Android 4.2 — Jelly Bean 为基础。

搭载英特尔® 凌动™ 处理器的 Android* 手机和平板电脑上的传感器


搭载英特尔凌动处理器的 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高度检测

表 1. Android 平台支持的传感器类型
 

Android 传感器框架


Android 传感器框架提供了可以访问传感器和传感器数据的机制,而作为例外的 GPS 则可以通过 Android 位置服务进行访问。 我们稍后将在本文中讨论该问题。 本传感器框架是 android 硬件包的一部分。 表 2 列出了传感器框架的主类和接口。

姓名类型描述
SensorManager用于创建一个传感器服务的实例。 提供各种方法访问传感器、注册和注销传感器事件侦听器等等。
传感器用于创建一个特定传感器的实例。
SensorEvent系统在公布传感器数据时会用到该类。 包含原始传感器数据值、传感器类型、数据精度和一个时间戳。
SensorEventListener接口提供回调方法,在传感器数据或传感器精度改变的情况下从 SensorManager 接收通知。

表 2. Android 平台传感器框架

获取传感器配置

设备制造商决定设备上提供什么传感器。 您必须使用一个参数“Sensor.TYPE_ALL”调用传感器框架的 SensorManager getSensorList() 方法查看有哪些传感器在运行时可用。 代码示例 1 显示了一列可用的传感器,以及每个传感器的厂商、功耗和精度信息。

package com.intel.deviceinfo;
	
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Fragment;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
	
public class SensorInfoFragment extends Fragment {
	
    private View mContentView;
	
    private ListView mSensorInfoList;	
    SimpleAdapter mSensorInfoListAdapter;
	
    private List<Sensor> mSensorList;

    private SensorManager mSensorManager;
	
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }
	
    @Override
    public void onPause() 
    { 
        super.onPause();
    }
	
    @Override
    public void onResume() 
    {
        super.onResume();
    }
	
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        mContentView = inflater.inflate(R.layout.content_sensorinfo_main, null);
        mContentView.setDrawingCacheEnabled(false);
	
        mSensorManager = (SensorManager)getActivity().getSystemService(Context.SENSOR_SERVICE);
	
        mSensorInfoList = (ListView)mContentView.findViewById(R.id.listSensorInfo);
		
        mSensorInfoList.setOnItemClickListener( new OnItemClickListener() {
			
            @Override
            public void onItemClick(AdapterView<?> arg0, View view, int index, long arg3) {
				
                // with the index, figure out what sensor was pressed
                Sensor sensor = mSensorList.get(index);
				
                // pass the sensor to the dialog.
                SensorDialog dialog = new SensorDialog(getActivity(), sensor);

                dialog.setContentView(R.layout.sensor_display);
                dialog.setTitle("Sensor Data");
                dialog.show();
            }
        });
		
        return mContentView;
    }
	
    void updateContent(int category, int position) {
        mSensorInfoListAdapter = new SimpleAdapter(getActivity(), 
	    getData() , android.R.layout.simple_list_item_2,
	    new String[] {
	        "NAME",
	        "VALUE"
	    },
	    new int[] { android.R.id.text1, android.R.id.text2 });
	mSensorInfoList.setAdapter(mSensorInfoListAdapter);
    }
	
	
    protected void addItem(List<Map<String, String>> data, String name, String value)   {
        Map<String, String> temp = new HashMap<String, String>();
        temp.put("NAME", name);
        temp.put("VALUE", value);
        data.add(temp);
    }
	
	
    private List<? extends Map<String, ?>> getData() {
        List<Map<String, String>> myData = new ArrayList<Map<String, String>>();
        mSensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
		
        for (Sensor sensor : mSensorList ) {
            addItem(myData, sensor.getName(),  "Vendor: " + sensor.getVendor() + ", min. delay: " + sensor.getMinDelay() +", power while in use: " + sensor.getPower() + "mA, maximum range: " + sensor.getMaximumRange() + ", resolution: " + sensor.getResolution());
        }
        return myData;
    }
}

代码示例 1显示传感器列表的部分代码**

传感器坐标系

传感器框架使用一个标准的三轴坐标系报告传感器数据,此时 X、Y 和 Z 在 SensorEvent对象中分别由值 values[0]、values[1] 和 values[2] 代表。

一些传感器 — 诸如光线、温度、距离和压力传感器 — 只返回单一值。 因此就这些传感器而言,在 SensorEvent 对象中只使用 values[0]。

其他传感器在标准的 3 轴传感器坐标系中报告数据。 以下是这类传感器的列表:

  • 加速计
  • 重力传感器
  • 陀螺仪
  • 地磁场传感器

3 轴传感器坐标系相对于自然(默认)方向下设备的屏幕进行定义。 就手机而言,默认方向是纵向;而对平板电脑而言,自然方向就是横向。 当您按自然方向抓住一台设备时,x 轴 是水平的并指向右方,y 轴是垂直的并指向上方,而 z 轴则指向屏幕(正面)的外面。 图 2 表示的是手机的传感器坐标系,图 3 表示一台平板电脑。


2手机传感器坐标系


图 3. 平板电脑传感器坐标系

有关传感器坐标系需要注意的最重要一点就是:即使设备移动或改变它的方向,传感器的坐标系永不改变。

监控传感器事件

传感器框架通过 SensorEvent 对象报告传感器数据。 一个类可以监控一个特定的传感器数据,方法是通过实施 SensorEventListener 接口和在 SensorManager 上注册该特定传感器。 传感器框架通过以下两种按类实现的 SensorEventListener 回调方法将传感器状态的变化报告给类。

onAccuracyChanged()

以及

onSensorChanged()

代码示例 2 实现了在 SensorInfoFragment 示例中使用的 SensorDialog,我们在 “获取传感器配置” 一节中已经讨论了该示例。 

package com.intel.deviceinfo;

import android.app.Dialog;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;

public class SensorDialog extends Dialog implements SensorEventListener {
    Sensor mSensor;
    TextView mDataTxt;
    private SensorManager mSensorManager;

    public SensorDialog(Context ctx, Sensor sensor) {
        this(ctx);
        mSensor = sensor;
    }
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mDataTxt = (TextView) findViewById(R.id.sensorDataTxt);
        mDataTxt.setText("...");
        setTitle(mSensor.getName());
    }
	
    @Override
    protected void onStart() {
        super.onStart();
        mSensorManager.registerListener(this, mSensor,  SensorManager.SENSOR_DELAY_FASTEST);
    }
		
    @Override
    protected void onStop() {
        super.onStop();
        mSensorManager.unregisterListener(this, mSensor);
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() != mSensor.getType()) {
            return;
        }
        StringBuilder dataStrBuilder = new StringBuilder();
        if ((event.sensor.getType() == Sensor.TYPE_LIGHT)||
            (event.sensor.getType() == Sensor.TYPE_TEMPERATURE)||
            (event.sensor.getType() == Sensor.TYPE_PRESSURE)) {
            dataStrBuilder.append(String.format("Data: %.3fn", event.values[0]));
        }
        else{         
            dataStrBuilder.append( 
                String.format("Data: %.3f, %.3f, %.3fn", 
                event.values[0], event.values[1], event.values[2] ));
        }
        mDataTxt.setText(dataStrBuilder.toString());
    }
}

代码示例 2。显示传感器数值会话**

运动传感器

运动传感器被用于监控设备运动,诸如震动、旋转、摇摆或倾斜。 加速计和陀螺仪是两种在许多平板电脑和手机上都已提供的运动传感器。

运动传感器使用传感器坐标系报告数据,此时在 SensorEvent 对象中的三种数值 — values[0]、values[1] 和 values[2] — 分别代表 x-、y- 和 z-轴的数值。

为了充分理解运动传感器和在一个应用中如何使用数据,我们需要使用一些物理学公式,比如力、质量、加速度、牛顿运动定律和这些实体间的实时关系等。 如欲了解更多有关这些公式和关系的知识,请参考有关的物理学教科书或公共域软件源。

加速计

加速计测量设备上应用的加速度,表 3 中对有关的属性进行了总结。

传感器类型SensorEvent
数据(m/s2)
描述
加速计TYPE_ACCELEROMETERvalues[0]
values[1]
values[2]
沿 x 轴加速
沿 y 轴加速
沿 z 轴加速

表 3. 加速计

加速计的概念来源于牛顿第二运动定律:

a = F/m

一个物体的加速度是施加给该物体的净外力的结果。 外力包含地球上所有物体都必须承受的一种力,即重力。 它与施加给物体的净力 F 成正比,与物体的质量 m 成反比。

在我们的代码中,我们不会直接使用上面的等式,我们更关心的是在一段时间内加速度对设备的速度和位置产生的影响。 以下等式描述了一个物体的速度 v1、它的初始速度 v0、加速度 a 和时间 t 之间的关系:

v1 = v0 + at

为了计算物体的位移 s,我们可以使用以下等式:

s = v0t + (1/2)at2

最许多情况下我们以条件 v0 等于 0 (在设备开始移动之前)开始,可将等式简化为:

s = at2/2

因为重力的影响,以符号 g 代表的重力加速度将应用到地球上的所有物体上。 无论物体的质量如何,g 仅取决于物体位置所处的纬度,其值大约在 9.78 到 9.82 (m/s2)之间。 我们按照惯例针对 g 使用了一个标准值:

g = 9.80665 (m/s2)

由于加速计使用一个多维设备坐标系返回数值,因此在我们的代码中我们可以使用以下等式计算沿 x、y 和 z 轴的距离:

Sx = AxT2/2
Sy=AyT2/2
Sz=AzT2/2

此时SxSySz 分别代表 x 轴、y 轴和 z 轴,AxAyAz 分别代表 x 轴、y 轴和 z 轴上的加速度。 T 表示测量周期。

public class SensorDialog extends Dialog implements SensorEventListener {
    …	
    private Sensor mSensor;
    private SensorManager mSensorManager;
	
    public SensorDialog(Context context) {
        super(context);
        mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    …
}

代码示例 3加速计实例化**

有时我们并未使用所有的三维数据值。 而有时我们则需要考虑设备的方向。 例如,就迷宫应用而言,我们仅使用 x 轴和 y 轴的重力加速度根据设备的方向计算球体的运动方向和距离。 以下的代码段(代码示例 4)对这种逻辑进行了概括。

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) {
        return;
    } 
float accelX, accelY;
…
//detect the current rotation currentRotation from its “natural orientation”
//using the WindowManager
    switch (currentRotation) {
        case Surface.ROTATION_0:
            accelX = event.values[0];
            accelY = event.values[1];
            break;
        case Surface.ROTATION_90:
            accelX = -event.values[0];
            accelY = event.values[1];
            break;
        case Surface.ROTATION_180:
            accelX = -event.values[0];
            accelY = -event.values[1];
            break;
        case Surface.ROTATION_270:
            accelX = event.values[0];
            accelY = -event.values[1];
            break;
    }
    //calculate the ball’s moving distances along x, and y using accelX, accelY and the time delta
        …
    }
}

代码示例 4。在迷宫游戏中使用加速计数据时考虑设备方向**

陀螺仪


陀螺仪测量设备围绕 x、y 和 z 轴的旋转速度,如表 4 所示。陀螺仪数据值可以是正的,也可以是负的。 从沿着正半轴上的一个位置查看原点,如果旋转是绕轴的逆时针旋转,值就是正的;如果是绕轴的顺时针旋转,值则是负的。 我们也可以使用“右手定则”确定一个陀螺仪值的方向,如图 4 所示。


图 4. 使用“右手定则” 确定正旋转方向

传感器类型SensorEvent
Data (rad/s)
描述
陀螺仪TYPE_GYROSCOPEvalues[0]
values[1]
values[2]
绕 x 轴旋转速度
绕 y 轴旋转速度
绕 z 轴旋转速度

表 4. 陀螺仪

代码示例 5 展示了如何对一个陀螺仪进行实例化。

public class SensorDialog extends Dialog implements SensorEventListener {
    …	
    private Sensor mGyro;
    private SensorManager mSensorManager;
	
    public SensorDialog(Context context) {
        super(context);
        mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
        mGyro = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
    …
}

代码示例 5。陀螺仪实例化**

位置传感器

许多 Android 平板电脑支持两种位置传感器: 磁力计和距离传感器。 磁力计测量的是地球沿 x、y 和 z 轴的磁场强度,而距离传感器检测的是设备离另一个物体的距离。

磁力计

磁力计(如表 5 所示)在 Android 系统中最重要的用法就是实现罗盘。

传感器类型SensorEvent
Data (µT)
描述
磁力计TYPE_MAGNETIC_FIELDvalues[0]
values[1]
values[2]
沿 x 轴的地磁场强度
沿 y 轴的地磁场强度
沿 z 轴的地磁场强度

表 5. 磁力计

代码示例 6 展示了如何对一个磁力计进行实例化。

public class SensorDialog extends Dialog implements SensorEventListener {
    …	
    private Sensor mMagnetometer;
    private SensorManager mSensorManager;
	
    public SensorDialog(Context context) {
        super(context);
        mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
        mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    …
}

代码示例 6。磁力计实例化**

距离

距离传感器提供设备和另一个物体间的距离。 该设备可以使用它检测设备自身是否靠近用户(见表 6),进而确定用户是否正在打电话并在打电话时关闭显示屏。

表 6: 距离传感器

传感器类型SensorEvent
数据
描述
距离TYPE_PROXIMITYvalues[0]相距一个物体的距离,以 cm 计。一些距离传感器只能报告一个布尔值,指明物体是否足够近。

代码示例 7 展示了如何对一个距离传感器进行实例化。

public class SensorDialog extends Dialog implements SensorEventListener {
    …	
    private Sensor mProximity;
    private SensorManager mSensorManager;
	
    public SensorDialog(Context context) {
        super(context);
        mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
        mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
    …
}

代码示例 7。距离传感器实例化**

环境传感器

环境传感器检测并报告设备周围环境的参数,诸如光线、温度、压力或湿度。 环境光线传感器 (ALS) 和压力传感器(气压计)在许多 Android 平板电脑上都已提供。

环境光线传感器 (ALS)

表 7 中描述的环境光线传感器被系统用于检测周围环境的照度,并相应地自动调整屏幕的亮度。

表 7: 环境光线传感器

传感器类型SensorEvent
Data (lx)
描述
ALSTYPE_LIGHTvalues[0]设备周围的照度

代码示例 8 展示了如何对一个环境光线传感器进行实例化。

    …	
    private Sensor mALS;
    private SensorManager mSensorManager;

    …	
        mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
        mALS = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
    …

代码示例 8。距环境光线传感器实例化**

气压计

如表 8 所示,应用可以使用气压传感器(气压计)计算设备当前位置所处的高度。

表 8: 气压传感器

传感器类型SensorEvent
Data (lx)
描述
气压计TYPE_PRESSUREvalues[0]测量周围空气压力,按 mbar

代码示例 9 展示了如何对一个气压计进行实例化。

    …	
    private Sensor mBarometer;
    private SensorManager mSensorManager;

    …	
        mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
        mBarometer = mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
    …

代码示例 9. I气压计实例化**

传感器性能和优化指南

为了在您的应用中使用传感器,您应当遵循这些最佳实践:

  • 在使用特定传感器之前始终检查其可用性
    Android 平台不要求在设备上包含或排除一个特定的传感器。 在使用您的应用中的一个传感器之前,始终要首先检查其是否实际可用。
  • 始终注销传感器监听器
    如果实现传感器监听器的活动正变得不可见,或者会话即将停止,请注销传感器监听器。 可以通过活动的 onPause() 方法,或者会话的 onStop() 方法实现。 否则,传感器将继续获取数据,最终会耗尽电池。
  • 不要阻断 onSensorChanged() 方法
    onSensorChanged() 方法支持系统的频繁调用,负责报告传感器数据。 您应当在该方法中放置尽可能少的逻辑。 使用传感器数据执行的复杂计算应当从该方法中移除。
  • 始终在真实设备上测试您的传感器应用
    本节中描述的所有传感器都是硬件传感器。 Android 模拟器可能无法模拟特殊传感器的功能和性能。

GPS 和位置


GPS(全球定位系统)是一种基于卫星的系统,可以准确提供全球的地理位置信息。 GPS 现在在许多 Android 手机和平板电脑上都已提供。 在许多人看来,GPS 的功能就像一个位置传感器。 它可以为运行在设备上的应用提供准确的位置数据。 在 Android 平台上,GPS 并不是直接通过传感器框架管理。 相反,Android 位置服务会通过位置监听器回调访问 GPS 数据并将其传输给一个应用。

本节仅从一个硬件传感器的观点讨论 GPS 和位置服务。 Android 4.2 提供的完整的位置策略、搭载英特尔凌动处理器的 Android 手机和平板电脑等话题涉及的范围过大,因此不在本节讨论范围之内。

Android 位置服务

使用 GPS 并不是在一款 Android 设备上获取位置信息的唯一方法。 系统也可以使用 Wi-Fi*、蜂窝网络或其他的无线网络获得设备的当前位置。 GPS 和无线网络(包括 Wi-Fi 和蜂窝网络)对 Android 位置服务来说担当了 “位置提供程序”的角色。 表 9 列出了用于访问 Android 位置服务的主类和接口。

表 9: Android 平台位置服务

姓名类型描述
LocationManager用于访问位置服务。 提供了各种方法,可用于为一款应用请求周期性的位置更新,或者发送距离通知
LocationProvider抽象类适合位置提供程序的抽象超类
位置位置提供程序将其用于封装地理数据。
LocationListener接口用于从 LocationManager 接收位置通知

获取 GPS 位置更新

与使用传感器框架访问传感器数据的机制类似,应用可以实施 LocationListener 接口中定义的多种回调方法接收 GPS 位置更新。 LocationManager 通过这些回调将 GPS 更新通知发送给应用(即使用“程序模块等待调用”原则)。

为了访问该应用中的 GPS 位置数据,您需要在您的 Android 清单文件中请求精细定位访问权限(代码示例 10)。

<manifest …>
…
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
…  
</manifest>

代码示例 10。请求清单文件中的精细定位访问权限**

代码示例 11 显示了如何获取 GPS 更新并在一个会话文本视图上显示纬度和经度坐标。

package com.intel.deviceinfo;

import android.app.Dialog;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;

public class GpsDialog extends Dialog implements LocationListener {
    TextView mDataTxt;
    private LocationManager mLocationManager;
	
    public GpsDialog(Context context) {
        super(context);
        mLocationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
	       mDataTxt = (TextView) findViewById(R.id.sensorDataTxt);
          mDataTxt.setText("...");
		
        setTitle("Gps Data");
    }
	
    @Override
    protected void onStart() {
        super.onStart();
        mLocationManager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 0, 0, this);
    }
		
    @Override
    protected void onStop() {
        super.onStop();
        mLocationManager.removeUpdates(this);
    }

    @Override
    public void onStatusChanged(String provider, int status, 
        Bundle extras) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onLocationChanged(Location location) {
        StringBuilder dataStrBuilder = new StringBuilder();
        dataStrBuilder.append(String.format("Latitude: %.3f,   Logitude%.3fn", location.getLatitude(), location.getLongitude()));
        mDataTxt.setText(dataStrBuilder.toString());
		
    }
}

代码示例 11. 显示 GPS 位置数据会话**

GPS 位置性能与优化指南

GPS 可以为设备提供最准确的位置信息。 同时,它作为一种硬件特性也会消耗额外的电能。 GPS 也需要花费时间才能确定第一个位置。 您需要遵循以下指南才能开发 GPS 和位置感知型应用:

  • 考虑所有可用的位置提供程序
    除了 GPS_PROVIDER,还有 NETWORK_PROVIDER。 如果您的应用只需要使用大致的位置数据,您可以考虑使用 NETWORK_PROVIDER。
  • 使用缓存位置
    GPS 需要花费时间才能确定第一个位置 当您的应用正等待 GPS 获取准确的位置更新时,您可以先使用 LocationManager 的 getlastKnownLocation() 方法提供的位置完成部分工作。
  • 最大限度降低位置更新请求的频率和持续时间
    您应当仅在必要时请求位置更新,一旦您不在需要位置更新后,请立即在位置管理程序处将其注销。

总结


Android 平台为开发人员提供了访问一台设备的嵌入式传感器所需的 API。 这些传感器能够提供与设备当前运动、位置和周围环境条件有关的高精度原始数据。 在开发传感器应用时,您应当遵循该最佳实践改善性能同时提高能效。

关于作者

Miao Wei 是英特尔软件及服务事业部的软件工程师。 他现在主要负责与英特尔® 凌动™ 处理器有关的项目。



 


英特尔公司 © 2013 年版权所有。 所有权利受到保护。
* 其他的名称和品牌可能是其他所有者的资产。

** 该示例源代码根据英特尔示例源代码许可协议发布

Para obter informações mais completas sobre otimizações do compilador, consulte nosso aviso de otimização.