Android传感器 - 光强度传感器

Android手机内部添加了光照强度传感器,可以实时监测手机周边环境的亮度,根据周边环境的亮度可以自动调节屏幕的亮度。下面通过一个实例看一下如何监测周边环境的亮度值。

主布局文件代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text=""
        android:textSize="30sp" />
</RelativeLayout>

添加了一个TextView用来显示当前光强度值。

MainActivity.java代码如下:

public class MainActivity extends Activity {

    private SensorManager mSensorManager;
    private float mLux;
    private TextView mTextView;
    private Sensor mSensor;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.text);
        // 获取服务
        mSensorManager = (SensorManager)
                getSystemService(Context.SENSOR_SERVICE);
        // 传感器种类-光照传感器
        mSensor = mSensorManager
                .getDefaultSensor(Sensor.TYPE_LIGHT);
        mSensorManager.registerListener(listener, mSensor,
                SensorManager.SENSOR_DELAY_NORMAL);

    }

    @Override
    protected void onDestroy() {
        if (mSensorManager != null) {
            mSensorManager.unregisterListener(listener);
        }
        super.onDestroy();
    }

    private SensorEventListener listener =
            new SensorEventListener() {

        public void onSensorChanged(SensorEvent event) {
            if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
                // 获取光线强度
                mLux = event.values[0];
                mTextView.setText("当前光照强度为:" + mLux);

            }
        }

        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };
}

 

通过代码可以看出,获得光照强度值的方式和获得加速度值的方式基本一致,这里在调用getDefaultSensor方法时传入的常量为Sensor.TYPE_LIGHT表示光照传感器,而event.values获得的数组中第一个float值即为光照强度值。

在真机上运行实例如下:

当前光照强度值将在TextView中显示出来,同时可以测试放在阳光下和放在阴暗处将得到不同的值。

Android中自带了“屏幕亮度跟随光照强度变化”的功能,参考下图:

如图中的“自动”开关,打开即可自动调节屏幕亮度了。我们可以不可以模拟一下这个功能呢?结合上面已经实现的光照值监听实现这个功能并不难。只需在上面的代码中添加改变屏幕亮度的方法:

public void changeWindowBrightness(int brightness) {
    Window window = this.getWindow();
    WindowManager.LayoutParams layoutParams = window.getAttributes();
    if (brightness == -1) {
        layoutParams.screenBrightness =
                WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
    } else {
        layoutParams.screenBrightness =
                (brightness <= 0 ? 1 : brightness) / 255f;
    }
    window.setAttributes(layoutParams);
}

结合这个方法可以改变Android应用当前屏幕的亮度,不会影响其他APP的亮度,当前屏幕的默认值为WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE。

将这个方法添加到上面的实例中并在onSensorChanged方法中调用,如下:

public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
        // 获取光线强度
        mLux = event.values[0];
        mTextView.setText("当前光照强度为:" + mLux);
        changeWindowBrightness((int) mLux);
    }
}

在真机中运行实例,然后放置在不同的光照环境中,可以看出在光照比较强的环境中屏幕亮度也较亮,反之在光照比较弱的环境中屏幕亮度也较暗,同时屏幕亮度的切换很及时。


更多优质文章关注微信公众号

请关注我的新浪微博:AndroidTip

CSDN博客:http://blog.csdn.NET/yayun0516

发布了498 篇原创文章 · 获赞 115 · 访问量 126万+

猜你喜欢

转载自blog.csdn.net/yayun0516/article/details/63251888