Codelab Android Sleep API

Yang akan Anda buat

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

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/googlecodelabs/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.)

1401a11c10711a60.png

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:

4bc64eb3b99eb0ae.png

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.

  1. Hubungkan perangkat Android ke komputer.
  2. Di toolbar, pilih konfigurasi start dari pemilih drop-down, pilih perangkat, lalu klik tombol segitiga hijau (Run) di sampingnya:

177045a302bf57d8.png

Di perangkat, Anda akan melihat aplikasi:

30efe28b9757e1e7.png

311c83ca64556d94.png

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.

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.

  1. Telusuri TODO: Tinjau library layanan play yang diperlukan untuk pengenalan aktivitas dalam file build.gradle untuk modul start. 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'
  1. Dalam modul start, telusuri TODO: Tambahkan pengenalan aktivitas dan izin booting lengkap dalam AndroidManifest.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.

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.

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.

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

Dokumen referensi