Advertisement
  1. Code
  2. Android SDK

Sensor Android di Kedalaman: Proximity dan Gyroscope

Scroll to top
Read Time: 9 min

() translation by (you can also view the original English article)

Mengapa pengguna selalu harus menekan tombol pada layar sentuh mereka? Dengan menggunakan beberapa sensor perangkat keras yang tersedia pada ponsel Android mid-range saat ini, anda dapat membuat aplikasi yang menawarkan pengalaman pengguna yang jauh lebih menarik.

Kerangka sensor, yang merupakan bagian dari Android SDK, memungkinkan anda membaca data mentah dari kebanyakan sensor, apakah itu perangkat keras atau perangkat lunak, dengan cara yang mudah dan konsisten. Dalam tutorial ini, saya akan menunjukkan cara menggunakan kerangka untuk membaca data dari dua sensor yang sangat umum: proximity and gyroscope. Saya juga akan mengenalkan anda pada sensor vektor rotasi, sensor komposit yang dapat, dalam banyak situasi, berfungsi sebagai alternatif yang lebih mudah dan lebih akurat untuk gyroscope.

Anda bisa mendapatkan gambaran tentang sensor perangkat keras android dengan membaca tutorial berikut ini:

Prasyarat

Untuk mengikuti, anda memerlukan hal berikut ini:

  • Perangkat Android dengan proximity sensor dan gyroscope
  • Versi terbaru Android Studio

1.   Setup Proyek

Jika aplikasi anda tidak dapat digunakan lagi pada perangkat yang tidak memiliki semua sensor perangkat keras yang dibutuhkannya, aplikasi anda seharusnya tidak dapat diinstal pada perangkat tersebut. Anda dapat membiarkan aplikasi Google Play dan aplikasi marketplaces lain tahu tentang persyaratan perangkat keras aplikasi anda dengan menambahkan satu atau lebih tag <uses-feature> untuk file manifes proyek Android Studio anda.

Aplikasi yang akan kami buat dalam tutorial ini tidak akan bekerja pada perangkat yang kekurangan proximity sensor dan gyroscope. Oleh karena itu, tambahkan baris berikut ke file manifes anda:

1
<uses-feature
2
    android:name="android.hardware.sensor.proximity"
3
    android:required="true" />
4
<uses-feature
5
    android:name="android.hardware.sensor.gyroscope"
6
    android:required="true" />

Perhatikan, bagaimanapun, itu karena tag <uses-feature> idak membantu jika pengguna menginstal aplikasi anda secara manual menggunakan file APK-nya, Anda masih harus secara terprogram memeriksa apakah ada sensor yang tersedia sebelum menggunakannya.

2.   Menggunakan Proximity Sensor

Untuk menghindari kejadian sentuhan tidak disengaja, layar sentuh ponsel anda menjadi hitam saat panggilan berlangsung, saat berada sangat dekat dengan telinga anda. Pernah bertanya-tanya bagaimana telepon anda menentukan apakah atau tidak bahwa ia dekat dengan telinga anda? Nah, itu menggunakan sensor kedekatan, yang merupakan sensor perangkat keras yang bisa membedakan apakah benda itu dekat. Beberapa sensor kedekatan juga bisa mengetahui seberapa jauh objeknya, meski jangkauan maksimumnya biasanya hanya sekitar 5 cm.

Mari sekarang kita membuat aktivitas yang perubahan warna latar belakang menjadi merah setiap kali anda mengarahkan tangan ke proximity sensor perangkat anda.

Langkah 1: Dapatkan Proximity Sensor

Untuk mendapatkan akses ke sensor perangkat keras, anda memerlukannya obyek SensorManager. Untuk membuatnya, gunakan metode getSystemService() anda kelas Activity dan lewatkan konstan SENSOR_SERVICE untuk itu

1
SensorManager sensorManager =
2
        (SensorManager) getSystemService(SENSOR_SERVICE);

Anda sekarang bisa membuat objek Sensor untuk sensor jarak dengan memanggil metode getDefaultSensor() dan melewati konstan TYPE_PROXIMITY untuk itu

1
Sensor proximitySensor =
2
        sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

Sebelum melanjutkan, selalu pastikan objek Sensor tidak null. Jika ya, itu berarti sensor jarak tidak tersedia.

1
if(proximitySensor == null) {
2
    Log.e(TAG, "Proximity sensor not available.");
3
    finish(); // Close app

4
}

Langkah 2: Register a Listener

Agar bisa membaca data mentah yang dihasilkan oleh sensor, anda harus mengaitkan  SensorEventListener dengan nya dengan memanggil metode registerListener() dari obyek SensorManager. Saat melakukannya, anda juga harus menentukan seberapa sering data harus dibaca dari sensor.

Kode berikut mendaftarkan listerner yang memungkinkan anda membaca data sensor jarak setiap dua detik sekali:

1
// Create listener

2
SensorEventListener proximitySensorListener = new SensorEventListener() {
3
    @Override
4
    public void onSensorChanged(SensorEvent sensorEvent) {
5
        // More code goes here

6
    }
7
8
    @Override
9
    public void onAccuracyChanged(Sensor sensor, int i) {
10
    }
11
};
12
13
// Register it, specifying the polling interval in

14
// microseconds

15
sensorManager.registerListener(proximitySensorListener,
16
                proximitySensor, 2 * 1000 * 1000);

Saya sarankan anda selalu daftar listener di dalam metode onResume() aktivitas anda dan tidak mendaftarkannya di dalam metode onPause(). Inilah cara anda bisa membatalkan pendaftaran listener:

1
sensorManager.unregisterListener(proximitySensorListener);

Langkah 3: Gunakan Raw Data

Objek SensorEvent, yang tersedia di dalam metode onSensorChanged(), memiliki values array berisi semua data mentah yang dihasilkan oleh sensor terkait. Dalam kasus sensor jarak, array berisi satu nilai yang menentukan jarak antara sensor dan benda terdekat dalam sentimeter.

Jika nilainya sama dengan kisaran maksimum sensor, aman untuk berasumsi bahwa tidak ada yang terdekat. Sebaliknya, jika kurang dari jangkauan maksimum, berarti ada sesuatu di dekatnya. Anda dapat menentukan jangkauan maksimal dari setiap sensor perangkat keras yang menggunakan metode  getMaximumRange() yang terkait obyek Sensor.

Untuk benar-benar mengubah warna latar belakang aktivitas berdasarkan data sensor jarak jauh, anda bisa menggunakan metode setBackgroundColor() tampilan dekorasi jendela tingkat atas

Dengan demikian, tambahkan kode berikut di dalam metode onSensorChanged() yang anda buat pada langkah sebelumnya:

1
if(sensorEvent.values[0] < proximitySensor.getMaximumRange()) {
2
    // Detected something nearby

3
    getWindow().getDecorView().setBackgroundColor(Color.RED);
4
} else {
5
    // Nothing is nearby

6
    getWindow().getDecorView().setBackgroundColor(Color.GREEN);
7
}

Jika anda menjalankan aplikasi sekarang dan arahkan tangan ke tepi atas ponsel anda, anda seharusnya melihat layar menjadi merah.

Background color changes when an object is detected nearbyBackground color changes when an object is detected nearbyBackground color changes when an object is detected nearby

3.   Menggunakan Gyroscope

Giroskop memungkinkan anda menentukan kecepatan sudut perangkat Android pada waktu tertentu. Dalam istilah yang lebih sederhana, ia memberi tahu anda seberapa cepat perangkat berputar mengelilingi sumbu X, Y, dan Z. Akhir-akhir ini, bahkan telepon anggaran dibuat dengan giroskop yang terpasang, apa yang ditambah dengan kenyataan dan aplikasi virtual reality menjadi sangat populer.

Dengan menggunakan gyroscope,anda dapat mengembangkan aplikasi yang dapat merespons perubahan menit dalam orientasi perangkat. Untuk melihat caranya, mari kita sekarang membuat aktivitas yang warna latar belakang berubah menjadi biru setiap kali anda memutar telepon ke arah berlawanan arah jarum jam sepanjang sumbu Z, dan menjadi kuning sebaliknya.

Langkah 1: Dapatkan Gyroscope

Untuk membuat objek Sensor untuk giroskop, yang perlu anda lakukan adalah melewatkan konstan TYPE_GYROSCOPE ke metode getDefaultSensor() obyek SensorManager.

1
gyroscopeSensor = 
2
        sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);

Langkah 2: Daftarkan Listener

`Membuat Listener untuk sensor giroskop tidak berbeda dengan menciptakan untuk sensor jarak. Saat mendaftarkannya, anda harus memastikan bahwa frekuensi samplingnya sangat tinggi. Oleh karena itu, daripada menentukan polling interval dalam mikrodetik, saya sarankan Anda menggunakan SENSOR_DELAY_NORMAL constant. 

1
// Create a listener

2
gyroscopeSensorListener = new SensorEventListener() {
3
    @Override
4
    public void onSensorChanged(SensorEvent sensorEvent) {
5
        // More code goes here

6
    }
7
8
    @Override
9
    public void onAccuracyChanged(Sensor sensor, int i) {
10
    }
11
};
12
13
// Register the listener

14
sensorManager.registerListener(gyroscopeSensorListener,
15
        gyroscopeSensor, SensorManager.SENSOR_DELAY_NORMAL);

Langkah 3: Gunakan Raw Data

Data mentah sensor gyroscope terdiri dari tiga nilai float, yang menentukan kecepatan sudut perangkat sepanjang sumbu X, Y, dan Z. Unit dari setiap nilai adalah radian per detik. Jika terjadi rotasi berlawanan arah jarum jam sepanjang sumbu, nilai yang terkait dengan sumbu tersebut akan menjadi positif. Jika rotasi searah jarum jam, maka akan negatif.

Karena saat ini kami hanya tertarik dalam rotasi sepanjang sumbu Z, kami hanya akan bekerja dengan elemen ketiga di values array dari obyek SensorEvent. Jika ia lebih dari 0.5f, kita bisa, untuk sebagian besar, pastikan bahwa rotasi adalah berlawanan arah jarum jam, dan mengatur warna latar belakang biru. Begitu pula jika kurang dari -0.5f, kita dapat mengatur warna latar belakang kuning.

1
if(sensorEvent.values[2] > 0.5f) { // anticlockwise

2
    getWindow().getDecorView().setBackgroundColor(Color.BLUE);
3
} else if(sensorEvent.values[2] < -0.5f) { // clockwise

4
    getWindow().getDecorView().setBackgroundColor(Color.YELLOW);
5
}

Jika anda menjalankan aplikasi sekarang, pegang telepon anda dalam modus potret, dan miringkan ke kiri, Anda akan melihat aktivitasnya menjadi biru. Jika anda memiringkannya ke arah yang berlawanan, warnanya akan menjadi kuning.

Background color changes based on angular velocityBackground color changes based on angular velocityBackground color changes based on angular velocity

Jika anda memutar telepon terlalu banyak, orientasi layarnya akan berubah menjadi lansekap dan aktivitas anda akan dimulai ulang. Untuk menghindari kondisi ini, saya sarankan anda mengatur screenOrientation dari aktivitas ke portrait dalam file manifest

1
<activity
2
    android:name=".GyroscopeActivity"
3
    android:screenOrientation="portrait">
4
</activity>

4.   Menggunakan Rotation Vector Sensor

Sebagian besar pengembang saat ini lebih menyukai perangkat lunak, sensor komposit dari sensor perangkat keras. Sensor perangkat lunak menggabungkan data mentah tingkat rendah dari beberapa sensor perangkat keras untuk menghasilkan data baru yang tidak hanya mudah digunakan, namun juga lebih akurat. Sensor jarak tidak memiliki alternatif perangkat lunak. Giroskop, bagaimanapun, memiliki dua: sensor vektor rotasi permainan dan sensor vektor rotasi. Dalam tutorial ini, kita akan fokus hanya pada yang terakhir.

Pada contoh langkah sebelumnya, kita mengubah warna latar belakang aktivitas setiap kali kecepatan sudut sepanjang sumbu Z lebih dari 0,5 rad/s searah jarum jam atau berlawanan arah jarum jam. Bekerja dengan kecepatan sudut, bagaimanapun, tidaklah intuitif. Selanjutnya, kami tidak tahu apa sudut sebenarnya perangkat sebelum atau sesudah rotasi.

Dengan menggunakan sensor vektor rotasi, mari kita buat aktivitas yang perubahan warnanya hanya bila diputar dengan sudut tertentu. Misalnya, kita bisa mengubahnya kuning setiap kali putarannya - sepanjang sumbu Z - lebih dari 45 °, putih bila rotasinya antara -10 ° dan 10 °, dan biru bila rotasinya kurang dari -45 °.

Langkah 1: Set Up the Rotation Vector Sensor

Untuk mendapatkan sensor vektor rotasi, anda harus melewati konstan TYPE_ROTATION_VECTOR ke metode getDefaultSensor() obyek SensorManager.

1
rotationVectorSensor =
2
        sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);

Bekerja dengan software sensor tidak berbeda dengan bekerja dengan hardware. Karena itu, sekarang anda harus mengasosiasikan listener dengan sensor vektor rotasi agar bisa membaca datanya. Anda bisa kembali menggunakan konstan SENSOR_DELAY_NORMAL  untuk interval polling.

1
// Create a listener

2
rvListener = new SensorEventListener() {
3
    @Override
4
    public void onSensorChanged(SensorEvent sensorEvent) {
5
        // More code goes here        

6
    }
7
8
    @Override
9
    public void onAccuracyChanged(Sensor sensor, int i) {
10
    }
11
};
12
13
// Register it

14
sensorManager.registerListener(rvListener,
15
            rotationVectorSensor, SensorManager.SENSOR_DELAY_NORMAL);

Langkah 2: Gunakan Data

Sensor vektor rotasi menggabungkan data mentah yang dihasilkan oleh giroskop, akselerometer, dan magnetometer untuk membuat quaternion. Akibatnya, values array dari objek SensorEvent memiliki lima elemen berikut:

  • Komponen X, Y, Z, dan W dari quaternion
  • Keakuratan heading

Anda dapat mengubah quaternion menjadi matriks rotasi, matriks 4x4, dengan menggunakan metode getRotationMatrixFromVector() dari kelas SensorManager.

1
float[] rotationMatrix = new float[16];
2
SensorManager.getRotationMatrixFromVector(
3
        rotationMatrix, sensorEvent.values);

Jika anda mengembangkan aplikasi OpenGL, anda dapat menggunakan matriks rotasi secara langsung untuk mengubah objek dalam adegan 3D anda. Untuk saat ini, mari kita mengubah matriks rotasi menjadi serangkaian orientasi, yang menentukan rotasi perangkat sepanjang sumbu Z, X, dan Y. Untuk melakukannya, kita bisa menggunakan metode getOrientation() dari kelas SensorManage.

Sebelum anda memanggil metode getOrientation(), anda harus memetakan ulang sistem koordinat matriks rotasi. Lebih tepatnya, anda harus memutar matriks rotasi sedemikian rupa sehingga sumbu Z dari sistem koordinat baru bertepatan dengan sumbu Y dari sistem koordinat semula.

1
// Remap coordinate system

2
float[] remappedRotationMatrix = new float[16];
3
SensorManager.remapCoordinateSystem(rotationMatrix,
4
        SensorManager.AXIS_X,
5
        SensorManager.AXIS_Z,
6
        remappedRotationMatrix);
7
8
// Convert to orientations

9
float[] orientations = new float[3];
10
SensorManager.getOrientation(remappedRotationMatrix, orientations);

Secara default, orientations array berisi sudut dalam radian bukan derajat. Jika anda terbiasa dengan radian, jangan ragu untuk menggunakannya secara langsung. Jika tidak, gunakan kode berikut untuk mengubah semua sudutnya menjadi derajat:

1
for(int i = 0; i < 3; i++) {
2
    orientations[i] = (float)(Math.toDegrees(orientations[i]));
3
}

Anda sekarang dapat mengubah warna latar belakang aktivitas berdasarkan elemen ketiga orientasi Array.

1
if(orientations[2] > 45) {
2
    getWindow().getDecorView().setBackgroundColor(Color.YELLOW);
3
} else if(orientations[2] < -45) {
4
    getWindow().getDecorView().setBackgroundColor(Color.BLUE);
5
} else if(Math.abs(orientations[2]) < 10) {
6
    getWindow().getDecorView().setBackgroundColor(Color.WHITE);
7
}

Jika anda menjalankan aplikasi sekarang, pegang telepon anda dalam mode potret, dan miringkan lebih dari 45 ° searah jarum jam atau berlawanan arah jarum jam, anda harus melihat perubahan warna latar belakang.

Background color changes based on angleBackground color changes based on angleBackground color changes based on angle

Kesimpulan

Dalam tutorial ini, anda belajar bagaimana menggunakan kerangka sensor Android untuk membuat aplikasi yang dapat merespons data yang dihasilkan oleh proximity sensor dan gyroscope. Anda juga belajar bagaimana bekerja dengan sensor vektor rotasi, alternatif yang lebih populer untuk giroskop. Jangan ragu untuk menggunakan sensor dengan cara yang kreatif. Sadarilah, aplikasi yang menggunakan sensor yang tidak efisien dapat menguras baterai perangkat dengan sangat cepat.

Untuk mempelajari lebih lanjut tentang sensor perangkat keras dan data yang mereka hasilkan, anda bisa merujuk ke sensor panduan API resmi. Dan lihat beberapa konten perangkat keras dan sensor kami yang lain di sini di Envato Tuts+!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.