Android -- 距离感应器控制屏幕灭屏白屏

权限                                                                                            

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

第一个权限加到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。

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

我是天王盖地虎的分割线                                                                 

源代码:http://pan.baidu.com/s/1dD1Qx01

距离传感器.zip

参考:http://blog.csdn.net/luozhi3527/article/details/9999901

Android -- 距离感应器控制屏幕灭屏白屏,布布扣,bubuko.com

时间: 2024-10-09 14:40:20

Android -- 距离感应器控制屏幕灭屏白屏的相关文章

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

你会很奇怪,为什么有些app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如QQ手机端,的确这里要做处理一下.这里先了解一下为什么会出现这样的现象,其实很简单,简历一个简单的例子就可以理解了. 其实,黑屏或者白屏这里并不是不正常,而是还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景.代码如下,可以自己写个小demo就理解了. @Override protected void onCreate(Bundle saved

Android 启动APP时黑屏白屏的三个解决方案(转载)

你会很奇怪,为什么有些app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如QQ手机端,的确这里要做处理一下.这里先了解一下为什么会出现这样的现象,其实很简单,简历一个简单的例子就可以理解了. 其实,黑屏或者白屏这里并不是不正常,而是还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景.代码如下,可以自己写个小demo就理解了. 1 2 3 4 5 6 7 8 9 10 11 12 @Override protected

Android启动黑屏白屏解决方案

在App的Splash页面启动时会出现短暂的黑屏或者白屏,会带来很不好的用户体验,究其原因是因为资源还未加载完成而导致的黑屏或白屏,而我们所看到的黑白屏其实就是顶层Window,下面总结两种解决方案. **设置Window层的界面为我们的Splash界面. <!--防止启动时黑屏,添加window图片--> <style name="Theme.AppStartLoad" parent="android:Theme"> <item na

Android项目启动时短暂的黑屏白屏处理

刚从csdn转战51,这是在51写的第一篇博客 那么我们来谈谈这样一个问题.当你的项目需要用的欢迎界面有时候会出现短暂的黑屏或白屏,这样用户体验就不好了,所以今天教教大家如何处理这种问题. 其实,黑屏或者白屏是因为程序还没有加载布局就已经显示window窗口背景,而黑屏或者白屏就是window窗口背景.那么如何处理呢?看下面... public class LoadingActivity extends AppCompatActivity {          @Override       p

苹果手机输入框失去焦点,屏幕出现部分白屏

在做移动的开发时,会遇到当输入框输入完成后,键盘收起之后,但是页面没有回到全屏,页面底部没有铺满手机底部,出现部分白屏,如下图 此问题是由于页面高度没有实时计算导致, 解决方案就是在输入框失去焦点之后重新计算一下页面的整体高度,有个巧妙的操作就是手动触发页面滚动,进而触发重新计算高度,使页面铺满全屏 document.body.scrollTop = document.body.scrollTop; 原文地址:https://www.cnblogs.com/gopark/p/12411950.h

CEFSharp 黑屏/白屏 问题

CEFSharp加载完页面后会出现黑屏或者白屏现象,应该是渲染失败造成的,解决办法是初始化结束后刷新一次 Browser.IsBrowserInitializedChanged += new EventHandler<CefSharp.IsBrowserInitializedChangedEventArgs>((s, a) => { Browser.Refresh(); });

解决android 启动白屏问题

Android 启动APP时黑屏白屏的三个解决方案 http://www.cnblogs.com/liqw/p/4263418.html android:windowSoftInputMode属性使用 http://www.blogjava.net/zhip/archive/2011/02/14/344258.html

白屏调试分析

前些天在展讯8825上调试一个ili9807的屏,屏幕一直显示为白屏,这就非常麻烦了,因为白屏意味着基本的显示也没有, 调试屏的时候,即使是显示花屏或者任何的乱彩色线条,甚至是简单的几条线,也算是成功了一小部分,能显示数据, 意味着基本的数据链路是联通的. 开始是从屏的连接器上找问题,从硬件上测量FPC是正常连接的,简单的就是测量屏与主板的各个引脚是连接通的, 各引脚上的电压是正常的,各引脚是否短路,经过长时间的测量和ic原厂的工程师帮助下,硬件在FPC上飞线, 屏的FPC终于是正常联通了!这立

android开发 解决启动页空白或黑屏问题

遇到的情况: app启动时进入启动页时出现白屏页,然后大概一秒之后就出现了背景图片. 原因:app启动时加载的是windows背景,之后再加载布局文件的,所以开始的黑屏/白屏就是windows的背景颜色,因此我们只要在启动页设置windows背景颜色就好了,那么在哪里设置呢?  就是theme里面. 解决办法:参考:[Android Drawable 那些不为人知的高效用法] [Android 启动APP时黑屏白屏的三个解决方案] 首先看之前的布局文件xml写法 <?xml version=&quo