Android自动的SensorManager使用起来已经很方便,但由于一些情况我们希望对其中的功能进行封装:

  • 只使用个别的sensor,功能相对单一
  • 要对sensor返回的raw data进行算法处理方可使用
  • 程序中多处频繁调用禁用sensor的数据

由于项目需要在很多页面调用手机的方向信息,故而对sensor的方向感应器进行简单的封装,源码如下:

package com.weicheche.android.service;import java.util.ArrayList;
import com.****.android.bean.ApplicationContext;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Handler;
import android.os.SystemClock;/*** * @ClassName: OrientationService * @Description: TODO(对android SDk自带的方向感应器进行封装) * @author xuyong yxy8023@gmail.com   * @date  2014年7月14日  上午2:24:10*/
public class OrientationService implements SensorEventListener {/** 对于想要监听方向变化的类,需要继承实现这个接口*/public static abstract interface OrientationListener{public abstract void onOrientationChanged(float orientatoin);}protected final Handler mHandler = new Handler();private SensorManager sensorManager;private Sensor mOrientationSensor;private float mTargetDirection = 0;private ArrayList<OrientationListener> listenerList = new ArrayList<OrientationListener>();private long delayMillis = 20;public OrientationService() {// TODO Auto-generated constructor stub
         init();}/*** * @Title: registerListener * @Description: TODO(将需要监听方向变化的类注册到OrientationService里,service中的sensor自动打开) * @param listener* @throws * @date  2014年7月14日  上午2:29:26 * Xuyong*/public void registerListener(OrientationListener listener){listenerList.add(listener);if(1 == listenerList.size()){// 刚刚有新的listener加入的时候打开方向感应器并启动更新线程
            startService();mHandler.postDelayed(mCompassViewUpdater, delayMillis);  // delayMillis毫秒执行一次方向更新
        }}/*** @Title: unregisterListener * @Description: TODO(再activity pause或者销毁时,讲listener从service移除,service会根据情况自动停止方向感应器的工作) * @param listener* @throws * @date  2014年7月14日  上午2:30:45 * Xuyong*/public void unregisterListener(OrientationListener listener){if((listenerList.remove(listener)) && 0 == listenerList.size()){// 如果成功移除listener后导致没有任何listener监听方向变化,暂停方向感应器
            stopService();}}/*** @Title: setDelayMillis * @Description: TODO(设置更新时间间隔,不得低于10ms) * @param delayMillis* @throws * @date  2014年7月14日  上午2:34:10 * Xuyong*/public void setDelayMillis(long delayMillis){if(delayMillis>10){this.delayMillis = delayMillis;}}/*** @Title: onDestory * @Description: TODO(移除所有的监听类,并停止方向感应器) * @throws * @date  2014年7月14日  上午2:34:46 * Xuyong*/public void onDestory(){listenerList.clear();stopService();}/*** @Title: init * @Description: TODO(初始化方向感应器) * @throws * @date  2014年7月14日  上午12:36:53 * Xuyong*/@SuppressWarnings("deprecation")private void init(){sensorManager = (SensorManager) ApplicationContext.getInstance().getContext().getSystemService(android.content.Context.SENSOR_SERVICE);try {mOrientationSensor = sensorManager.getSensorList(Sensor.TYPE_ORIENTATION).get(0);} catch (Exception e) {// TODO: handle exceptionmOrientationSensor = null;}        }private void stopService(){if (mOrientationSensor != null && sensorManager != null) {sensorManager.unregisterListener(this);}}private void startService(){if (mOrientationSensor != null && sensorManager != null) {sensorManager.registerListener(this, mOrientationSensor, SensorManager.SENSOR_DELAY_GAME);}}/*** 这个是更新指南针旋转的线程,handler的灵活使用,每delayMillis毫秒检测方向变化值(这样的机制不太好,可能会出现线程阻滞)*/protected Runnable mCompassViewUpdater = new Runnable() {@Overridepublic void run() {        if (listenerList.size() > 0) {// 有监听的时候,传递下去,并且注意传入顺序为倒序,保证最近的层最先响应。long startTime = SystemClock.uptimeMillis();for(int i = listenerList.size()-1; i>=0; i--){((OrientationListener) listenerList.get(i)).onOrientationChanged(mTargetDirection);}// 由于线程阻滞,可能带来延时,通过时间控制来弥补long endTime = SystemClock.uptimeMillis();long delayTime = endTime - startTime;delayTime = (delayTime > delayMillis)? 2:(delayMillis-delayTime);mHandler.postDelayed(mCompassViewUpdater, delayTime);    // 比定时器好
            }            }};/** no use currently*/@Overridepublic void onAccuracyChanged(Sensor arg0, int arg1) {// TODO Auto-generated method stub
    }/*** @Title: onSensorChanged * @Description: TODO(直接调用SDK自带的API获取方向信息,以后需要修改为根据加速度和地磁数据的方向计算) * @param event* @throws * @date  2014年7月11日  下午4:52:36 * Xuyong*/@SuppressWarnings("deprecation")@Overridepublic void onSensorChanged(SensorEvent event) {// TODO Auto-generated method stubswitch (event.sensor.getType()) {    // Note:改方法已经不鼓励使用,考虑在此处修改数据获取方向重新计算方向值case Sensor.TYPE_ORIENTATION:float direction = event.values[SensorManager.DATA_X] * -1.0f;mTargetDirection = (direction + 720) % 360; // 赋值给全局变量,让指南针旋转break;default:break;}}
}

调用方法:

对任意activity,继承实现OrientationListener,在onResume和onPause中分别注册和注下销listener,代码如下:

 1 public class xxxxActivity  implements  OrientationListener {
 2
 3     @Override
 4     protected void onPause() {
 5        super.onPause();
 6     ApplicationContext.getInstance().getOrientationService().unregisterListener(this);
 7     }
 8     9     @Override
10     public void onResume() {
11       super.onResume();
12       ApplicationContext.getInstance().getOrientationService().registerListener(this);
13     }
14
15     @Override
16     public void onOrientationChanged(float orientatoin) {
17         // TODO Auto-generated method stub
18         adapter.setOrientation(orientatoin);
19     }
20 }

转载于:https://www.cnblogs.com/yxy8023ustc/p/3841999.html

Android对方向感应器的封装调用相关推荐

  1. Android 方向感应器实现指南针

    1)Android的方向感应器是在是太强大了,同时也非常的复杂,研究了好久才理解. 首先借用一张网友的图片如下 x 方向就是手机的水平方向,右为正 y 方向就是手机的水平垂直方向,前为正 z 方向就是 ...

  2. Android屏幕方向调整的两种方式

    Android屏幕方向调整 作者:坚果 公众号:"大前端之旅" 华为云享专家,InfoQ签约作者,阿里云专家博主,51CTO博客首席体验官,开源项目GVA成员之一,专注于大前端技术 ...

  3. RTSP播放器高RTSP兼容推流网页无插件流媒体播放器EasyPlayer-RTSP关于MP4的封装调用流程介绍

    EasyPlayer-RTSP播放器是一套RTSP专用的播放器,包括有:Windows(支持IE插件,npapi插件).Android.iOS三个平台,是区别于市面上大部分的通用播放器,EasyPla ...

  4. Android学习方向

    有很多人问过这样的问题,"怎么学Android","Android的学习方向是什么","Android有没有前景".其实归根到底有3个方面: ...

  5. 社会化登录分享-Android SDK的二次封装和使用

    本系列文章将第三方的登录分享功能进行二次封装,统一接口调用,简化了接不同平台登录分享的步骤. 0 系列文章 系列一 Android SDK的二次封装和使用 系列二 源码解析 系列三 微信SDK接入 系 ...

  6. android 多态按钮,PM撸代码之Android【武侠篇:封装、继承、多态】

    80 PM撸代码之Android[武侠篇:封装.继承.多态] 这是Android系列的第六篇文章,在之前的一篇文章中,已经了解了面向对象的基础概念,这一篇将会通过武侠江湖的类比,讲解面向对象的更多内容 ...

  7. Unity Android 之 在 Unity 中直接调用打开其他应用apk的方法实现

    Unity Android 之 在 Unity 中直接调用打开其他应用apk的方法实现 目录 Unity Android 之 在 Unity 中直接调用打开其他应用apk的方法实现 一.简单介绍 二. ...

  8. Android Tencent X5 WebView 集成封装

    Android Tencent X5 WebView 集成封装 Cookie管理.进度监听.适配8.1系统等策略 这篇文章的目标就是怎么样快速封装X5WebView,如何有效的同步以及管理Cookie ...

  9. Android架构篇-3 网络接口封装

    Android架构篇-3 网络接口封装 实现功能: 1.暴露参数请求地址url.请求方法method.请求参数params.请求头header.请求响应response.https请求证书 2.支持g ...

最新文章

  1. kubernetes之kubedns部署
  2. C/C++:多个.cpp文件包括同一个.h头文件定义方法
  3. ubuntu jdk
  4. 最近公共祖先(Lowest_Common_Ancestors)
  5. 190707Python-Redis
  6. mysql 日志表设计_在mysql 使用binlog日志
  7. 零c语言txt下载,C语言问题c-0是什么意思
  8. 为什么读书了,还不如那些初中毕业的同学
  9. 贺利坚老师汇编课程54笔记:PF奇偶标志PARITY FLAG
  10. Web前端 — Bootstrap(2)
  11. Changing a remote's URL
  12. 关于x64dbg里面的Assemble
  13. java 新手入门电子书_java从入门到精通第6版电子书 PDF高清版
  14. 什么类型网站不利于seo优化
  15. 渗透测试工程师可以写进简历的技能介绍部分
  16. vscode退回快捷键
  17. debian 7 调整控制台分辨率
  18. amd服务器cpu性能排行榜,AMD 32核服务器CPU完胜Intel 22核顶级CPU
  19. web前端一张页面多少钱?
  20. 实验吧-简单的登录题

热门文章

  1. Linux 部署企业生产环境中最常用的 RAID10 磁盘阵列(虚拟机环境)
  2. 基于JAVA直播购物平台计算机毕业设计源码+系统+lw文档+部署
  3. 文献阅读:MT-DNN模型
  4. steam 相同元素相加_7500美元的存储型XSS漏洞(steam客户端)
  5. echarts geo 地图文字重叠(北京城区文字重叠优化)
  6. 初识 SDUI(Server-Driven UI,服务端驱动 UI)
  7. 021 矩阵相似性质
  8. uni-app adb安卓wifi无线调试
  9. 随机密码生成。编写程序在26个字母大小写和9个数字组成的列表中随机生成10个8位数密码
  10. 最全的解决方案,安卓手机gps定位慢怎么办?轻松几步搞定