博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android -- 距离感应器控制屏幕灭屏白屏
阅读量:6310 次
发布时间:2019-06-22

本文共 3259 字,大约阅读时间需要 10 分钟。

权限                                                                                            

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

代码                                                                                            

public class MainActivity extends Activity implements SensorEventListener {    public static final String TAG = "SensorTest";    //调用距离传感器,控制屏幕    private SensorManager mManager;//传感器管理对象    //屏幕开关    private PowerManager localPowerManager = null;//电源管理对象    private PowerManager.WakeLock localWakeLock = null;//电源锁    //TextView    private TextView tv;//基本上没啥用    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                tv = (TextView) findViewById(R.id.tv);        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 onSensorChanged(SensorEvent event) {        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]);            tv.setText(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(); // 释放设备电源锁 } } } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO 自动生成的方法存根 }}

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

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

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

我是天王盖地虎的分割线                                                                 

源代码:

距离传感器.zip

 

本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3885891.html,如需转载请自行联系原作者

你可能感兴趣的文章
逻辑卷管理器(LVM)
查看>>
一个小代码,欢迎大佬的意见,求指正
查看>>
搭建LAMP架构
查看>>
神经网络注意力机制--Attention in Neural Networks
查看>>
Spring.Net+WCF实现分布式事务
查看>>
在Linux上高效开发的7个建议
查看>>
java数据结构 - 数组使用的代码
查看>>
个人简历-项目经验
查看>>
swoole异步任务task处理慢请求简单实例
查看>>
oracle数据泵导入分区表统计信息报错(四)
查看>>
spring技术内幕读书笔记之IoC容器的学习
查看>>
细说多线程(五) —— CLR线程池的I/O线程
查看>>
JavaScript instanceof和typeof的区别
查看>>
Hadoop文件系统详解-----(一)
查看>>
《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(8)--- 主动器...
查看>>
状态码
查看>>
我的友情链接
查看>>
用sqlplus远程连接oracle命令
查看>>
多年一直想完善的自由行政审批流程组件【2002年PHP,2008年.NET,2010年完善数据设计、代码实现】...
查看>>
自动生成四则运算题目
查看>>