android 防触碰功能,类似打电话时屏幕熄灭

2019-07-13 23:17发布

防触碰功能用到的是android手机的距离感应器 1.申请距离感应器管理者 SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);// 传感器管理对象,调用距离传感器,控制屏幕
2.申请电源锁,屏幕熄灭等需要用到电源锁 //距离感应器的电源锁 WakeLock wakeLock = powerManager.newWakeLock(32, "wakeLock");
3.距离感应器监听者 /**距离感应器*/ @SuppressLint("Wakelock") private SensorEventListener sensorEventListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { float[] its = event.values; if (its != null && event.sensor.getType() == Sensor.TYPE_PROXIMITY) { // 经过测试,当手贴近距离感应器的时候its[0]返回值为0.0,当手离开时返回1.0 if (its[0] == 0.0) {// 贴近手机 logger.info("hands up in calling activity"); if (!wakeLock.isHeld()) { wakeLock.acquire();// 申请设备电源锁 } } else {// 远离手机 logger.info("hands moved in calling activity"); if (wakeLock.isHeld()) { wakeLock.release(); // 释放设备电源锁 } } } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } };
4.在需要的位置注册距离感应器监听者 //注册距离监听 sensorManager.registerListener(sensorEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY), SensorManager.SENSOR_DELAY_NORMAL);// 注册传感器,第一个参数为距离监听器,第二个是传感器类型,第三个是延迟类型
5.在不需要的时候,记得注销一下 //注销距离监听 sensorManager.unregisterListener(sensorEventListener);

6.距离感应的一个小demo package zz.juliganyingqi; 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.widget.TextView; 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 自动生成的方法 } }