Android--保持加速度传感器在屏幕关闭后运行(收集)
由于写论文需要,需要用手机加速度采集数据,关于android加速度传感器的介绍网上一抓一大把,但大多都是大同小异,跟官网文档差不多。自己写了个取加速度传感器的APK,发现数据有点不对劲,原理屏幕一关后,系统就自动把各种传感器给停掉了,网上找了很久,发现一些可用的资源。
1、查看手机是否支持锁屏后继续运行传感器
有些手机可以支持后台取传感器数据,有些手机不行,这与硬件厂商具体实现有关,像GPS这些传感器都是很耗电的,厂商也是出于电源管理的考虑,这里是一个不完全列表,总结哪些软件支持屏幕关闭后依然运行传感器。这里更有一款APK(Accelerometer Frequency)专门查看你的手机是否支持。
如果你的手机不支持,那还是不要折腾了,换了设备试试。
2、实现方法
我主要参考了
1)http://blog.kozaxinan.com/2012/08/using-accelerometer-when-screen-off_16.html
星期天我按他们的方法实现了一下,主要思想就是申请锁屏后CPU不休眠:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
wl.acquire();
..
wl.release();
我把service写成activity的一个内部类,而我把申请电源管理的命令放在了service的Oncreate()方法里,之前一直纳闷,明明我的手机检测支持的,锁屏后还是没有取数据,而且连接USB时,锁屏后继续取加速度传感器数据,而拔掉USB后就停了,到处找原因,后来才发现service的OnCreate()方法没执行,坑了我。
丑又丑点,我把电源管理申请放在了Activity的onCreate()方法中,结果可行了,把代码放上来。

public class AccleratePersist extends Activity {
private static final String TAG = "AccleratePersist";
private static final int DELAY = SensorManager.SENSOR_DELAY_NORMAL;
private static boolean STOP = true;// 开始暂停按钮
private SensorManager mSensorManager;
private WakeLock mWakeLock;
private TextView accView;// 显示加速度值
private StringBuilder builder = new StringBuilder();
private long lastTimestamp = 0;
private PersistService mySerivece;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
accView = (TextView) this.findViewById(R.id.accValue);
final Button stopButton = (Button) this.findViewById(R.id.stopButton);// 停止测量按钮
final Button clearButton = (Button) this.findViewById(R.id.clear); // 清除数据
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
if (view == stopButton) {
STOP = !STOP;
setMeasure();
} else if (view == clearButton) {
builder = new StringBuilder();
accView.setText("");
}
}
@SuppressLint("Wakelock")
private void setMeasure() {
if (STOP) {// 停止键按下后,取消监听,是否电源
stopButton.setText("继续");
mSensorManager.unregisterListener(mySerivece);
mWakeLock.release();
} else {
stopButton.setText("停止");
mWakeLock.acquire();// 屏幕熄后,CPU继续运行
mSensorManager
.registerListener(
mySerivece,
mSensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
DELAY);
}
}
};
clearButton.setOnClickListener(onClickListener);
stopButton.setOnClickListener(onClickListener);
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mySerivece = new PersistService();
PowerManager manager = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);// CPU保存运行
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);// 屏幕熄掉后依然运行
filter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(mySerivece.mReceiver, filter);
}
class PersistService extends Service implements SensorEventListener {
private float[] accValue = new float[3];
public BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (!STOP
&& !intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
return;
}
if (mSensorManager != null) {//取消监听后重写监听,以保持后台运行
mSensorManager.unregisterListener(PersistService.this);
mSensorManager
.registerListener(
PersistService.this,
mSensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
}
}
};
public void onAccuracyChanged(Sensor sensor, int accuracy) {
Log.i(TAG, "PersistService.onAccuracyChanged().");
}
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
Log.i(TAG, "PersistService.TYPE_ACCELEROMETER.");
accValue = sensorEvent.values;
for (int i = 0; i < 3; i++) {
builder.append((int) accValue[i]);
builder.append(",");
}
builder.append((sensorEvent.timestamp - lastTimestamp) / 1000000);// 采样时间差
builder.append("\n");
accView.setText(builder.toString());
lastTimestamp = sensorEvent.timestamp;
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
}

记得加一个权限: <uses-permission android:name="android.permission.WAKE_LOCK" />
有问题欢迎交流。
转载请注明出处:http://www.cnblogs.com/fengfenggirl
Android--保持加速度传感器在屏幕关闭后运行(收集)的更多相关文章
- Android--保持加速度传感器在屏幕关闭后运行
由于写论文需要,需要用手机加速度采集数据,关于android加速度传感器的介绍网上一抓一大把,但大多都是大同小异,跟官网文档差不多.自己写了个取加速度传感器的APK,发现数据有点不对劲,原理屏幕一关后 ...
- Android 使用加速度传感器实现摇一摇功能及优化
如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 目前很多应用已经实现了摇一摇功能,这里通过讲解该功能的原理及实现回顾一下加速度传感器的使用: 1.首先获得 ...
- 玩转Android之加速度传感器的使用,模仿微信摇一摇
Android系统带的传感器有很多种,最常见的莫过于微信的摇一摇了,那么今天我们就来看看Anroid中传感器的使用,做一个类似于微信摇一摇的效果. OK ,废话不多说,我们就先来看看效果图吧: 当我摇 ...
- Android的加速度传感器模拟摇一摇的效果-android学习之旅(66)
主要介绍一下android的加速传感器的简单用法,模拟摇一摇 ,如果x,y,z三个方向的加速度超过了15,就会弹出Toast,当然你可以设置更复杂的策略,比如判断间隔 代码如下 public clas ...
- Android加速度传感器
Android加速度传感器 效果图 手机平放桌面的两张截屏,数据一直在刷新 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q487 ...
- Android的重力传感器(3轴加速度传感器)简单实例
重力感应主要是依靠手机的加速度传感器(accelerometer)来实现 在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器.因为很多功能用户根本不care的所以可能开发商会 ...
- Android根据加速度和地磁场传感器实现自动对焦
在相机预览开始后新建AutoFocusManage对象即可,传入context和camera. 注意,在停止预览或者关闭相机时需调用方法中unregisterListener方法. 目前实现是当前方向 ...
- Android加速度传感器实现“摇一摇”,带手机振动
由于代码有点多,所以就分开写了,注释还算详细,方便学习 Activity package com.lmw.android.test; import android.app.Activity; im ...
- android:windowSoftInputMode属性;界面关闭后软键盘不隐藏的解决方法;
stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置 stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activit ...
随机推荐
- js后退
history.back(-1):直接返回当前页的上一页,数据全部消息,是个新页面 history.go(-1):也是返回当前页的上一页,不过表单里的数据全部还在 history.back(0) 刷新 ...
- POJ1962:Corporative Network【带权并查集】
<题目链接> 题目大意: n个节点,若干次询问,I x y表示从x连一条边到y,权值为|x-y|%1000:E x表示询问x到x所指向的终点的距离. 解题分析: 与普通的带权并查集类似 ...
- Python常用模块--string
该模块提供3个常用的功能: * 提供常用的字符串常量(感觉用途不大) * 提供字符串替换功能,主要用途是上下文的国际化(通过str可以实现,不介绍,感兴趣的自己看官网) * 提供字符串的格式化功能(感 ...
- IdentityServer4-MVC+Hybrid实现Claims授权验证(四)
上节以对话形式,大概说了几种客户端授权模式的原理,这节重点介绍Hybrid模式在MVC下的使用.且为实现IdentityServer4从数据库获取User进行验证,并对Claim进行权限设置打下基础( ...
- 【Java并发核心七】计划任务ScheduleExecutorService
Java中定时任务Timer工具类提供了计划任务的实现,但是Timer工具类是以队列的方式来管理线程的,并不是以线程池的方式,这样在高并发的情况下,运行效率会有点低. ScheduleExecutor ...
- ADODB 手册
PHP ADODB1.99版手册 (修正版) PHP ADODB 1.99版手册中文翻译 <修正版> ADODB PHP 在数据库的支持上是很令人称道的,几乎所有的知名数据库系 ...
- tableview 选中一行后,不显示选中颜色
tableview 选中一行后,不显示选中颜色 千万不要将tableview的allowsSelection设置成NO,那样的话可能导致tableview不能响应点击动作. 应该使用:cell.sel ...
- C# 论接口的意义---共享协议
我对接口的理解: 接口是一种协议.是一种模型. 我认为接口的意义: 接口更好的实现了项目资源共享 , 指定了可共享的范围 , 允许可使用而不可篡改的项目资源 . 我认为接口和模型是一类的: 接口一般与 ...
- iOS CrashLog Analysis
链接: iOS友盟崩溃日志定位代码 [友盟统计报表解读]之错误分析iOS版 DYSMTool Download Address 利用友盟和dsym分析发布app用户错误 iOS -- 友盟工具进行Cr ...
- 嵌入式Linux学习(一)
嵌入式系统 嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分.通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板.事实上,所有带有数字接口的设备,如手表.微波炉.录像机.汽车等, ...