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)


相关推荐

  • eureka集群高可用配置[通俗易懂]

    eureka集群高可用配置[通俗易懂]网上讲这个东西的很多,抄来抄去的,大部分类似,多数没讲明白为什么那么配置。譬如eureka.client.register-with-eureka和fetch-registry是否要配置,配不配区别在哪里;eureka的客户端添加service-url时,是不是需要把所有的eureka的server地址都写上,还是只需要写一个server就可以了(因为server之间已经相互注册了)?如果写上了所…

  • sqlserver2008 sql使用rownumber分页

    sqlserver2008 sql使用rownumber分页@pageSize=2;@pageIndex=3;5=(@pageIndex-1)*@pageSize+1;6=@pageIndex*@pageSize;SELECT*FROM(SELECTROW_NUMBER()OVER(ORDERBYcdateASC)AS’RowNumber’,*FROMbw_push_order_log)…

  • 基于ArduinoUNO的LD3320语音识别+SYN6288语音合成的智能分类垃圾桶

    基于ArduinoUNO的LD3320语音识别+SYN6288语音合成的智能分类垃圾桶文章目录写在前面器件连接部分代码运行结果小结写在前面接上一篇文章,这次是集合了语音识别+语音合成(就是语音播报实现一种反馈)+SG90舵机实现垃圾桶的开与闭,给出上篇文章链接,如果对LD3320语音识别还有问题的朋友可以看看:LD3320语音识别模块与Arduino软串口通讯实现开关灯功能发现还是有好多人都在做这个,当玩具也好,毕设也好,这个都是一个好玩又有趣的项目。因为这只是现在的一门小课…

  • ppt导出pdf后非矢量图图片失真的解决办法

    ppt导出pdf后非矢量图图片失真的解决办法背景明明有了高清的图片,为什么导入PPT后图像反而模糊了?导出pdf后图片更是惨不忍睹?今天为了解决这个问题,我又折腾了一会儿。准备AdobeAcrobatproPPTPhotoZoom获得高清图片一般用别的软件导出图片可以调节格式分辨率,采用矢量图或者分辨率高的位图就可以,然而从网上获取的图片就没办法了。这时候你需要一款经久不衰的神器,PhotoZoom。他界面是这样的,可以方便的

  • Tomcat常见问题解决 – The web application appears to have started a thread named [FileWatchdog]

    Tomcat常见问题解决 – The web application appears to have started a thread named [FileWatchdog]Tomcat常见问题解决 – The web application appears to have started a thread named [FileWatchdog]

  • 转–《煮酒探西游》吴闲云

    转–《煮酒探西游》吴闲云煮酒探西游吴闲云目录(1)唐僧的父母之谜(2)《西游记》中最大的秘密(3)殷小姐为什么要绣球招亲(4)唐僧的亲爹究竟是谁(5)小姐为什么要弃婴江中(6)唐僧复仇(7)观音菩萨的黑帐(8)唐僧的相貌之谜(9)唐僧为什么要取经(10)唐太宗地府还魂(11)真经究竟有什么作用(12)取经难,传经更难(13)观音菩萨是一个什么样的人

发表回复

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

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