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

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

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

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

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

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;//电源锁  @Override  protected 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);//注销传感器监听  }  }  @Override  public void onAccuracyChanged(Sensor sensor, int accuracy) {  // TODO Auto-generated method stub  }  @Override  public void onSensorChanged(SensorEvent event) {  // TODO Auto-generated method stub  float[] 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.0  if (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。

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

本文转自http://blog.csdn.net/luozhi3527/article/details/9999901

注:1、注册的时候,最好判断一下mManager.getDefaultSensor(Sensor.TYPE_PROXIMITY)是不是空的,如果设备没有改传感器,会报空

2、在通常的wakelock使用时,有时会报错:java.lang.RuntimeException: WakeLock under-locked

设置localWakeLock.setReferenceCounted(false);

android距离感应器控制黑屏,白屏相关推荐

  1. android距离感应器控制屏幕灭屏白屏

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

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

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

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

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

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

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

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

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

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

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

  7. android应用启动页面显示不出来了,Android应用中启动页出现白屏如何解决

    Android应用中启动页出现白屏如何解决 发布时间:2020-12-11 14:41:17 来源:亿速云 阅读:100 作者:Leah 今天就跟大家聊聊有关Android应用中启动页出现白屏如何解决 ...

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

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

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

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

最新文章

  1. 千里之行,始于OKR——轻雀协作团队管理分享
  2. 关于HTML头二行文字的解释
  3. numpy python2_python-numpy(2)
  4. 红帽RHCE培训-课程3笔记目录
  5. SolrJ添加商品数据
  6. 傅里叶变换的初级理解三
  7. 集合转换Stream流式操作
  8. Application package 'AndroidManifest.xml' must have a minimum of 2 segments错误
  9. 2021双11上云狂欢节 | 爆款产品底价全面开售
  10. 正则表达式限制文本框内容
  11. win10下, ColorPix取色器错位 指针偏移问题 解决方法
  12. java+MySQL 基于ssm的眼镜销售购物商城
  13. java 调用热敏打印机_java调用芯烨热敏打印机 TSPL2指令 打印没有反应
  14. 【办公应用软件】万彩办公大师丨PDF页面修剪帮助文档
  15. 计算机关机更改域用户登录,计算机怎么退域和重新加域?
  16. Win10关闭自动调节亮度
  17. 使用Github+Markdown搭键自己的笔记本
  18. Linux 系统管理命令集合
  19. 一文教你懂得什么什么是EMC(电磁兼容)
  20. 关于Ubuntu安装简体中文提示software database is broken

热门文章

  1. 【论文摘要】基于多数投票模式和超混沌加密的彩色图像鲁棒安全零水印算法
  2. ETL工具之Informatica
  3. vggNet网络学习(网络架构及代码搭建)
  4. 武夷岩茶PK铁观音(南北乌龙之我见--清风云雨)
  5. 常见面试题整理--操作系统篇(每位开发者必备)
  6. Python3 简单爬虫爬取百度贴吧帖子
  7. JAVA小实验——接口与继承
  8. 系统思考负反馈之稻盛和夫的阿米巴经营
  9. wxml 点击图片下载_跟着做,零基础也能做出自己的小程序
  10. Unity见缝插针游戏源码完整版