利用传感器实现类似电话应用,靠近耳边,灭屏,远离耳边,屏幕再次亮起

来源:互联网 发布:淘宝中差评外包 编辑:程序博客网 时间:2024/04/28 02:38

最近在做一个伪装来电的应用,就是用户可以点击开关,固定时间之后,电话应用会响起,真正的电话接听之后,靠近耳边,手机屏幕是关闭的,远离耳边,手机屏幕会自动亮起。经过研究,代码实现很简单,就是利用距离传感器,对相应事件进行处理。下面代码是实现了该功能的一个demo

package com.gionee.sencer;import android.app.Activity;import android.app.KeyguardManager;import android.app.KeyguardManager.KeyguardLock;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.os.SystemClock;import android.widget.Toast;public class SencerActivity extends Activity implements SensorEventListener {    private final String TAG = "SencerActivity";    private SensorManager mSenserManager;    private Sensor illuminationSensor;    private KeyguardManager mKeyguardManager;    private KeyguardLock mKeyguardLock;    private PowerManager mPowerManager;    private PowerManager.WakeLock mWakeLock;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        mSenserManager = (SensorManager) getSystemService(SENSOR_SERVICE);        mSenserManager.registerListener(this,                mSenserManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),                SensorManager.SENSOR_DELAY_NORMAL);        illuminationSensor = mSenserManager                .getDefaultSensor(Sensor.TYPE_PROXIMITY);        if (illuminationSensor == null) {            Toast.makeText(this, "您的设备沾不支持该功能!", 0).show();            return;        }        /*         * 电源管理常用的几种状态         *          * PARTIAL_WAKE_LOCK 屏幕关,键盘灯关,不休眠         * SCREEN_DIM_WAKE_LOCK 屏幕灰,键盘灯关,不休眠         * SCREEN_BRIGHT_WEEK_LOCK 屏幕亮,键盘灯关,不休眠          * FULL_WAKE_LOCK 屏幕亮,键盘灯亮,不休眠         */        mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);        if (mWakeLock == null) {            mWakeLock = mPowerManager.newWakeLock(                    PowerManager.ACQUIRE_CAUSES_WAKEUP                            | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, TAG);            mWakeLock.setReferenceCounted(false);        }        mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);        if (mKeyguardLock == null) {            mKeyguardLock = mKeyguardManager.newKeyguardLock("unLock");        }    }    @Override    protected void onDestroy() {        mSenserManager.unregisterListener(this);        super.onDestroy();    }    public void onAccuracyChanged(Sensor sensor, int accuracy) {    }    @Override    public void onSensorChanged(SensorEvent event) {        if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {            float proximity = event.values[0];            if (proximity == 1.0) {                mKeyguardLock.disableKeyguard();                mWakeLock.acquire();            } else {                if (mWakeLock != null) {                    mWakeLock.release();                }                mPowerManager.goToSleep(SystemClock.uptimeMillis());                mKeyguardLock.reenableKeyguard();            }        }    }}

实现上述功能需要一些权限,AndroidManifest.xml 文件如下:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.gionee.sencer"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk android:minSdkVersion="15" />    <application        android:icon="@drawable/ic_launcher"        android:label="@string/app_name" >        <activity            android:name=".SencerActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application>     <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name="android.permission.DEVICE_POWER"/> <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /></manifest>


原创文章,转载请标明出处:http://blog.csdn.net/songshizhuyuan/article/details/12677445

原创粉丝点击