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

防触碰功能用到的是android手机的距离感应器

1.申请距离感应器管理者

<span style="white-space:pre">	</span>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 自动生成的方法

	}

}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android设备上,可以通过触NFC标签来打开应用程序。NFC(Near Field Communication,近场通信)是一种无线通信技术,它允许在非接触范围内进行短距离通信。Android设备通常具有内置的NFC芯片,用于支持此功能。 要实现通过触NFC标签打开应用程序,首先需要编写一个基于NFC的触发器,也称为Intent过滤器。在AndroidManifest.xml文件中,可以声明该Intent过滤器,以便在设备接收到与标签相关的NFC消息,启动您的应用程序。 接下来,您需要为应用程序中的相应活动(Activity)添加一个Intent接收器。这样,当设备接收到与标签相关的NFC消息,您的应用程序将被启动,并且设备上正在前台运行的活动将接收该消息。 在接收到NFC触摸事件后,您可以使用Intent对象中的信息来执行相应的操作。您可以从Intent对象中获取标签ID或其他信息,并针对这些数据执行合适的逻辑。例如,您可以根据标签ID从数据库中检索数据,并显示在应用程序中。 需要注意的是,为了让设备正确处理NFC操作,您需要确保设备开启了NFC功能,并且在应用程序的清单文件中正确配置了相关权限和过滤器。 通过使用NFC技术,您可以使Android设备能够通过触标签来启动应用程序。这种功能广泛应用于许多领域,如门禁系统、支付系统和数据传输等。同,它也带来了更多创新和便利的可能性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值