09 March 2013

Sensor API in Android - การใช้งาน Light Sensor

Updated on

        หายไปหลายวัน คราวนี้กลับมากันที่ Light Sensor กันต่อ สำหรับ Light Sensor จะเป็นคนละตัวกับ Proximity นะ จากบทความเก่า Proximity จะจับวัตถุที่มาบังเซนเซอร์ โดยใช้หลักการแสงอินฟราเรดสะท้อนวัตถุกลับมาตัวรับ


        แต่สำหรับ Light Sensor จะใช้การวัดค่า Lux ของแสงที่วัด ซึ่งค่า Lux ก็คือหน่วยของความสว่างของแสงนั่นเอง โดยจะมีอยู่บนเครื่องที่สามารถปรับแสงจอออโต้ได้ จึงดูได้ง่ายๆเลยว่า ถ้าเครื่องไหนทำไม่ได้ก็แปลว่าไม่มี หรือสังเกตุได้จากช่องเดี่ยวที่อยู่ข้างหน้าฝั่งบนของจอ




        เนื่องจาก Light Sensor ใช้วิธีวัดค่า Lux หรือความสว่างของแสง ดังนั้นค่าที่ได้จึงไม่เหมือน Proximity ที่มีแค่สองค่าคือ 0 กับ X (ขึ้นอยู่กับแต่ละเครื่อง) แต่ค่าจาก Light Sensor จะมีค่าต่างๆตามความสว่างของแสง



        สำหรับการทำงานของคำสั่งหลักๆเจ้าของบล็อกจะไม่อธิบายนะ ให้ผู้ที่หลงเข้ามาอ่านเข้าไปอ่านจากบทความ [Android Code] การใช้งาน Accelerometer แทน

        ส่วนการใช้งานก็จะเปลี่ยนคำสั่งจากของเดิมเป็น โดยจะต่างจาก Accelerometer เพียงแค่ตอนกำหนดคลาส Sensor โดยเลือกเป็น Light Sensor แทน

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

        ส่วนคำสั่งอื่นๆ ทั้งหมดก็จะเหมือนกับ Accelerometer แต่จะต่างกันตรงที่ว่าค่าที่อ่านได้มีแค่ค่าเดียวเท่านั้น ซึ่งต่างจาก Accelerometer ที่อ่านเป็น XYZ เพราะงั้น Float Array จึงมีสมาชิก 3 ตัว (ตัวที่ 0 1 และ 2) แต่สำหรับ Light Sensor นั้น ค่า Float Array ที่ได้จะมีแค่สมาชิก 1 ตัว (ตัวที่ 0)


        ทีนี้ก็มาดูตัวอย่างสำหรับการใช้งาน Light Sensor กันเถอะ

Main.java
package app.akexorcist.sensor_light;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.widget.TextView;

public class Main extends Activity {
    TextView textLight;
    SensorManager sensorManager;
    Sensor sensor;
 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        sensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
        
        textLight = (TextView) findViewById(R.id.textLight);
    }
 
    public void onResume() {
        super.onResume();
        sensorManager.registerListener(lightListener, sensor,SensorManager.SENSOR_DELAY_NORMAL);
    }
 
    public void onStop() {
        super.onStop();
        sensorManager.unregisterListener(lightListener);
    }

    public SensorEventListener lightListener = new SensorEventListener() {
        public void onAccuracyChanged(Sensor sensor, int acc) { }
 
        public void onSensorChanged(SensorEvent event) {
            float x = event.values[0];

            textLight.setText((int)x + " lux");
        }
    };
}

        เจ้าของบล็อกไม่อธิบายซ้ำใน Main.java แล้วนะ เพราะเคยอธิบายไปแล้ว ดังนั้นให้อ่านบทความ [Android Code] การใช้งาน Accelerometer แทนนะ

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center" >
    
    <TextView
        android:id="@+id/textLight"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp" 
        android:text="" />

</LinearLayout>


AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="app.akexorcist.sensor_light"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="app.akexorcist.sensor_light.Main"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>


        สำหรับหลักการใช้งาน Light Sensor จะเห็นว่าไม่มีอะไรยาก เพียงแค่ผู้ที่หลงเข้ามาอ่านนั้นเข้าใจการใช้งาน Accelerometer เพราะว่า Sensor บนอุปกรณ์แอนดรอยด์นั้นเรียกใช้งานเหมือนๆกัน และถ้าต้องการดาวน์โหลดไฟล์ตัวอย่างของบทความนี้ก็สามารถดาวน์โหลดได้ที่

                Sensor-Light [Google Drive]

                Sensor-Light [GitHub]

                Sensor-Light [Sleeping For Less]