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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • esp32cam远程监控(局域网的组成)

    ESP32-CAM实现局域网/远程视频传输手上这个ESP32-CAM买回来已经放了一个学期了,最近才开始玩,试了试用它来实现视频传输。局域网的视频传输比较简单,基本能正确把例程烧进去就可以了,这篇文章主要记录一下远程视频传输的实现。ESP32-CAM实现局域网/远程视频传输ESP32-CAM实现局域网/远程视频传输方法一:PlatfromIO例程+路由器内网穿透条件1.直接使用Platfr…

  • MPEG-4、MPEG-4/AVC、H.264之间的联系与区别「建议收藏」

    MPEG-4、MPEG-4/AVC、H.264之间的联系与区别「建议收藏」当你在网上下载视频时,经常会看到MPEG-4、h.264等等词汇,它们之间有什么关系吗?  在视频编解码技术定义方面有两大标准机构。一个是国际电信联盟(ITU)致力于电信应用,已经开发了用于低比特率视频电话的H.26x标准,其中包括H.261、H.262、H.263与 H.264;另一个是国际标准化组织(ISO)主要针对消费类应用,已经针对运动图像压缩定义了MPEG

  • 基于对话框的MFC程序实现RTL风格的一种方式[通俗易懂]

    基于对话框的MFC程序实现RTL风格的一种方式[通俗易懂]操作系统使用阿拉伯语时,微软操作系统为了适应阿拉伯语地区和希伯来语地区自右向左的阅读习惯,提供了独特的RTL的界面风格。怎么才能实现应用程序和操作系统保持一致的RTL风格呢?搜索了一些关于RTL界面实现的资料,网上大多数是通过遍历程序窗口,依次调用ModifyStyleEx系统API来实现的。基于对话框的MFC程序的窗口样式是通过资源文件预先定义的。基于对话框的…

  • webstorm怎么激活破解方法

    webstorm怎么激活破解方法,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 黑盒测试和白盒测试是软件测试的两种基本方法_软件测试白盒测试方法

    黑盒测试和白盒测试是软件测试的两种基本方法_软件测试白盒测试方法在这篇文章中,我们将讲解白盒测试的基本概念,以及四大常用的白盒测试方法。

    2022年10月24日
  • printwriter用法_class类反射方法

    printwriter用法_class类反射方法1.java.io.PrintWriter是java中很常见的一个类,该类可用来创建一个文件并向文本文件写入数据。可以理解为java中的文件输出,java中的文件输入则是java.io.File。2.常用的构造方法:注:java.io.PrintWriter的构造方法并不局限于一下范例,java.io.PrintWriter构造方法的参数也可以是字节流。因为本篇文章主要讲关于文件的操作,所以参数是…

发表回复

您的电子邮箱地址不会被公开。

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