Menggunakan Sensor (Android App)
Pendahuluan
Sensor pada Android App berfungsi untuk mengindra & mengukur physical phenomenon (perubahan fisik/sinyal), serta mengubahnya menjadi sinyal fisik yang diperlukan oleh gadget.
Secara umum, platform Android support ke dalam 3 kategori sensor berikut:
- Motion sensors: mengukur akselerasi & gerakan (rotasi) dalam 3 axis. Contohnya: accelerometers, gravity sensors, gyroscopes, dan rotational vector sensors.
- Environmental sensors: mengukur parameter dari lingkungan seperti tekanan udara, intensitas cahaya, atau kelembaban udara. Contoh sensor yang dikategorikan environmental: barometers, photometers, dan thermometers.
- Position sensors: mengukur posisi fisik dari gadget. Contohnya magnetometer & orientation sensor.
Pada Android, pengaksesan sensor menggunakan “Android sensor framework”, baik itu sensor yang bersifat hardware-based dan juga software-based. Hardware-based sensor memiliki komponen fisik dan secara langsung mengukur environmental property tertentu seperti percepatan, medan magnet, dan lainnya.
Sedangkan software-based sensor tidak punya komponen fisik, tapi meniru behavior dari hardware-based sensor. Software-based sensor disebut juga sebagai virtual sensor atau synthetic sensor. Contoh software-based sensor adalah sensor yang mengukur sudut rotasi dari device terhadap axis koordinat x,y,z (TYPE_ORIENTATION).
Banyak app yang sudah dibuat untuk mendata atau melakukan semacam ”tes” terhadap sensor dari device yang dimiliki. Contohnya yaitu app “Sensor Box”.
Menampilkan sensor pada device
Sensor pada device dapat diakses menggunakan method “getSensorList” dari objek SensorManager. Berikut kode XML & Java untuk menampilkannya (menggunakan template Empty Activity dari Android Studio):
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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">
<ScrollView
android:layout_width="0dp"
android:layout_height="0dp"
android:contentDescription="@string/daftar_sensor"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" >
<TextView
android:id="@+id/sensor_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/placeholder" />
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity { private SensorManager mSensorManager; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); mSensorManager = (SensorManager) getSystemService(
Context.SENSOR_SERVICE);
List<Sensor> sensorList = mSensorManager.getSensorList(
Sensor.TYPE_ALL);
StringBuilder sensorText = new StringBuilder();
for(Sensor x:sensorList){
sensorText.append(x.getName()+"\n");
}
TextView sensorTextView = findViewById(R.id.sensor_list);
sensorTextView.setText(sensorText);
}
}
Hasil (Oppo Realme C1):
Contoh bekerja dengan sensor: mengukur cahaya
Berikut adalah contoh kode pada app dengan skenario: sensor akan mendeteksi intensitas cahaya, dan ketika nilainya di bawah ambang tertentu, maka akan mengubah tampilan app menjadi night mode.
Langkah 1: Bentuk project dengan template “Empty Activity”, dan tambahkan id “tv_text” pada komponen TextView.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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/tv_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>
Langkah 2: Tambahkan kode untuk mengakses sensor cahaya & menampilkan nilainya ke TextView.
- Bentuk objek dari SensorManager & Sensor (bisa di onStart atau onCreate tergantung keperluan)
- Implements SensorEventListener
- Override method onSensorChanged dan onAccuracyChanged
- Pada method onSensorChanged, tambahkan kode untuk menampilkan intensitas cahaya
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
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 android.widget.Toast;
public class MainActivity extends AppCompatActivity implementsSensorEventListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); SensorManager sensorManager = (SensorManager)
getSystemService(SENSOR_SERVICE);
if (sensorManager != null) {
Sensor lightSensor = sensorManager.getDefaultSensor(
Sensor.TYPE_LIGHT);
if (lightSensor != null) {
sensorManager.registerListener(this,
lightSensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
} else {
Toast.makeText(this,
"Sensor not detected",
Toast.LENGTH_SHORT).show();
}
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if(sensorEvent.sensor.getType() == Sensor.TYPE_LIGHT){
TextView textView = findViewById(R.id.tv_text);
textView.setText("Values: "+sensorEvent.values[0]);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
}
Untuk melihat apakah sensor cahaya bekerja dengan baik, dapat dilakukan dengan menutup/membuka sensor tersebut. Perhatikan adanya perubahan nilai yang terjadi. Jika menggunakan virtual machine, pengaturan dapat dilihat di sensor virtual.
Langkah 3: Tambahkan kode untuk mengubah ke dalam night mode (method onSensorChanged).
MainActivity.java
public class MainActivity extends AppCompatActivity implements SensorEventListener { UiModeManager uiManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
uiManager = (UiModeManager) MainActivity.this.
getSystemService(Context.UI_MODE_SERVICE); ...
} @Override
public void onSensorChanged(SensorEvent sensorEvent) {
if(sensorEvent.sensor.getType() == Sensor.TYPE_LIGHT){
TextView textView = findViewById(R.id.tv_text);
textView.setText("Values: "+sensorEvent.values[0]); if(sensorEvent.values[0] <= 15){
uiManager.setNightMode(UiModeManager.MODE_NIGHT_YES);
}else{
uiManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
}
}
}
...
}
Materi di atas disampaikan sebagai materi suplemen pada event VSGA 2022 skema JMP (suplemen di luar materi yang telah ditentukan). Demo dilakukan menggunakan:
- IDE: Android Studio (Chipmunk 2021.2.1)
- Screencast: scrcpy by Genymobile
Sumber
https://developer.android.com/guide/topics/sensors/sensors_overview