anroid中实现距离传感器来控制屏幕的亮灭

一、今日的任务安排:
    1. 了解下什么是传感器,传感器的分类,传感器在手机中的应用有哪些等等;
    2.  编写出来较为简单的距离传感器的demo并能实现基本的功能;

二、思路方法:
    传感器编写的步骤:
       1. 通过getSystemService获得SensorManager实例对象
             mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
       2. 通过SensorManager实例对象获得想要的传感器对象:参数决定获取哪个传感器
               mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
       3. 在获得焦点时注册传感器并让本类实现SensorEventListener接口;
       4. 必须重写的两个方法:onAccuracyChanged,onSensorChanged

三、 代码编写
    1. 首先在androidManifest文件中申请权限;
          <uses-permission android:name="android.permission.DEVICE_POWER"/>
          <uses-permission android:name="android.permission.WAKE_LOCK"/>

          第一个权限加到xml文件中时会报错,但是我会很利索的去clean掉,实现步骤:找到eclipse中的菜单选项project  --> clean,选择当前项目就ok。
    2. 布局文件中只有xml文件即可;
    3. java类文件的编写:
   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;//电源锁
    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对象
    }
    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){
           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) {
            //经过测试,当手贴近距离感应器的时候its[0]返回值为0.0,当手离开时返回1.0
             tv .setText(its[0].toString[]);
            }
        }
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO 自动生成的方法存根
    }
}

四、 功能说明:
     做的是距离传感器,通过距离传感器来控制屏幕的亮灭,当距离为0是则屏幕暗,字符串显示为0;
                    当距离超过设定的阈值为1时则屏幕亮,字符串显示为1。

五、 遇到的困境
     在屏幕灭掉的时候根本看不到距离感应的显示,这时将屏幕暗的级别改的相对低一些,使屏幕仍是白色的;
    

public class MainActivity extends Activity implements SensorEventListener{ public static final String TAG = "SensorTest"; private SensorManager sensorManager; private TextView tv; private PowerManager localPowerManager = null;// 电源管理对象 private WakeLock localWakeLock = null;// 电源锁 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); tv = (TextView) findViewById(R.id.tv); localPowerManager = (PowerManager) getSystemService(POWER_SERVICE); // 获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是LogCat里用的Tag localWakeLock = this.localPowerManager.newWakeLock(32, "hahaha");// 第一个参数为电源锁级别,第二个是日志tag } @Override protected void onResume() { sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY), SensorManager.SENSOR_DELAY_UI); super.onResume(); } @Override protected void onPause() { sensorManager.unregisterListener(this); super.onPause(); } @Override public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub float[] values = event.values; switch (event.sensor.getType()) { case Sensor.TYPE_PROXIMITY: tv.setText(values[0] + ""); if (values[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(); // 释放设备电源锁 } break; } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值