* Artikel ini dipersembahkan oleh Intel Developer Zone. Untuk Mengetahui lebih lanjut tentang membuat aplikasi Android di Arstitektur Intel, kunjungi Intel Developer Zone for Android. Artikel asli dari artikel ini dapat dilihat di link ini.
Artikel ini mengenalkan kepada pengembang aplikasi tentang framework Android Sensor dan menjelaskan tentang bagaimana cara menggunakan beberapa sensor yang secara umum ada di ponsel-ponsel dan tablet-tablet berbasis prosesor Intel Atom. Di antara yang didiskusikan adalah sensor gerak, posisi, dan lingkungan. Walaupun GPS tidak dikategorikan sebagai sensor di framework Android, artikel ini juga menjelaskan tentang layanan lokasi berbasis GPS. Penjelasan di artikel ini berbasis Android 4.1, Jelly Bean.
[toc]
Ponsel dan tablet Android berbasis prosesor Intel Atom mendukung berbagai sensor. Sensor-sensor tersebut digunakan untuk mendeteksi gerakan dan perubahan posisi, dan melaporkan parameter lingkungan sekitarnya. Blog diagram di Gambar 1 menampilkan konfigurasi sensor yang memungkinkan di perangkat Android berbasis Intel Atom pada umumnya.
Framework sensor Android menyediakan mekanisme untuk mengakses sensor-sensor beserta datanya, terkecuali GPS, yang bisa diakses melalaui layanan lokasi Android. Kita akan membahas soal ini lebih lanjut nanti di artikel ini. Framework sensor adalah bagian dari paket android.hardware. Tabel 2 menjabarkan class dan antarmuka utama dari framework sensor.
Produsen perangkat memutuskan sensor-sensor apa saja yang perlu dibenamkan dalam sebuah perangkat. Kamu harus mengetahui sensor apa saja yang tersedia ketika aplikasi berjalan dengan memanggil fungsi getSensorList() dari framework sensor SensorManager dengan parameter “Sensor.TYPE_ALL). Contoh Kode 1 menampilkan sensor-sensor yang tersedia beserta informasi produsen, daya, dan keakuratan dari tiap sensor.
package com.intel.deviceinfo; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Fragment; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorManager; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; public class SensorInfoFragment extends Fragment { private View mContentView; private ListView mSensorInfoList; SimpleAdapter mSensorInfoListAdapter; private List<Sensor> mSensorList; private SensorManager mSensorManager; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public void onPause() { super.onPause(); } @Override public void onResume() { super.onResume(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContentView = inflater.inflate(R.layout.content_sensorinfo_main, null); mContentView.setDrawingCacheEnabled(false); mSensorManager = (SensorManager)getActivity().getSystemService(Context.SENSOR_SERVICE); mSensorInfoList = (ListView)mContentView.findViewById(R.id.listSensorInfo); mSensorInfoList.setOnItemClickListener( new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View view, int index, long arg3) { // with the index, figure out what sensor was pressed Sensor sensor = mSensorList.get(index); // pass the sensor to the dialog. SensorDialog dialog = new SensorDialog(getActivity(), sensor); dialog.setContentView(R.layout.sensor_display); dialog.setTitle("Sensor Data"); dialog.show(); } }); return mContentView; } void updateContent(int category, int position) { mSensorInfoListAdapter = new SimpleAdapter(getActivity(), getData() , android.R.layout.simple_list_item_2, new String[] { "NAME", "VALUE" }, new int[] { android.R.id.text1, android.R.id.text2 }); mSensorInfoList.setAdapter(mSensorInfoListAdapter); } protected void addItem(List<Map<String, String>> data, String name, String value) { Map<String, String> temp = new HashMap<String, String>(); temp.put("NAME", name); temp.put("VALUE", value); data.add(temp); } private List<? extends Map<String, ?>> getData() { List<Map<String, String>> myData = new ArrayList<Map<String, String>>(); mSensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL); for (Sensor sensor : mSensorList ) { addItem(myData, sensor.getName(), "Vendor: " + sensor.getVendor() + ", min. delay: " + sensor.getMinDelay() +", power while in use: " + sensor.getPower() + "mA, maximum range: " + sensor.getMaximumRange() + ", resolution: " + sensor.getResolution()); } return myData; } }
Framework sensor melaporkan data sensor menggunakan sistem koordinat 3-sumbu standar di mana X, Y, dan Z direpresentasikan oleh values[0], values[1], values[2] di objek SensorEvent secara berurutan.
Beberapa sensor seperti cahaya, temperatur, kedekatan, dan tekanan hanya mengembalikan satu nilai. Untuk sensor-sensor tersebut, hanya values[0] yang digunakan di objek SensorEvent.
Sensor-sensor lainnya melaporkan data dengan sistem koordinat sensor 3-sumbu standar. Berikut adalah sensor-sensor tersebut:
Sistem koordinat sensor 3- sumbu didefinisikan secara relatif dengan orientasi natural (bawaan) di sebuah layar dari perangkat. Untuk sebuah ponsel, orientasi naturalnya adalah potrait; untuk sebuah tablet, orientasi naturalnya adalah landscape. Ketika sebuah perangkat digenggam dengan orientasi naturalnya, sumbu x adalah horizontal dan menunjuk ke kanan, sumbu y adalah vertikal dan menunjuk ke atas, dan sumbu z menunjuk ke luar layar depan perangkat. Gambar 2 menampilkan sistem koordinat sensor untuk sebuah ponsel, dan Gambar 3 untuk sebuah tablet.
Gambar 3. Sistem koordinat sensor untuk sebuah tablet
Poin paling penting mengenai sistem koordinat sensor adalah bahwa sistem koordinat sensor tidak pernah berubah ketika perangkatnya bergerak maupun berubah orientasinya.
Framework sensor melaporkan data sensor dengan objek SensorEvent. Sebuah class dapat memantau data dari sensor tertentu dengan mengimplementasikan antarmuka SensorEventListener dan mendaftarkan dengan SensorManager untuk sensor tertentu. Framework sensor menginformasikan class tersebut tentang perubahan di status sensor melalui kedua fungsi di SensorEventListener yang diimplementasikan di class tersebut:
onAccuracyChanged()
dan
onSensorChanged()
Contoh Kode 2 mengimplementasikan SensorDialog yang digunakan di contoh SensorInfoFragment yang sudah dijelaskan di bagian “Mengambil Konfigurasi Sensor”.
package com.intel.deviceinfo; import android.app.Dialog; 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; public class SensorDialog extends Dialog implements SensorEventListener { Sensor mSensor; TextView mDataTxt; private SensorManager mSensorManager; public SensorDialog(Context ctx, Sensor sensor) { this(ctx); mSensor = sensor; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mDataTxt = (TextView) findViewById(R.id.sensorDataTxt); mDataTxt.setText("..."); setTitle(mSensor.getName()); } @Override protected void onStart() { super.onStart(); mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_FASTEST); } @Override protected void onStop() { super.onStop(); mSensorManager.unregisterListener(this, mSensor); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() != mSensor.getType()) { return; } StringBuilder dataStrBuilder = new StringBuilder(); if ((event.sensor.getType() == Sensor.TYPE_LIGHT)|| (event.sensor.getType() == Sensor.TYPE_TEMPERATURE)|| (event.sensor.getType() == Sensor.TYPE_PRESSURE)) { dataStrBuilder.append(String.format("Data: %.3fn", event.values[0])); } else{ dataStrBuilder.append( String.format("Data: %.3f, %.3f, %.3fn", event.values[0], event.values[1], event.values[2] )); } mDataTxt.setText(dataStrBuilder.toString()); } }
Sensor gerak digunakan untuk memantau pergerakan perangkat seperti goncangan, perputaran, ayunan, atau kemiringan. Akselerometer dan giroskop adalah dua sensor gerak yang teresdia di banyak tablet dan ponsel.
Sensor gerak melaporkan data menggunakan sistem koordinat sensor di mana tiga nilai di objek SensorEvent, values[0], values[1], dan values[2] merepresentasikan nilai sumbu x, y, dan z secara berurutan.
Untuk mehamai sensor gerak dan menggunakan datanya dalam sebuah aplikasi, kita perlu menerapkan beberapa rumus fisika yang terkait dengan gaya, massa, percepetan, hukum Newton tentang gerak, dan hubungan antara beberapa entitas ini dalam waktu. Untuk mempelajari lebih lanjut tentang rumus-rumus ini, bisa membaca buku fisika favorit kamu ataupun dari sumber publik.
Akselerometer mengukur percepatan yang ada pada sebuah perangkat dan propertinya dirangkum di Tabel 3.
Konsep untuk akselerometer diturunkan dari hukum gerak kedua Newton:
a = F / m
Percepatan sebuah objek adalah hasil dari dari gaya eksternal total yang diterapkan ke suatu objek. Gaya eksternal termasuk satu gaya yang mempengaruhi segala objek di Bumi, gravitasi. Hal ini sebanding dengan gaya total F yang diterapkan ke suatu objek dan berbanding terbalik dengan massa objek m.
Di kodingan kita, daripada langsung menggunakan rumus di atas, kita lebih peduli tentang hasil dari percepatan dalam suatu periode waktu pada kecepatan dan posisi perangkat. Rumus berikut ini menjelaskan tentang hubungan antara kecepatan sebuah objek v1, kecepatan awalnya v0, akselerasinya a, dan waktu t:
v1 = v0 + at
Untuk menghitung perpindahan posisi objek s, kita menggunakan rumus berikut:
s = at2/2
Dikarenakan gravitasi, percepatan gravitasi, direpresentasikan dengan simbol g, diterapkan ke semua objek di Bumi. Terlepas dari massa objek, g hanya bergantung pada garis lintang dari sebuah okasi objek dengan nilai di antara 9,78 dan 9,82 (m/s2). Kita menggunakan nilai standar konvensional untuk g:
g = 9.80665 (m/s2)
Karena akselerometer mengembalikan nilai menggunakan sistem koordinat multi dimensi, kita bisa menghitung jarak antaran sumbu x, y, dan z di kodingan kita menggunakan rumus berikut:
Sx = AxT2/2
Sy = AyT2/2
Sz = AzT2/2
Di mana Sx, Sy, dan Sz adalah perpindahan di sumbu x, y, dan z secara berurutan dan Ax, Ay, dan Az adalah percepatan sumbu x, y, dan z secara berurutan. T adalah waktu periode pengukuran.
public class SensorDialog extends Dialog implements SensorEventListener { … private Sensor mSensor; private SensorManager mSensorManager; public SensorDialog(Context context) { super(context); mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); … }
Kode 3. Pembuatan instance Akselerometer
Kadang kali kita tidak menggunakan semua nilai data dari ketiga dimensi. Di lain waktu juga kita mungkin perlu untuk mempertimbangkan orientasi perangkat. Sebagai contoh, untuk aplikasi labirin, kita hanya menggunakan percepatan gravitasi di sumbu x dan y untuk menghitung arah dan jarak pergerakan bola berdasarkan orientasi perangkat. Potongan kode di bawah ini (Kode 4) menggambarkan logikanya:
@Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) { return; } float accelX, accelY; … //detect the current rotation currentRotation from its “natural orientation” //using the WindowManager switch (currentRotation) { case Surface.ROTATION_0: accelX = event.values[0]; accelY = event.values[1]; break; case Surface.ROTATION_90: accelX = -event.values[0]; accelY = event.values[1]; break; case Surface.ROTATION_180: accelX = -event.values[0]; accelY = -event.values[1]; break; case Surface.ROTATION_270: accelX = event.values[0]; accelY = -event.values[1]; break; } //calculate the ball’s moving distances along x, and y using accelX, accelY and the time delta … } }
Kode 4. Memperhitungkan orientari perangkat ketika menggunakan data akselerometer di game labirin
Giroskop mengukur tingkat perputaran sebuah perangkat di sekitar sumbu x, y, dan z seperti yang diperlihatkan di Tabel 4. Nilai data di giroskop bisa berupa nilai positif ataupun negatif. Dengan melihat posisi awal sepanjang pertengahan sumbu-sumbu positif, jika perputarannya berlawanan jarum jam dengan sumbu maka nilainya positif; jika perputarannya searah jarum jam dengan sumbu maka nilainya negatif. Kita juga dapat menentukan arah dari sebuah nilai di giroskop menggunakan “peraturan tangan kanan” seperti yang diperlihatkan di Gambar 4.
Gambar 4. Menggunakan “peraturan tangan kanan” untuk menentukan arah perputaran positif
Banyak tablet Android mendukung dua sensor posisi: magnetometer dan sensor kedekatan. Magnetometer mengukur kekuatan medan magnet Bumi di sepanjang sumbu x, y, dan z sedangkan sensor kedekatan mendeteksi jarak antara perangkat dengan objek lain.
Penggunaan paling penting dari magnetometer (seperti yang dijabarkan di Tabel 5) di sistem Android adalah untuk mengimplementasikan kompas.
Kode 6 memperlihatkan bagaimana caranya membuat instance magnetometer
public class SensorDialog extends Dialog implements SensorEventListener { … private Sensor mMagnetometer; private SensorManager mSensorManager; public SensorDialog(Context context) { super(context); mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); … }
Kode 6. Membuat instance Giroskop
Sensor kedekatan memberikan jarak antara perangkat dengan objek lainnya. Perangkat tersebut dapat menggunakannya untuk mendeteksi apakah perangkat digunakan dekat dengan pengguna (lihat Tabel 6), sehingga dapat ditentukan apakah pengguna sedang melakukan panggilan telepon dan mematikan layar ketika panggilan telepon berlangsung.
Kode 7 menampilkan bagaimana caranya membuat instance sensor kedekatan.
public class SensorDialog extends Dialog implements SensorEventListener { … private Sensor mProximity; private SensorManager mSensorManager; public SensorDialog(Context context) { super(context); mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); … }
Kode 7. Membuat instance sensor kedekatan
Sensor-sensor lingkungan mendeteksi dan melaporkan parameter lingkungan sekitar perangkat seperti cahaya, temperatur, tekanan, dan kelembaban. Sensor cahaya sekitar (ALS) dan sensor tekanan (barometer) sudah tersedia di banyak tablet.
Sensor cahaya sekitar (seperti yang dijabarkan di Tabel 7) digunakan oleh sistem Android untuk mendeteksi pencahayaan di lingkungan sekitar dan mengatur tingkat keterangan layar seusai dengan level pencahayaan sekitar.
Kode 8 menampilkan bagaimana caranya membuat instance ALS.
… private Sensor mALS; private SensorManager mSensorManager; … mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); mALS = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); …
Kode 8. Pembuatan instance sensor cahaya sekitar
Aplikasi dapat menggunakan sensor tekanan atmosfer (barometer), seperti yang dijabarkan di Tabel 8, untuk menghitung ketinggian dari sebuah perangkat.
Kode 9 menampilkan bagaimana caranya membuat instance barometer.
… private Sensor mBarometer; private SensorManager mSensorManager; … mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); mBarometer = mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE); …
Kode 9. Pembuatan instance Barometer
Untuk menggunakan sensor-sensor di aplikasi kita, ada bagusnya untuk mengikuti pedoman berikut:
GPS (Global Positioning System) adalah sistem berbasis satelit yang memberikan informasi lokasi geometris secara akurat di seluruh dunia. GPS tersedia di banyak ponsel dan tablet Android. Dari banyak perspektif, GPS berperilaku sebagai sensor posisi. GPS dapat menyediakan data lokasi yang akurat untuk aplikasi yang berjalan di sebuah perangkat. Di platform Android, GPS tidak secara langsung diatur oleh framework sensor melainkan layanan lokasi Android mengakses dan mengirimkan data GPS ke sebuah aplikasi melalui location listener callback.
Bagian ini hanya mendiskusikan GPS dan layanan lokasi dari sudut pandang sensor perangkat keras. Strategi lokasi lengkap yang ditawarkan oleh Android 4.2 dan tablet serta ponsel Android berbasis Intel Atom terlalu besar topiknya dan di luar lingkup artikel ini.
Menggunakan GPS bukanlah satu-satunya cara untuk mendapatkan informasi lokasi dari sebuah perangkat Android. Android juga dapat menggunakan WiFi, jaringan seluler, dan jaringan nirkabel lainnya untuk mendapatkan lokasi perangkat saat ini. Tabel 9 mendaftarkan class dan interface utama yang digunakan untuk mengakses layanan lokasi Android.
Mirip dengan mekanisme penggunaan framework sensor untuk mengakses data sensor, aplikasi mengimplementasikan beberapa metode callback yang didefinisikan di interface LocationListener untuk mendapatkan pembaharuan lokasi GPS. LocationManager mengirimkan notifikasi pembaharuan GPS ke aplikasi melalui callback (peraturan “Jangan memanggil kami, kami yang memanggil kamu”).
Untuk mengakses data lokasi GPS di aplikasi, kita perlu untuk meminta izin akses lokasi di Android manifest file (Kode 10).
<manifest …> … <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> … </manifest>
Kode 10. Meminta izin akses lokasi di Android manifest file
Kode 11 menampilkan bagaimana caranya mendapatkan pembaharuan GPS dan menampilkan garis garis lintang dan garis bujur pada dialog text view.
package com.intel.deviceinfo; import android.app.Dialog; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.TextView; public class GpsDialog extends Dialog implements LocationListener { TextView mDataTxt; private LocationManager mLocationManager; public GpsDialog(Context context) { super(context); mLocationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mDataTxt = (TextView) findViewById(R.id.sensorDataTxt); mDataTxt.setText("..."); setTitle("Gps Data"); } @Override protected void onStart() { super.onStart(); mLocationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, this); } @Override protected void onStop() { super.onStop(); mLocationManager.removeUpdates(this); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } @Override public void onLocationChanged(Location location) { StringBuilder dataStrBuilder = new StringBuilder(); dataStrBuilder.append(String.format("Latitude: %.3f, Logitude%.3fn", location.getLatitude(), location.getLongitude())); mDataTxt.setText(dataStrBuilder.toString()); } }
Kode 11. Sebuah dialog yang menampilkan data lokasi GPS
GPS menyediakan informasi lokasi yang paling akurat dalam perangkat. Di lain pihak, sebagai fitur perangkat keras, GPS mengkonsumsi daya lebih. GPS juga memerlukan waktu untuk mendapatkan lokasi pertama yang tepat. Berikut adalah beberapa pedoman yang sebaiknya kita ikuti ketika mengembangkan aplikasi yang menggunakan GPS atau membutuhkan data lokasi.
Platform Android menyediakan API bagi pengembang aplikasi untuk mengakses sensor-sensor yang terdapat dalam perangkat. Sensor-sensor ini dapat menyediakan data mentah tentang pergerakan, posisi, dan kondisi lingkungan sekitar dari sebuah perangkat dengan akurasi dan presisi yang tinggi. Dalam mengembangkan aplikasi sensor, kita sebaiknya mengikuti panduan terbaik untuk memperbaiki performa dan efisiensi daya.
* Kunjungi Intel Developer Zone for Android untuk mengetahui lebih lanjut. Artikel asli dari artikel ini dapat dilihat di link ini.
Cisco mengungkapkan tiga kerentanan dalam layanannya. Ini dia penanganannya!
Ini ulasan mengenai keuntungan OptimalCloud Partner Platform, platform baru milik Optimal idM!
Google kenalkan dua koleksi baru dari Coral. Dua koleksi baru ini bakal menambah kemampuan pengembangan…
Raksasa Google baru saja mengembangkan sistem pemindaian kanker payudara berbasis kecerdasan buatan. Bagaimana hasilnya, berikut…
Meski dikenalkan bersamaan dengan Android 10 Beta, sampai kini Bubbles Notifications masih dalam tahap pengembangan.…
Samsung akan kembali memamerkan hasil program C-Lab ke ajang CES 2020. Ini dia proyek dan…