这节课我们来学习安卓中的光照传感器,已经会的请绕过此篇。

      安卓系统有个自动调整屏幕亮度的功能。 它会检测手机周围环境的光照强度, 然后对手机屏幕的亮度进行相应地调整, 以此保证不管是在强光还是弱光下,手机屏幕都能够看得清。

说的太多理论有点虚,这里直接实战实用光照传感器做个项目。

本课目标:

编写一个简易的光照探测器程序,使手机可以检测到周围环境的光照强度变化。

效果图:

android 光线传感器 安卓光线传感器测试_ide


说明:

灯光照到上面数值会发生改变。

友情提示:

       模拟器无法感知光照强度,因此建议在真实手机上运行。

本科源码下载:https://github.com/fairyxingyun/Android_Sensors_API

1.首先我们新建一个安卓工程:

android 光线传感器 安卓光线传感器测试_android 光线传感器_02

2.用TextView来显示当前的光照强度

    这里使用一个TextView控件来显示光照强度。
activity_main布局文件如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.xingyun.androidlightsensordemo.MainActivity" >


    <TextView 
        android:id="@+id/light_level_id"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="20sp"/>

</RelativeLayout>

3.MainActivity.java 后台处理代码:

package com.xingyun.androidlightsensordemo;

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.support.v7.app.ActionBarActivity;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

    private TextView showLightLevelTextView;// 显示光照传感器强度
    private SensorManager sensorManager;// 传感器管理器
    private Sensor lightSensor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        showLightLevelTextView = (TextView) findViewById(R.id.light_level_id);

        /***************************************************************************
         * 
         * SensorManager是系统所有传感器的管理器,有了它的实例之后
         * 
         * 就可以调用 getDefaultSensor()方法来得到任意的传感器类型了
         * 
         * Sensor.TYPE_LIGHT 常量来指定传感器类型
         * 
         ************************************************************************/

        // 获取到 SensorManager的实例
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

        // 指定传感器类型为光照传感器
        lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

    }

    /*
     * 这个方法在活动准备好和用户进行交互的时候调用。 此时的活动一定位于返回栈的栈顶,并且处于运行状态。
     * */
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        /*
         * registerListener()方法接收三个参数 第一个参数就是 SensorEventListener 的实例, 
         * 第二个参数是 Sensor 的实例,这两个参数我们在前面都已经成功得到了。 
         * 第三个参数是用于表示传感器输出信息的更新速率,它们的更新速率是依次递增的。
         */
        // 调用 SensorManager的 registerListener()方法来注册 使得监听生效
        sensorManager.registerListener(listener, lightSensor,
                SensorManager.SENSOR_DELAY_NORMAL);
    }

    /*
     * 这个方法在系统准备去启动或者恢复另一个活动的时候调用。 
     * 我们通常会在这个方法中将一些消耗 CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度
     * 一定要快,不然会影响到新的栈顶活动的使用*/
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        sensorManager.unregisterListener(listener);
    }

    //这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        if (sensorManager != null) {
            sensorManager.unregisterListener(listener);
        }
    }

    /**
     * 需要对传感器输出的信号进行监听,这就要借助 SensorEventListener来实现。 SensorEventListener
     * 是一个接口,其中定义了 onSensorChanged()和 onAccuracyChanged()这两个方法
     */
    private SensorEventListener listener = new SensorEventListener() {

        // 当传感器的精度发生变化时就会调用 onAccuracyChanged()方法,
        @Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            /*********************************************************
             * 
             * onSensorChanged()方法中传入了 一个 SensorEvent 参数
             * 
             * 这个参数里又包含了一个 values 数组,所有传感器输出的信息都是存放在这里的.
             * 
             * ******************************************************/
            float value = event.values[0];
            //显示当前屏幕亮度值
            showLightLevelTextView.setText("当前光照强度为:" + value + "lx");

        }

        // 当传感器监测到的数值发生变化时就会调用 onSensorChanged()方法。
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub      

        }
    };
}