Android传感器 - 光强度传感器

Posted yayun0516

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Android传感器 - 光强度传感器的主要内容,如果未能解决你的问题,请参考以下文章

ESP32学习笔记(18)——光强度GY-30(BH1750)使用

HI3861学习笔记(16)——光强度GY-30(BH1750)使用

ESP32学习笔记(18)——光强度GY-30(BH1750)使用

Processing与Arduino交互-光敏传感器

Processing与Arduino交互-光敏传感器

15.STC15W408AS单片机驱动BH1750FVI光强度传感器