65.9K
CodeProject 正在变化。 阅读更多。
Home

在基于Intel® Atom™处理器的Android*手机和平板电脑上开发传感器应用程序

2013年12月2日

CPOL

14分钟阅读

viewsIcon

28137

本指南为应用程序开发者提供了 Android 传感器框架的介绍,并讨论了如何在基于 Intel® Atom™ 处理器的手机和平板电脑上使用一些通常可用的传感器。

访问 Intel® Android 开发者专区

本指南为应用程序开发者提供了 Android 传感器框架的介绍,并讨论了如何在基于 Intel® Atom™ 处理器的手机和平板电脑上使用一些通常可用的传感器。其中讨论的传感器包括运动传感器、位置传感器和环境传感器。尽管 GPS 在 Android 框架中不属于严格意义上的传感器,但本指南也讨论了基于 GPS 的位置服务。本指南中的讨论基于 Android 4.2 Jelly Bean。

基于 Intel® Atom™ 处理器的 Android 手机和平板电脑上的传感器

基于 Intel Atom 处理器的 Android 手机和平板电脑可以支持广泛的硬件传感器。这些传感器用于检测运动和位置变化,并报告环境参数。图 1 中的框图显示了典型 Intel Atom 处理器 Android 设备上可能的传感器配置。

图 1. 基于 Intel® Atom™ 的 Android 系统上的传感器

根据它们报告的数据,我们可以将 Android 传感器分为表 1 中所示的类别和类型。

运动传感器 加速度计
(TYPE_ACCELEROMETER)
测量设备的加速度(单位:m/s²) 运动检测
陀螺仪
(TYPE_GYROSCOPE)
测量设备的旋转速率 旋转检测
位置传感器 磁力计
(TYPE_MAGNETIC_FIELD)
测量地球的地磁场强度(单位:µT) 指南针
接近度
(TYPE_PROXIMITY)
测量物体接近设备的距离(单位:cm) 附近物体检测
GPS
(非 android.hardware.Sensor 类型)
获取设备的精确地理位置 精确地理位置检测
环境传感器 ALS
(TYPE_LIGHT)
测量环境光照强度(单位:lx) 自动屏幕亮度控制
气压计 测量环境气压(单位:mbar) 高度检测
表 1. Android 平台支持的传感器类型

Android 传感器框架

Android 传感器框架提供了访问传感器和传感器数据的方法,但 GPS 除外,GPS 通过 Android 位置服务访问。我们将在本文后面讨论这一点。传感器框架是 android.hardware 包的一部分。表 2 列出了传感器框架的主要类和接口。

名称 类型 描述
SensorManager 用于创建传感器服务实例。提供各种方法来访问传感器、注册和注销传感器事件监听器等。
Sensor 用于创建特定传感器实例。
SensorEvent 系统用于发布传感器数据。它包含原始传感器数据值、传感器类型、数据精度和时间戳。
SensorEventListener 接口 提供回调方法,用于在传感器数据或传感器精度发生变化时接收来自 SensorManager 的通知。
表 2. Android 平台传感器框架

获取传感器配置

设备制造商决定设备上可用的传感器。您必须通过调用传感器框架的 SensorManager getSensorList() 方法并传入 "Sensor.TYPE_ALL" 参数来在运行时发现可用的传感器。代码示例 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. 显示传感器列表的 Fragment**

传感器坐标系

传感器框架使用标准的 3 轴坐标系报告传感器数据,其中 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()

and 

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 中。

Sensor 类型 SensorEvent
数据 (m/s²)
描述
加速度计 TYPE_ACCELEROMETER values[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)at²

在许多情况下,我们从 *v0* 等于 0(设备开始移动之前)的条件开始,这简化了方程:

s = at²/2

由于重力,重力加速度(用符号 *g* 表示)作用于地球上的所有物体。无论物体质量如何,*g* 仅取决于物体位置的纬度,其值范围在 9.78 到 9.82 (m/s²) 之间。我们采用 *g* 的常规标准值:

g = 9.80665 (m/s²)

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

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

其中 *Sx*、*Sy* 和 *Sz* 分别是沿 x 轴、y 轴和 z 轴的位移,*Ax*、*Ay* 和 *Az* 分别是沿 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. 在迷宫游戏中考虑使用加速度计数据时的设备朝向**

陀螺仪

陀螺仪(或简称 gyro)测量设备绕 x、y 和 z 轴的旋转速率,如表 4 所示。陀螺仪的数据值可以是正数或负数。从轴的正半轴看向原点,如果绕轴的旋转是逆时针方向,则值为正;如果绕轴的旋转是顺时针方向,则值为负。我们也可以使用“右手定则”来确定陀螺仪数值的方向,如图 4 所示。

图 4. 使用“右手定则”确定正旋转方向
Sensor 类型 SensorEvent
数据 (rad/s)
描述
陀螺仪 TYPE_GYROSCOPE values[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 系统中最重要的用途是实现指南针。

Sensor 类型 SensorEvent
数据 (µT)
描述
磁力计 TYPE_MAGNETIC_FIELD values[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:接近传感器
Sensor 类型 SensorEvent
Data
描述
接近度 TYPE_PROXIMITY values[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:环境光传感器
Sensor 类型 SensorEvent
数据 (lx)
描述
ALS TYPE_LIGHT values[0] 设备周围的光照强度
代码示例 8 展示了如何实例化 ALS。
    …	
    private Sensor mALS;
    private SensorManager mSensorManager;

    …	
        mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
        mALS = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
    …
代码示例 8. 环境光传感器实例化**

气压计

应用程序可以使用大气压力传感器(气压计)(如表 8 所述)来计算设备当前位置的海拔高度。

表 8:大气压力传感器
Sensor 类型 SensorEvent
数据 (lx)
描述
气压计 TYPE_PRESSURE values[0] 环境气压(单位:mbar)
代码示例 9 展示了如何实例化气压计。
    …	
    private Sensor mBarometer;
    private SensorManager mSensorManager;

    …	
        mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
        mBarometer = mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
    …
代码示例 9. 气压计实例化**

传感器性能和优化指南

要在应用程序中使用传感器,您应该遵循以下最佳实践:

  • 使用前始终检查特定传感器的可用性
    Android 平台不要求设备必须包含或排除特定传感器。在使用应用程序中的传感器之前,请务必先检查它是否确实可用。
  • 始终注销传感器监听器
    如果实现传感器监听器的活动不再可见,或者对话框正在关闭,请注销传感器监听器。这可以通过活动的 onPause() 方法或对话框的 onStop() 方法来完成。否则,传感器将继续获取数据,从而导致电池耗尽。
  • 不要阻塞 onSensorChanged() 方法
    onSensorChanged() 方法经常被系统调用以报告传感器数据。您应该在此方法中放置尽可能少的逻辑。复杂的传感器数据计算应移至该方法之外。
  • 始终在真实设备上测试您的传感器应用程序
    本节中描述的所有传感器都是硬件传感器。Android 模拟器可能无法模拟特定传感器的功能和性能。

GPS 和位置

GPS(全球定位系统)是一个基于卫星的系统,可在世界范围内提供精确的地理位置信息。许多 Android 手机和平板电脑都提供 GPS。从许多角度来看,GPS 的行为都像一个位置传感器。它可以为设备上运行的应用程序提供精确的位置数据。在 Android 平台上,GPS 不直接由传感器框架管理。相反,Android 位置服务通过位置监听器回调访问 GPS 数据并将其传输给应用程序。

本节仅从硬件传感器的角度讨论 GPS 和位置服务。Android 4.2 和基于 Intel Atom 处理器 Android 手机和平板电脑提供的完整位置策略是一个更广泛的主题,超出了本节的范围。

Android 位置服务

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

名称 类型 描述
LocationManager 用于访问位置服务。提供各种方法来为应用程序请求定期位置更新或发送接近警报。
LocationProvider 抽象类 位置提供程序的抽象超类
Location 由位置提供程序用于封装地理数据
LocationListener 接口 用于接收来自 LocationManager 的位置通知
表 9:Android 平台位置服务

获取 GPS 位置更新

与使用传感器框架访问传感器数据类似,应用程序实现 LocationListener 接口中定义的几个回调方法来接收 GPS 位置更新。LocationManager 通过这些回调将 GPS 更新通知发送给应用程序(“不打扰,我们找你”原则)。

要在应用程序中访问 GPS 位置数据,您需要在 Android manifest 文件中请求精确定位访问权限(代码示例 10)。

<manifest …>
…
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
…  
</manifest>
代码示例 10. 在 Manifest 文件中请求精确定位访问权限**

代码示例 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 是 Intel 软件和服务部门的一名软件工程师。他目前正在从事 Intel® Atom™ 处理器规模赋能项目。

版权所有 © 2013 英特尔公司。保留所有权利。
*其他名称和品牌可能被声明为他人的财产。

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

其他相关文章

要详细了解 Intel 的 Android 开发工具,请访问 Intel® Android 开发者专区

© . All rights reserved.