最近写了一个基于距离传感器锁屏的程序,在这里Mark一下。

手机为了节约能耗,一段时间没有操作就会自动锁屏,这带来了一个问题——你得不断的解锁,当然用了这么多年大家也许都习惯了。现在我想尝试一种既节约能耗,又不用频繁解锁的方法。

当手机被装到包里或者口袋里面,距离传感器都是可以检测出来的,所以为什么不根据这个特性来控制手机锁屏呢?

关于这个问题的详细讨论可以看看这里。

1.程序功能

主界面

主要功能:

在后台创建一个后台服务,用来检测距离传感器是否被触发,如果触发就锁住屏幕。

带来的好处:

打开这个服务后,可以尝试把手机设置为不自动锁屏或者延长自动锁屏的时间,在不想用手机之后直接装到兜里面,由于距离传感器被触发,手机将自动锁屏。如果你的手机放在桌上,没有锁屏恰好有人想看你手机上的内容,你可以直接把手放到手机上,距离传感器被触发,就会锁住屏幕,这也比较符合人下意识的动作。对于像我这样不大喜欢频繁解锁的人,应该可以试试。

带来的问题:

一般的手机距离传感器应该是在听筒位置,在使用手机的时候一般不容易被触发。当然使用微信,或者语音助手的时候除外(我也在想解决这个问题的方案)。另外打电话接电话的时候必然会触发距离传感器。

解决方法:

尽量检测出在使用听筒时触发距离传感器的情况,然后在这种情况下,暂停锁屏服务,在不用听筒之后再将锁屏服务打开。在这个程序中,我只实现了检测来电和去电两种情形的检测,在打电话的时候,停止锁屏服务,在挂断电话后重启锁屏服务。

2.实现

2.1最关键的部分:锁屏功能

public static class Controller extends Activity {DevicePolicyManager mDPM;ComponentName mDeviceAdminSample;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 首先我们要获得android设备管理代理mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);// LockScreen 继承自 DeviceAdminReceivermDeviceAdminSample = new ComponentName(Controller.this,LockScreen.class);// 得到当前设备管理器有没有激活(获取权限)boolean active = mDPM.isAdminActive(mDeviceAdminSample);if (!active) {// 如果没有激活的话,就去提示用户激活(第一次运行程序时)getAdmin();} else {// 如果已经激活的话,就执行立即锁屏mDPM.lockNow();}// killMyself ,锁屏之后就立即kill掉我们的Activity,避免资源的浪费;//android.os.Process.killProcess(android.os.Process.myPid());finish();}

2.2后台服务

首先继承Android.app.Service类,然后实现 OnCreate、OnStart、OnDestroy方法,然后实现SensorEventListener接口中的两个函数——onAccuracyChanged和onSensorChanged,一个是判断精度变化,一个是判断传感器距离变化。

最后将这个服务在Manifest文件中注册一个名称,然后在MainActivity中直接通过这个名称来启动和停止。

public class AutoLockService extends Service implements SensorEventListener {
}

2.3获取权限

首先在res目录下新建一个xml文件夹,然后在该文件夹下新建文件device_admin_sample.xml文件,其内容:

<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android"><uses-policies><force-lock /></uses-policies></device-admin>

然后在 Manifest 文件中注册一个广播接收者:

<!-- 接收请求Device Admin广播 -->        
<receiverandroid:name="org.hq.autolock.LockScreen"android:permission="android.permission.BIND_DEVICE_ADMIN" ><meta-dataandroid:name="android.app.device_admin"android:resource="@xml/device_admin_sample" /><intent-filter><action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /></intent-filter></receiver>

2.4判断来电和去电状态

继承BroadcastReceiver,已接收到广播就停止锁屏服务,判断挂机之后重新开启锁屏服务。

@Override
public void onReceive(Context context, Intent intent) {// TODO Auto-generated method stub//停止锁屏服务if( null == myintent ){myintent = new Intent("org.hq.autoLockService");}context.stopService(myintent);System.out.println("action"+intent.getAction());if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){//如果是去电(拨出)System.out.println("拨出");}else{//查了下android文档,貌似没有专门用于接收来电的action,所以,非去电即来电System.out.println("来电");TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);   //如果挂断了,开启锁屏服务if( TelephonyManager.CALL_STATE_IDLE == tm.getCallState() ){if( null == myintent ){myintent = new Intent("org.hq.autoLockService");}context.startService(myintent);}}
}

2.5获取传感器信息

首先获取传感器管理类,通过SensorManager就可以获得手机上所有的传感器信息。要监测传感器参数变化,只需新建一个SensorEvenListener。

sm = (SensorManager) getSystemService(SENSOR_SERVICE); // 获取传感器管理类
promixty = sm.getDefaultSensor(Sensor.TYPE_PROXIMITY); // 获取距离传感器

3.题外话

在写完这个程序,装到手机里用了一段时间之后,发现用一个软件来实现锁屏其实没多大必要。很多智能手机用户已经适应甚至依赖那种解锁的感觉,所以并不感到繁琐。因此,用距离传感器来锁屏,也许大材小用没有必要。

最近看到一款应用,用距离传感器来自动接听来电,这个倒方便不少,省去了滑屏的动作。有兴趣的可以试试看~

工程源码:

http://download.csdn.net/detail/he_qiao_2010/5979623

没有积分的到这里下载:

http://pan.baidu.com/share/link?shareid=207532332&uk=1158831200

APK文件:

http://pan.baidu.com/share/link?uk=1158831200&shareid=2641184411

基于距离传感器的自动锁屏程序相关推荐

  1. (C++)Windows自动锁屏程序

    程序员长期盯着屏幕,对眼睛的伤害是很大的.科学建议每一个小时就休息五分钟,眼睛看向六米之外的地方(是不是绿色不是很重要).在下利用C++,写了一个自动锁屏的程序,可以设置锁屏时间,实现键盘输入win ...

  2. Python实现过段时间计算机自动锁屏小程序

    1.直接上代码: from ctypes import * import timeprint("是时候展示真正的技术了,哈哈哈") # 睡眠一段时间 time.sleep(10) ...

  3. 用java程序使windows电脑不自动锁屏的方法

    有时候电脑受管控,在很短的时间内就会锁屏,带来了很大的不便,通过控制面板是无法成功设置的. 于是写了个java程序,通过5秒一次模拟ScrollLock键按键的方式阻止电脑自动锁屏. 代码如下 imp ...

  4. 小程序-阻止手机自动锁屏

    1.是在做视频通话和直播的时候遇到的,用户的手机设置了一定时间自动锁屏,这样会影响小程序的使用体验 2.设置小程序阻止手机自动锁屏,只在小程序使用期间起作用 3.在app.js的onLaunch中写上 ...

  5. Linux系列:Ubuntu/fedora实用小技巧—禁止自动锁屏、设置免密码自动登录、免密码执行sudo操作...

    首先声明:该文虽以Ubuntu 13.04为例,同样适用于Fedora 17(已测试),但在较低版本的Ubuntu下可能有所差异,具体看后面的注意事项. 技巧目录: 解决Ubuntu下每隔几分钟自动锁 ...

  6. 【Centos】Centos7.5取消自动锁屏功能

    00. 目录 文章目录 00. 目录 01. 问题描述 02. 问题分析 03. 解决办法 04. 附录 01. 问题描述 Centos7.5系统在用户闲置一段时间(默认为5分钟)后,会启动屏幕保护程 ...

  7. xp系统设置锁定计算机,教你XP电脑中有效的设置自动锁屏的方法

    XP的系统是一款经典的系统,我们可以在使用中根据自己的电脑多的特点来安装这些系统的,那在使用电脑功能自动锁屏的时候有小伙伴就操作的时候遇到了疑问,对于设置自动锁屏这个选项不知道怎么调整的情况,遇到这个 ...

  8. CentOS系统里如何正确取消或者延长屏幕保护自动锁屏功能(图文详解)

    不多说,直接上干货! 对于我这里想说的是,分别从CentOS6.X  和  CentOS7.X来谈及. 1. 问题:默认启动屏幕保护 问题描述: CentOS系统在用户闲置一段时间(默认为5分钟)后, ...

  9. 如何修复Kindle频繁自动锁屏和解锁

    12年入手kindle dxg,用了几年,看pdf的利器,感觉很不错, 2016年夏天的时候,kindle突然出现频繁的锁屏和解锁.在网上搜了一下,只有在贴吧找到一个类似的问题,但是没有解决方案,联系 ...

最新文章

  1. JavaScript性能优化 DOM编程
  2. 计算机的组成_计算机网络的组成和分类
  3. netty web 容器_Netty - 高性能网络应用框架常见面试题
  4. C语言多文件编程基本格式
  5. VS Code 直接跳到下一行编辑快捷键
  6. ajax communication failed,Extjs4,等待ajax请求
  7. MySQL Query Cache 小结
  8. POI介绍及视频教程
  9. Graphviz 画图教程
  10. 查询 JetsonNano I2C 的工作频率(波特率)
  11. beats android 蓝牙连接电脑,beatsx怎么连接电脑_Beats X耳机连接win10电脑的详细操作步骤...
  12. 基于java+ssm+mysql的医院管理系统
  13. 咸鱼CAD笔记—CAD快捷键
  14. 《关于我横扫一线厂的那些面经》拼多多Java岗(附答案)
  15. 如何解决中小企业融资难问题
  16. 如何快速体验腾讯云区块链长安链
  17. js前端实现微信支付和支付宝支付
  18. 【UML】-- 活动图练习题含答案(打印合同、请假、公司评审、签订合同、软件发布、会见客户)
  19. 10 个神奇的网站,助力带薪摸鱼
  20. xxl-job新增执行器

热门文章

  1. 常见的幂等性解决方案
  2. computed的实现原理
  3. 在mac系统中读写windows NTFS格式移动硬盘
  4. 数据结构实验-停车场模拟系统
  5. 漫画:什么是 “锦标赛排序” ?
  6. web前端主要技术概述
  7. python安装setuptools(easy_install工具)
  8. ##Java 字母大小写比较
  9. android动画入门,Android动画基础总结
  10. matlab画奥迪标志,绘画汽车,用PS绘制一个逼真的奥迪汽车