Android 光感仪相关功能

192 阅读1分钟

要在 Android 上实现获取光感仪的环境状态以及当前勒克斯、平均勒克斯、最高勒克斯、最低勒克斯的值,并在 TextView 中显示,可以按照以下步骤进行操作:

1、创建一个新的 Android 项目,并创建一个名为 LightSensorActivity 的 Activity。

  1. activity_light_sensor.xml 中定义你的布局。可以使用多个 TextView 来显示不同的数值。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/statusTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp" />

    <TextView
        android:id="@+id/currentLuxTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_below="@id/statusTextView"
        android:layout_alignParentStart="true"
        android:layout_marginTop="20dp" />

    <TextView
        android:id="@+id/averageLuxTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_below="@id/currentLuxTextView"
        android:layout_alignParentStart="true"
        android:layout_marginTop="20dp" />

    <TextView
        android:id="@+id/maxLuxTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_below="@id/averageLuxTextView"
        android:layout_alignParentStart="true"
        android:layout_marginTop="20dp" />

    <TextView
        android:id="@+id/minLuxTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_below="@id/maxLuxTextView"
        android:layout_alignParentStart="true"
        android:layout_marginTop="20dp" />

</RelativeLayout>

3、在 LightSensorActivity 中获取光感传感器实例并监听传感器数值变化。

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.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.List;

public class LightSensorActivity extends AppCompatActivity implements SensorEventListener {
    private SensorManager sensorManager;
    private Sensor lightSensor;
    private TextView statusTextView;
    private TextView currentLuxTextView;
    private TextView averageLuxTextView;
    private TextView maxLuxTextView;
    private TextView minLuxTextView;

    private List<Float> luxValues;

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

        statusTextView = findViewById(R.id.statusTextView);
        currentLuxTextView = findViewById(R.id.currentLuxTextView);
        averageLuxTextView = findViewById(R.id.averageLuxTextView);
        maxLuxTextView = findViewById(R.id.maxLuxTextView);
        minLuxTextView = findViewById(R.id.minLuxTextView);

        luxValues = new ArrayList<>();

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 注册光感传感器监听器
        sensorManager.registerListener(this, lightSensor, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 取消注册光感传感器监听器
        sensorManager.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        // 获取光感值
        float luxValue = event.values[0];

        // 添加当前光感值到列表中
        luxValues.add(luxValue);

        // 计算平均勒克斯值
        float averageLuxValue = calculateAverageLux();

        // 更新当前勒克斯、平均勒克斯、最高勒克斯和最低勒克斯的 TextView
        currentLuxTextView.setText("当前勒克斯: " + luxValue);
        averageLuxTextView.setText("平均勒克斯: " + averageLuxValue);
        maxLuxTextView.setText("最高勒克斯: " + getMaxLux());
        minLuxTextView.setText("最低勒克斯: " + getMinLux());

        // 判断环境状态
        String status;
        if (luxValue < SensorManager.LIGHT_SUNLIGHT) {
            status = "明亮";
        } else if (luxValue < SensorManager.LIGHT_OVERCAST) {
            status = "阴天";
        } else if (luxValue < SensorManager.LIGHT_FULLMOON) {
            status = "昏暗";
        } else {
            status = "黑暗";
        }

        // 更新环境状态的 TextView
        statusTextView.setText("环境状态: " + status);
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // 这里不需要做处理
    }

    private float calculateAverageLux() {
        float sum = 0;
        for (float value : luxValues) {
            sum += value;
        }
        return sum / luxValues.size();
    }

    private float getMaxLux() {
        float max = Float.MIN_VALUE;
        for (float value : luxValues) {
            if (value > max) {
                max = value;
            }
        }
        return max;
    }

    private float getMinLux() {
        float min = Float.MAX_VALUE;
        for (float value : luxValues) {
            if (value < min) {
                min = value;
            }
        }
        return min;
    }
}

在上述示例中,我们在 onCreate 方法中获取了系统的 SensorManager 实例,并通过 getDefaultSensor 方法获取了光感传感器的实例。

onResume 方法中,我们注册了光感传感器的监听器,并设置了传感器数据更新的延迟时间。

onPause 方法中,我们取消了光感传感器的监听器注册。

onSensorChanged 方法中,我们获取了光感值,并将其添加到列表中。然后计算平均勒克斯值,并更新相应的 TextView 显示当前勒克斯、平均勒克斯、最高勒克斯和最低勒克斯的值。

接着,我们根据不同的光感值范围判断环境状态,并更新显示环境状态的 TextView。