1. Pengantar
Yang akan Anda bangun
Dalam codelab ini, Anda akan membuat aplikasi Android untuk mendeteksi waktu tidur pengguna. Aplikasi ini akan:
- Meminta izin
- Mendaftar ke Android Sleep API
- Mengambil peristiwa API dan menampilkannya di UI
- Membatalkan pendaftaran saat tidak lagi diperlukan
Yang akan Anda butuhkan
- Android Studio versi terbaru dengan Android Build Tools v21 atau yang lebih baru
- Perangkat yang menjalankan Android 10 (API level 29) atau yang lebih baru
2. Mempersiapkan
Meng-clone repositori project awal
Untuk memulainya secepat mungkin, kami telah menyiapkan project awal untuk Anda kembangkan. Periksa apakah Anda memiliki git dengan mengetikkan git --version
di command line/terminal. Jika tidak, ikuti petunjuk ini untuk menginstalnya. Lalu, Anda dapat menjalankan perintah berikut untuk meng-clone project.
git clone https://github.com/android/codelab-android-sleep/
Mengimpor project
Mulai Android Studio, pilih "Open an existing Android Studio project" dari layar Welcome, lalu buka direktori project.
Setelah project dimuat, Anda juga akan melihat notifikasi bahwa Git tidak melacak semua perubahan lokal. Anda dapat mengklik "Ignore" atau "X" di kanan atas. (Anda tidak akan mendorong perubahan apa pun kembali ke repositori Git.)
Di sudut kiri atas jendela project, Anda akan melihat sesuatu seperti gambar berikut jika berada dalam tampilan Android. (Jika berada dalam tampilan Project, Anda harus memperluas project untuk melihat hal yang sama.)
Ada dua ikon folder (start
dan complete
). Masing-masing dikenal sebagai "modul".
Perlu diketahui bahwa Android Studio mungkin memerlukan waktu beberapa detik untuk mengompilasi project di latar belakang untuk pertama kalinya. Selama durasi ini, Anda akan melihat indikator lingkaran berputar di status bar di bagian bawah Android Studio:
Sebaiknya Anda menunggu hingga proses ini selesai sebelum memodifikasi kode. Ini akan memungkinkan Android Studio menarik semua komponen yang diperlukan.
Selain itu, jika Anda ditanya "Reload for language changes to take effect?" atau yang serupa, pilih "Yes".
Memahami project awal
Baik, Anda sudah siap menambahkan pengenalan aktivitas. Kita akan menggunakan modul start
, yang merupakan titik awal codelab ini. Dengan kata lain, Anda akan menambahkan kode dari setiap langkah ke start
.
Modul complete
dapat digunakan untuk memeriksa pekerjaan Anda, atau sebagai referensi jika Anda mengalami masalah apa pun.
Ringkasan komponen utama:
MainActivity.kt
: Merender layar utama aplikasi saat pengguna meluncurkan aplikasi.SleepReceiver.kt
: Mengekstrak peristiwa tidur dari API dan menyimpannya ke database.BootReceiver.kt
: Mendaftar ulang ke Sleep API saat booting perangkat sudah lengkap agar dapat terus mendeteksi peristiwa Sleep API.
Menjalankan project awal
Mari kita jalankan aplikasi.
- Hubungkan perangkat Android ke komputer.
- Di toolbar, pilih konfigurasi
start
dari pemilih drop-down, pilih perangkat, lalu klik tombol segitiga hijau (Run) di sampingnya:
Di perangkat, Anda akan melihat aplikasi:
Kita belum menambahkan kode apa pun untuk melacak tidur. Kode tersebut akan muncul di bagian berikutnya.
Di bagian berikutnya, kita akan meninjau library dan izin yang diperlukan.
3. Meninjau library dan menambahkan izin
Meninjau build.gradle dan AndroidManifest.xml
Untuk menggunakan Sleep API di aplikasi, Anda harus mendeklarasikan dependensi ke Google Location and Activity Recognition API dan menentukan izin com.google.android.gms.permission.ACTIVITY_RECOGNITION
di manifes aplikasi.
- Telusuri TODO: Tinjau library layanan play yang diperlukan untuk pengenalan aktivitas dalam file
build.gradle
untuk modulstart
. Tidak ada tindakan untuk langkah ini. Cukup tinjau dependensi yang dideklarasikan yang kita butuhkan. Tampilannya akan terlihat seperti ini:
// TODO: Review play services library required for activity recognition.
implementation 'com.google.android.gms:play-services-location:18.0.0'
- Dalam modul
start
, telusuri TODO: Tambahkan pengenalan aktivitas dan izin booting lengkap dalamAndroidManifest.xml
, lalu tambahkan kode berikut ke elemen<manifest>
.
<!-- TODO: Add activity recognition and receive boot complete permissions. -->
<!-- Required for 29+. -->
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Kode Anda kini akan terlihat mirip seperti ini:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.example.sleepcodelab">
...
<!-- TODO: Add activity recognition and receive boot complete permissions. -->
<!-- Required for 29+. -->
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
</manifest>
Seperti yang dapat dilihat dari komentar, Anda harus menambahkan izin runtime untuk API versi 29.
Selesai. Aplikasi Anda kini dapat mendukung pengenalan aktivitas tidur. Kita hanya perlu menambahkan kode untuk mendapatkannya.
Meninjau pemeriksaan izin Pengenalan Aktivitas
Kita perlu memeriksa dan meminta izin runtime jika diperlukan:
- Dalam
MainActivity.kt
, kita akan memeriksa izin pengenalan aktivitas. - Jika izin tidak diberikan, kita akan memanggil
displayPermissionSettingsSnackBar()
. Snackbar ini menjelaskan kebutuhan akan izin dan memungkinkan pengguna menyetujui izin di setelan sistem.
Dalam modul start
, telusuri TODO: Tinjau pemeriksaan izin Pengenalan Aktivitas dalam MainActivity.kt
. Anda akan melihat cuplikan kode ini.
Perlu diketahui bahwa tidak ada tindakan untuk bagian ini.
// TODO: Review Activity Recognition permission checking.
private fun activityRecognitionPermissionApproved(): Boolean {
return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(
this,
Manifest.permission.ACTIVITY_RECOGNITION
);
}
Mengaktifkan/menonaktifkan Pemantauan pola tidur
Dalam modul start
, telusuri TODO: Aktifkan/Nonaktifkan Pemantauan pola tidur, lalu minta izin jika diperlukan dalam MainActivity.kt
. Ganti metode onClickRequestSleepData()
dengan kode berikut.
// TODO: Enable/Disable sleep tracking and ask for permissions if needed.
fun onClickRequestSleepData(view: View) {
if (activityRecognitionPermissionApproved()) {
if (subscribedToSleepData) {
unsubscribeToSleepSegmentUpdates(applicationContext, sleepPendingIntent)
} else {
subscribeToSleepSegmentUpdates(applicationContext, sleepPendingIntent)
}
} else {
requestPermissionLauncher.launch(permission.ACTIVITY_RECOGNITION)
}
}
Jika izin Pengenalan Aktivitas disetujui dan pengguna berlangganan data tidur, kita akan berlangganan pembaruan aktivitas tidur. Jika sebaliknya, kita akan berhenti berlangganan.
Jika izin tidak disetujui, kita mengarahkan pengguna ke aktivitas layar pembuka yang menjelaskan alasan kita memerlukan izin tersebut dan memungkinkan mereka mengaktifkannya.
4. Berlangganan update Sleep API
Membuat PendingIntent
Dalam modul start
, telusuri TODO: Buat PendingIntent untuk peristiwa Sleep API dalam MainActivity.kt
. Tempelkan cuplikan berikut.
// TODO: Create a PendingIntent for Sleep API events
sleepPendingIntent =
SleepReceiver.createSleepReceiverPendingIntent(context = applicationContext)
Sekarang kita memiliki cara untuk mendapatkan pembaruan saat data Sleep API tersedia.
Meminta pembaruan Sleep API
Dalam modul start
, telusuri TODO: Minta pembaruan Sleep API dalam MainActivity.kt
. Tempelkan cuplikan berikut.
// TODO: Request Sleep API updates
val task = ActivityRecognition.getClient(context).requestSleepSegmentUpdates(
pendingIntent,
// Registers for both SleepSegmentEvent and SleepClassifyEvent data.
SleepSegmentRequest.getDefaultSleepSegmentRequest()
)
task.addOnSuccessListener {
mainViewModel.updateSubscribedToSleepData(true)
Log.d(TAG, "Successfully subscribed to sleep data.")
}
task.addOnFailureListener { exception ->
Log.d(TAG, "Exception when subscribing to sleep data: $exception")
}
Setelah berhasil mendaftar ke pembaruan Sleep API, aplikasi Anda akan menerima notifikasi deteksi tidur di PendingIntent yang terdaftar.
Berlangganan kembali pada saat booting lengkap
Dalam modul start
, telusuri TODO: Minta Sleep API pada saat booting lengkap dalam receiver/BootReceiver.kt
. Tempelkan cuplikan berikut.
// TODO: Request Sleep API upon boot complete
val subscribedToSleepData = repository.subscribedToSleepDataFlow.first()
if (subscribedToSleepData) {
subscribeToSleepSegmentUpdates(
context = context,
pendingIntent = SleepReceiver.createSleepReceiverPendingIntent(context)
)
}
Kode ini memungkinkan aplikasi untuk terus menerima pembaruan Sleep API setelah perangkat dimulai ulang.
5. Memproses Peristiwa
Saat peristiwa deteksi waktu tidur atau klasifikasi tidur terjadi, aplikasi akan menerima callback Intent. Daftar objek SleepSegmentEvent atau SleepClassifyEvent dapat diekstrak dari Intent.
Mari kita tambahkan kode untuk menangani peristiwa tersebut.
Dalam modul start
, telusuri TODO: Ekstrak informasi tidur dari PendingIntent dalam receiver/SleepReceiver.kt
. Tambahkan kode berikut setelah komentar.
// TODO: Extract sleep information from PendingIntent.
if (SleepSegmentEvent.hasEvents(intent)) {
val sleepSegmentEvents: List<SleepSegmentEvent> =
SleepSegmentEvent.extractEvents(intent)
addSleepSegmentEventsToDatabase(repository, sleepSegmentEvents)
} else if (SleepClassifyEvent.hasEvents(intent)) {
val sleepClassifyEvents: List<SleepClassifyEvent> =
SleepClassifyEvent.extractEvents(intent)
addSleepClassifyEventsToDatabase(repository, sleepClassifyEvents)
}
Tindakan ini akan menyimpan data SleepSegmentEvent
atau SleepClassifyEvent
ke Room database. MainActivity mengakses informasi database tersebut melalui ViewModel menggunakan LiveData. Untuk mempelajari lebih lanjut cara berbagai class tersebut saling bekerja sama, lihat Room dengan codelab View.
Selesai. Coba jalankan aplikasi.
6. Menginstal aplikasi dan meninjau kode
Hubungkan perangkat Anda ke workstation menggunakan kabel. Klik "Run" dari Android Studio untuk menginstal dan menjalankan aplikasi di perangkat. Setelah memberikan Izin Pengenalan Aktivitas dan mengetuk tombol SUBSCRIBE TO SLEEP DATA, SleepClassifyEvent pertama akan muncul setelah kurang lebih 10 menit. SleepSegmentEvent akan muncul dalam satu hari.
Jangan ragu untuk membaca seluruh kode guna meninjau apa saja yang telah Anda lakukan dan dapatkan ide yang lebih baik tentang cara kerja kode tersebut.
Peninjauan kode opsional
Peninjauan kode berikut bersifat opsional. Peninjauan kode ini memberikan detail tentang pemetaan data antara entity database dan Sleep API:
data/db/SleepClassifyEventEntity.kt
data/db/SleepSegmentEventEntity.kt