3.Android-传感器开发-处理各种传感器配置[通俗易懂]

3.Android-传感器开发-处理各种传感器配置[通俗易懂] 下载LOFTER客户端Android并没有设定标准的传感器配置,这意味着设备制造商可能会把所有要装入设备的传感器配置都放进Android平台的设备中。这样,设备就可能包括了各种传感器的大量配置信息。比如,MotorolaXoom带有压力传感器,而SamsungNexusS就没有。同理,Xoom和N

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用



Android并没有设定标准的传感器配置,这意味着设备制造商可能会把所有要装入设备的传感器配置都放进Android平台的设备中。 这样,设备就可能包括了各种传感器的大量配置信息。比如,Motorola Xoom带有压力传感器,而Samsung Nexus S就没有。 同理,Xoom 和 Nexus S 都带有陀螺仪,但是 HTC Nexus One 却没有。 如果你的应用依赖于特定类型的传感器,你不得不确认设备是否提供了该传感器,以保证你的应用能成功运行。 你有两种方式来确认传感器的存在:

1.在运行时检测传感器并酌情启用或禁用应用程序的相应功能

2.使用Android Market过滤器来限定目标设备必须带有特定传感器

这两种方式将在下节介绍。


1.在运行时检测传感器

如果你的应用程序用到了特定类型的传感器,不过并不是必须使用它,那么你可以在运行时利用传感器框架来检测它,并酌情启用或禁用相应功能。 比如,一个导航应用也许会用到温度、压力、GPS和地磁传感器来显示温度、气压、位置和南北方位。 如果设备不提供压力传感器,你可以在运行时用传感器框架来检测压力传感器是否存在,然后在应用界面上关闭气压的显示。 例如,以下就是检测设备是否提供压力传感器的代码:

  private SensorManager mSensorManager;
  ...
  mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
  if (mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null){
  // Success! There's a pressure sensor.
  }
  else {
  // 失败!传感器不存在。
  }


2.用 Android Market 过滤器来限定目标设备必须带有指定的传感器配置

如果你要在 Android Market 上发布应用,你可以用 manifest 文件中的 <uses-feature> 元素把不提供所需传感器的设备过滤掉。 manifest 文件中的<uses-feature>元素有很多硬件描述符,利用它们你 可以根据传感器存在与否来对应用进行过滤。 可列出的传感器包括:加速计、气压计、罗盘(地磁)、陀螺仪、光线和邻近距离。 以下是滤除无加速计的 manifest 样例:

<uses-feature android:name="android.hardware.sensor.accelerometer"
              android:required="true" />

如果你把这个元素和描述符加入你的 manifest 中,则只有设备上带有加速计的用户才能在 Android Market 上看到你的应用。

仅当应用程序完全依赖于某指定传感器时,你才能把描述符设置 android:required=”true”。 如果你的应用中只有某些功能用到了传感器,而没有传感器的话仍然能正常运行,那么你可以把传感器列在 <uses-feature> 中,但应设置 android:required=”false” 。 这样可以确保没有此传感器的设备也能安装你的应用。 这也是项目管理实践中的最佳方案,有助于你时刻了解应用所需要的硬件特性。 请记住,如果你的应用用到了某个传感器,但没有此传感器也能运行,那你就必须在运行时检测传感器,并酌情禁用或启用相应功能。

====================

传感器的坐标系

通常,传感器框架使用标准的三维坐标系来表示数据。 对大多数传感器而言,该坐标系是以设备保持默认方向时的屏幕为参照物来定义的(参见图1)。 当设备保持默认方向时,X轴表示从左到右的水平方向,Y轴表示自下而上的垂直方向,Z轴表示相对屏幕表面由内而外的方向。 在这一坐标系中,屏幕背后的坐标用Z轴的负值表示。以下传感器会用到该坐标系:
加速度传感器
重力传感器
陀螺仪
线性加速度传感器
地磁传感器

要理解这个坐标系,最重要的一点就是,屏幕方向变化时坐标轴并不移动——也就是说,设备移动时传感器的坐标系永不改变。 这与 OpenGL 坐标系类似。

理解坐标系的另一个要点,你的应用不得假定设备的初始(默认)方向是竖直的。很多桌面设备的初始方向是横向放置的。 传感器的坐标系总是以设备的初始方向为基准的。

最后,如果你的应用需要把传感器数据与屏幕显示关联,则你要用 getRotation() 方法来确定屏幕的转动方向,然后用remapCoordinateSystem() 方法把传感器坐标映射为屏幕坐标。即使你的manifest文件已经指定为仅支持纵向显示,你仍需要这么做。

关于传感器坐标系的更多信息,包括如何处理屏幕旋转的相关信息,请参阅 One Screen Turn Deserves Another

注意: 某些传感器和方法的坐标系使用了地球参照系(而非设备参照系)。这些传感器和方法返回的数据表 示了相对大地坐标而言的设备运动和地理位置。详情请参阅getOrientation() 方法、 getRotationMatrix() 方法、方向传感器 和旋转矢量传感器

============================

访问和使用传感器的最佳实现方案

当你设计传感器相关的代码时,请确保遵守本节所列出的规范。这些规范作为最佳实现方案进行推荐,适用于需要使用传感器框架来访问传感器和读取传感器数据的任何人员。

1.注销传感器侦听器

当不再使用传感器或相关activity暂停时,确保及时注销传感器侦听器。 如果传感器侦听器已注册而相关activity被暂停,传感器仍会继续测量数据并消耗电池资源,除非你注销了传感器。 以下代码展示了如何利用 onPause()方法来注销侦听器:

private SensorManager mSensorManager;
  ...
@Override
protected void onPause() {
  super.onPause();
  mSensorManager.unregisterListener(this);
}

详情请参阅unregisterListener(SensorEventListener)

2.不要在模拟器上测试你的代码

目前无法在模拟器上测试传感器相关的代码,因为模拟器不能模拟传感器。你必须在物理设备上测试传感器相关代码。 不过,你可以利用传感器的模拟器来模拟传感器的输出。

3.不要阻塞 onSensorChanged() 方法

传感器数据以很高的频率在发生变化,这意味着系统可能会非常频繁地调用 onSensorChanged(SensorEvent) 方法。最佳实现方案是,在 onSensorChanged(SensorEvent) 方法中你应该尽可能少干些事情,以防止阻塞。如果你的应用需要对传感器数据进行过滤或剔除操作,则应该在 onSensorChanged(SensorEvent) 方法之外进行。

4.避免使用过时的方法或传感器类型

有几个方法和常量已经过时了。特别是 TYPE_ORIENTATION 传感器类型已经过时。要获取方位数据,你应该换用getOrientation() 方法。同样, TYPE_TEMPERATURE 传感器类型也已过时。在 Android 4.0 的设备上,你应该用TYPE_AMBIENT_TEMPERATURE 传感器类型来代替。

5.在使用前先验证传感器

在试图读取数据前,请确保先验证一下传感器是否存在。不要因为传感器很常用,就简单地假定它会存在。制造商并不需要在他们的设备上提供任何传感器。

6.谨慎选择传感器延时

当利用 registerListener() 方法注册传感器时,请确保为你的应用或使用场景选择了合适的发送频率。传感器能够以很高的频率发送数据。 请保证系统有能力发送其它数据,不要无谓浪费系统资源和消耗电池电量。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187941.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • WinForm和WPF的区别「建议收藏」

    一、控件的差异作为Windows桌面UI开发的两大.net开发库,WinForm和WPF同时存在着。之所以功能如此重合的两个库同时存在,是因为两者的底层差异非常大,WinForm底层依赖于传统的Win32API,特别是User32.dll;而WPF则底层依赖于Direct3D。而我们知道User32和Direct3D两者是平行存在,彼此独立的。WPF之前几乎所有的WindowsUI开发都依赖于User32,当然游戏除外。随着Direct3D的日趋成熟和显卡的普通性能提升,微软力图改变这种状况,所以开发

    2022年4月12日
    53
  • linux抓包查看请求接口源ip,linux 抓包「建议收藏」

    linux抓包查看请求接口源ip,linux 抓包「建议收藏」tcpdumphost172.16.29.40andport4600-X-s500tcpdump采用命令行方式,它的命令格式为:tcpdump[-adeflnNOpqStvx][-c数量][-F文件名][-i网络接口][-r文件名][-ssnaplen][-T类型][-w文件名][表达式]1.tcpdump的选项介绍-a…

    2022年10月14日
    0
  • 【机器学习】一文读懂正则化与LASSO回归,Ridge回归

    【机器学习】一文读懂正则化与LASSO回归,Ridge回归该文已经收录到专题机器学习进阶之路当中,欢迎大家关注。1.过拟合当样本特征很多,样本数相对较少时,模型容易陷入过拟合。为了缓解过拟合问题,有两种方法:方法一:减少特征数量(人工选择重要特征来保留,会丢弃部分信息)。方法二:正则化(减少特征参数的数量级)。2.正则化(Regularization)正则化是结构风险(损失函数+正则化项)最小化策略的体…

    2022年6月10日
    33
  • android gradle下载慢的解决方法

    android gradle下载慢的解决方法用androidstudio开发时,导入的项目经常会用到各种gradle版本,不知道为何androidstudio下载gradle极慢,最后总是失败。https://services.gradle.org/distributions/这是gradle各版本的官方网站。在这网站上下载速度很快。下载的文件放哪里呢?放到以下对应的目录中。C:\Users\admin\.gradle\wrapper\dists\gradle-6.7-all\cuy9mc7upwgwgeb72wkcrup

    2022年6月24日
    30
  • Java object转string「建议收藏」

    Java object转string「建议收藏」publicstaticcreateString(Objectobject){rerutnobject!=null?object.toString():””;}

    2022年4月30日
    57
  • JWPlayer_nplayer浏览器

    JWPlayer_nplayer浏览器网盘:https://pan.baidu.com/s/1mmtppZSFOni5tLI2TJWKrw<scripttype=”text/javascript”>varthePlayer;//保存当前播放器以便操作$(function(){thePlayer=jwplayer(‘container’).setu…

    2022年10月8日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号