最近在做一个网络通话的apk,功能和手机打sim卡电话一样。虽然只做java部分,但也遇到很多问题,其中一个就是模拟通话时的状态,要控制屏幕锁屏。我知道是通过手机上的距离感应器来实现,但也搞了好久,今天终于有了结果,拿出来分享一下。下载地址:http://download.csdn.net/detail/luozhi3527/5959023

在eoe上发帖寻问这个问题时,大牛告诉我说点亮屏幕可以做到,但是灭屏需要系统权限,应该无法做到。他说的很对,这里我们确实需要申请权限:

<uses-permission android:name="android.permission.DEVICE_POWER"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

第一个权限加到xml文件中时会报错,但是我会很利索的去clean掉,实现步骤:找到eclipse中的菜单选项project>clean,选择当前项目就ok

接下来看一下一个类的代码:

package com.xluo.sensortest;import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.PowerManager;
import android.util.Log;
import android.view.Menu;
import android.view.View;public class SensorTest extends Activity implements SensorEventListener{public static final String TAG = "SensorTest";//调用距离传感器,控制屏幕private SensorManager mManager;//传感器管理对象//屏幕开关private PowerManager localPowerManager = null;//电源管理对象private PowerManager.WakeLock localWakeLock = null;//电源锁@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.sensor);mManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);//获取系统服务POWER_SERVICE,返回一个PowerManager对象localPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);//获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是LogCat里用的Tag localWakeLock = this.localPowerManager.newWakeLock(32, "MyPower");//第一个参数为电源锁级别,第二个是日志tag}public void onResume(){super.onResume();mManager.registerListener(this, mManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),// 距离感应器SensorManager.SENSOR_DELAY_NORMAL);//注册传感器,第一个参数为距离监听器,第二个是传感器类型,第三个是延迟类型}public void onStop(){super.onStop();Log.d(TAG,"on stop");}public void onDestroy(){super.onDestroy();Log.d(TAG,"on destroy");if(mManager != null){localWakeLock.release();//释放电源锁,如果不释放finish这个acitivity后仍然会有自动锁屏的效果,不信可以试一试mManager.unregisterListener(this);//注销传感器监听}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub}@Overridepublic void onSensorChanged(SensorEvent event) {// TODO Auto-generated method stubfloat[] its = event.values;//Log.d(TAG,"its array:"+its+"sensor type :"+event.sensor.getType()+" proximity type:"+Sensor.TYPE_PROXIMITY);if (its != null && event.sensor.getType() == Sensor.TYPE_PROXIMITY) {System.out.println("its[0]:" + its[0]);//经过测试,当手贴近距离感应器的时候its[0]返回值为0.0,当手离开时返回1.0if (its[0] == 0.0) {// 贴近手机System.out.println("hands up");Log.d(TAG,"hands up in calling activity");if (localWakeLock.isHeld()) {return;} else{localWakeLock.acquire();// 申请设备电源锁}} else {// 远离手机System.out.println("hands moved");Log.d(TAG,"hands moved in calling activity");if (localWakeLock.isHeld()) {return;} else{localWakeLock.setReferenceCounted(false);localWakeLock.release(); // 释放设备电源锁}}}}}

当然,拿出来的例子只是对屏幕锁做了实现,而没有通话的功能的。但是原理大概就是这样,来电或者拨打时手机会切换到一个通话界面,然后这个界面应该具有上面所说的这样的功能。

需要特别注意的是,在onDestroy()函数里需要把对象锁释放掉(localWakeLock.release()),否则这个功能会一直存在知道你清楚应用数据或者删除应用,我就为这个问题困扰了好久。为此我特意在源代码例子里做了一个跳转页面,加了log。

这里我们实例化了两个管理对象,一个是传感器管理对象:SensorManager;另一个是 电源管理对象:localPowerManager。

传感器管理对象负责收集收集与物体之间的距离数据,电源管理对象通过判断传感器收集到数据对屏幕的灭屏和白屏做处理。

android距离感应器控制屏幕灭屏白屏相关推荐

  1. android 距离感应器控制屏幕熄灭_苹果 | 最新折叠专利曝光!屏幕下方无铰链结构解决折痕问题...

    文 | 小C君 · 编译 | Nina.山海观 来源 :Businesspost.Appleinsider CINNO Research 产业资讯,3月10日,IT媒体9to5Mac报道,苹果当天在美 ...

  2. android 距离感应器控制屏幕熄灭_书房大变身!有格调的屏幕挂灯,加了它桌面秒变神仙颜值...

    趁着这段时间宅在家里,我把凌乱了好长时间的书房收拾了一下,上网买了一些小清新摆饰,又把一些颜值比较高的音箱.耳机放上去,老婆现在终于不再吼我了. 原先的书房是这样的,真可以用"脏乱差&quo ...

  3. android距离感应器控制黑屏,白屏

    最近在做一个网络通话的apk,功能和手机打sim卡电话一样.虽然只做java部分,但也遇到很多问题,其中一个就是模拟通话时的状态,要控制屏幕锁屏.我知道是通过手机上的距离感应器来实现,但也搞了好久,今 ...

  4. Android 距离感应器和耳机状态监测(控制Audio输出通道切换)

    * 切换扬声器播放声音 or 听筒播放  * 1. 距离感应器:继承SensorEventListener这个监听,重写onSensorChanged方法  * 2. 检测耳机插入和拔出:Headse ...

  5. Android 启动APP时黑屏白屏的三个解决方案

    Android 启动APP时黑屏白屏的三个解决方案 参考文章: (1)Android 启动APP时黑屏白屏的三个解决方案 (2)https://www.cnblogs.com/liqw/p/42634 ...

  6. 西门子工控机维修IPC-847D开机不启动黑屏白屏

    西门子工控机维修IPC-847D开机不启动黑屏白屏 西门子工控机维修 IPC847D维修 ipc847c维修 西门子主机维修 西门子847D框架式工控机产品参数: 基于新英特尔技术的高系统性能,用于要 ...

  7. 启动APP黑屏白屏的原因及解决办法

    在我们打开APP的时候,总是会删一下白屏,或者黑屏,所以今天针对这个问题做一下自己的见解. 为什么在启动APP时,会出现白屏或者黑屏那? 其实出现黑白屏并不是不正常的,而是没有加载到布局文件,就已经显 ...

  8. 西门子精智触摸屏故障问题处理汇总(黑屏+白屏+花屏等)

    西门子精智触摸屏故障问题处理汇总(黑屏+白屏+花屏等) 一. 黑屏 屏上电后,显示屏幕没有任何变化:或者在使用过程中突然黑屏,再次上电显示屏幕也没有任何变化.这种情况下我们要首先检查供电电源(供电电压 ...

  9. Android距离感应器P-Sensor浅析

    (一)  前言 P-Sensor,距离感应器,可以感应手机和人体距离.具体使用用途是在通话过程中打开P-Sensor,那么当手机屏幕贴近用户脸部时,就会自动感应出手机和人体距离是多少.当小于某一个值时 ...

最新文章

  1. Unicode 和 UTF-8关系
  2. 【Android 逆向】x86 汇编 ( 使用 IDA 解析 x86 架构的动态库文件 | 使用 IDA 打开动态库文件 | IDA 中查找指定的方法 )
  3. hello cnblogs(从wordpress、收费空间到博客园)
  4. 【转】 已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10...
  5. 访问CrmService遇到HTTP status 401 Unauthorized的问题
  6. IBM原厂资深专家:DB2优化器和成本模型分析
  7. [转]SQL_Server_SSIS_ 最佳实践
  8. 多用户在线人数监听(基于TomCat)
  9. vue 监听state 任意值变化、监听mutations actions
  10. Gprinter Android SDK V1.0 使用说明
  11. H5:100款html5微信小游戏最新最新源码
  12. 软考高级 真题 2009年下半年 信息系统项目管理师 论文
  13. 火狐浏览器下载慢,如何提高
  14. WSUS 服务器 更新补丁 命令
  15. 分析的环绕声,它的功能如何
  16. 荣耀magic2换成鸿蒙系统,荣耀V40照常发布,将更换操作系统,搭载鸿蒙2.0发布
  17. Dynamics 365 for Phone 使用Xrm.Device.captureImage获取照片
  18. 如何高效管理工作微信
  19. ADO.NET增、删、改、查
  20. IP数据库的比较和选择

热门文章

  1. 前端面试之html+css【一】
  2. 在win10安装pip
  3. 在CSS布局中让Floats轻拂
  4. 用python对某校园热水服务app进行测试,实现自动免费用水(仅供参考)
  5. cocos creator粒子不变色_Cocos Creator 3D 粒子系统初战: 不要钱的酷炫火焰拿走不谢!...
  6. 如何对加密的m3u8、ts文件进行合并
  7. 为什么机器人不会抢走你的工作?
  8. Vue.js 源码分析(五) 基础篇 方法 methods属性详解
  9. max_transition 违例 及解决办法
  10. MySql基础篇---002 SQL之SELECT使用篇: 基本的SELECT语句,运算符,排序与分页,多表查询,单行函数,聚合函数,子查询