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 결과 화면
프로젝트를 실행 실제 핸드폰에서 테스트한 결과 아래와 같은 화면이 나옵니다.
우리집 거실이 어두운 편이네요.
3.2 Source Code
압축을 풀어서 사용하세요.
3.3 APK File
그냥 확인만 해보려면 사용해 보세요.
- copy coding -
'Android' 카테고리의 다른 글
안드로이드 자기장 센서/금속 탐지기 테스트 (TYPE_MAGNETIC_FIELD) (0) | 2018.10.09 |
---|---|
안드로이드 장치의 회전 방향 확인 (TYPE_GYROSCOPE) (0) | 2018.10.01 |
안드로이드 핸드폰 센서 비교 (TYPE_STEP_DETECTOR 와 TYPE_STEP_COUNTER) (2) | 2018.09.15 |
안드로이드 핸드폰 걸음 수 측정 센서 예제 (TYPE_STEP_COUNTER) (4) | 2018.09.14 |
안드로이드 핸드폰 걸음 감지 센서 작동 테스트 (TYPE_STEP_DETECTOR) (3) | 2018.09.12 |