TYPE_LIGHT는 빛의 세기를 전기적 신호로 변경하여 수치로 보여주는 센서로

핸드폰의 앞면에 위치하고 화면의 자동 밝기 자동 조절등에 사용 되는 기능 입니다.



1 광 센서


1.1 광 센서 이벤트 값


센서가 작동 되면 리턴되는 값으로 한 개의 value를 넘겨 주며 단위는 lux(lx) 입니다.


 Sensor

 Sensor event data

 표현 값

 측정 단위

 TYPE_LIGHT

 SensorEvent.values[0]

 물체의 밝기

 lx



1.2 설정 상수 값



광 센서가 리턴하는 값은 float 값으로 나타나며 일부 설정되어 있는 상수 값은 아래 표와 같습니다.


Type

 상수

 값

 float

 LIGHT_CLOUDY

 100.0

 float

 LIGHT_FULLMOON

 0.25

 float

 LIGHT_NO_MOON

 0.001

 float

 LIGHT_OVERCAST

 10000.0

 float

 LIGHT_SHADE

 20000.0

 float

 LIGHT_SUNLIGHT

 110000.0

 float

 LIGHT_SUNLIGHT_MAX

 120000.0

 float

 LIGHT_SUNRISE

 400.0



2 광센서 프로젝트



2.1 신규 프로젝트 생성


안드로이드 스튜디오에서 프로젝트를 하나 생성합니다.



2.2 AndroidManifest.xml


Google play에서는 앱을 다운로드 하기 전에 해당 기능을 실행할 장치가 있는지 확인하여


장치가 없으면 실행을 할 수 없도록 제한 하고 있습니다.


<uses-feature>를 설정하고 값을 false로 하면 장치가 없어도 앱을 다운받아 실행 할 수 있도록 할 수 있습니다.


<uses-feature android:name="android.hardware.sensor.light" android:required="false"/>


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.desk.lightsensor">

    <uses-feature android:name="android.hardware.sensor.light" android:required="false"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>



2.3 Layout 작성


activity_main.xml


 센서가 보내오는 lux값을 출력할 수 있는 TextView를 작성합니다.


tvTitle TextView는 고정해서 Proximity Sensor를 출력 하고 센서로부터 받아온 값은 tvLight TextView에 출력 합니다.


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Light Sensor"
        android:layout_marginTop="50dp"
        android:textSize="30dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <TextView
        android:id="@+id/tvLight"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/tvTitle"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:textSize="25dp"
        android:text="Light : 0"
        />
</android.support.constraint.ConstraintLayout>



2.4 Java Source


소스를 보면 알겠지만 기존 센서와 동일한 프로세스로 작동이 됩니다.


자세한 설명은 생략 합니다. 기존 센서 예제를 확인 하세요.


onCreate에서 TYPE_LIGHT를 설정 하고 onSensorChanged 에서 조도 값을 받아와 출력 하면 됩니다.


package com.example.desk.lightsensor;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private SensorManager sensorManager;
    private Sensor lightSensor;
    TextView tvLight;

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

        tvLight = (TextView)findViewById(R.id.tvLight);
        sensorManager =(SensorManager)getSystemService(Context.SENSOR_SERVICE);
        lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
        if(lightSensor == null) {
            Toast.makeText(this, "No Light Sensor Found!", Toast.LENGTH_SHORT).show();
        }
    }

    @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) {
        if(event.sensor.getType() == Sensor.TYPE_LIGHT) {
            tvLight.setText("Light : " + String.valueOf(event.values[0]));
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

}



3. 결과


3.1 결과 화면


프로젝트를 실행 실제 핸드폰에서 테스트한 결과 아래와 같은 화면이 나옵니다.


우리집 거실이 어두운 편이네요.


android light sensor



3.2 Source Code


압축을 풀어서 사용하세요.


LightSensor.7z




3.3 APK File


그냥 확인만 해보려면 사용해 보세요.


LightSensor.apk


- copy coding -


+ Recent posts