Menambahkan izin runtime ke aplikasi Anda di Kotlin

1. Selamat Datang

Pengantar

Izin aplikasi digunakan untuk memberikan akses ke data dan fungsi selain yang disediakan oleh sandbox aplikasi. Izin ini dapat meningkatkan fungsionalitas aplikasi dengan memungkinkannya mengakses internet, lokasi perangkat, kamera, dan banyak lagi.

Untuk menggunakan kemampuan ini, Anda harus meminta izin dari pengguna. Codelab ini akan memandu Anda melewati langkah-langkah yang diperlukan untuk menambahkan izin runtime dan memeriksa apakah izin tersebut diberikan atau tidak.

Yang Anda butuhkan

Yang harus sudah Anda ketahui

Yang akan Anda pelajari

  • Cara menambahkan izin ke manifes Android.
  • Cara meminta izin.
  • Cara menangani saat izin diterima dan saat ditolak.
  • Cara memeriksa apakah izin telah diberikan.

Yang akan Anda bangun

Anda akan membuat aplikasi yang meminta izin kamera. Anda akan menerapkan bagian izin aplikasi, tetapi bukan bagian kamera.

2. Membuat project Android Studio

  1. Mulai project Android Studio baru.
  2. Pilih Empty Activity.

70e5de28256e3dcb.png

  1. Beri nama project Permissions Codelab dan setel bahasa ke Kotlin.

f2948b584ca99c47.png

3. Menyiapkan kode

  1. Tambahkan versi terbaru dependensi berikut ke dalam file build.gradle level aplikasi. Hal ini memungkinkan Anda menggunakan library Activity yang akan dibahas nanti dalam codelab.
implementation "androidx.activity:activity-ktx:1.2.2"
implementation "androidx.fragment:fragment-ktx:1.3.2"
  1. Setel opsi build viewBinding ke benar (true) di blok Android untuk mengaktifkan ViewBinding.
android {
   ...
   buildFeatures {
       viewBinding true
   }
}
  1. Lalu tekan tombol palu hijau untuk membangun. Tindakan ini akan menghasilkan class binding yang disebut ActivityMainBinding yang akan Anda gunakan nanti untuk ViewBinding.

d4064454e5c50111.png

  1. Buka file activity_main.xml dan ganti kode dengan kode berikut.
<?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:id="@+id/main_layout"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">

   <Button
       android:id="@+id/button"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Request Permissions"
       android:onClick="onClickRequestPermission"
       app:layout_constraintBottom_toBottomOf="parent"
       app:layout_constraintEnd_toEndOf="parent"
       app:layout_constraintStart_toStartOf="parent"
       app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
  1. Tambahkan string ini ke dalam file strings.xml.
<string name="app_name">Permissions Codelab</string>
<string name="permission_required">Camera access is required to display the camera preview.</string>
<string name="ok">OK</string>
<string name="permission_granted">Permission is granted. You can use the camera now.</string>
  1. Pada MainActivity.kt, di atas metode onCreate(), tentukan variabel untuk tata letak dan ViewBinding.
private lateinit var layout: View
private lateinit var binding: ActivityMainBinding
  1. Ganti kode dalam metode onCreate() dengan kode di bawah ini. Kode ini melakukan inisialisasi binding, membuat val untuk mewakili tampilan dan menyetelnya ke root binding, serta menyetel tata letak ke mainLayout binding.
override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   binding = ActivityMainBinding.inflate(layoutInflater)
   val view = binding.root
   layout = binding.mainLayout
   setContentView(view)
}
  1. Di bagian bawah file, dalam class MainActivity, tambahkan fungsi ekstensi untuk menampilkan snackbar di seluruh codelab.
fun View.showSnackbar(
   view: View,
   msg: String,
   length: Int,
   actionMessage: CharSequence?,
   action: (View) -> Unit
) {
   val snackbar = Snackbar.make(view, msg, length)
   if (actionMessage != null) {
       snackbar.setAction(actionMessage) {
           action(this)
       }.show()
   } else {
       snackbar.show()
   }
}

4. Menambahkan izin ke manifes

Hal pertama yang harus Anda lakukan adalah mendeklarasikan bahwa izin Anda akan digunakan di Android manifest menggunakan tag <uses-permission>.

Terkadang, izin yang Anda minta juga memiliki persyaratan lain. Dalam hal ini, Anda tidak dapat menggunakan aplikasi kamera, kecuali jika perangkat memiliki kamera. Karena itu, Anda juga akan menambahkan tag <uses-feature> ke manifes.

  1. Di file AndroidManifest.xml, tambahkan izin untuk kamera di atas tag <application>.
<uses-permission android:name="android.permission.CAMERA" />

5. Membuat peluncur izin

Di MainActivity.kt, buat val yang disebut requestPermissionLauncher, lalu salin kode ini ke dalamnya. Beberapa butir poin berikutnya akan menguraikan isi dalam kode ini.

private val requestPermissionLauncher =
   registerForActivityResult(
       ActivityResultContracts.RequestPermission()
   ) { isGranted: Boolean ->
       if (isGranted) {
           Log.i("Permission: ", "Granted")
       } else {
           Log.i("Permission: ", "Denied")
       }
   }
private val requestPermissionLauncher =
   registerForActivityResult(
       ActivityResultContracts.RequestPermission())
  • Tambahkan callback untuk menangani kasus ketika telah diberikan atau tidak. Dalam hal ini, kita mencatat hasilnya.
{ isGranted: Boolean ->
       if (isGranted) {
           Log.i("Permission: ", "Granted")
       } else {
           Log.i("Permission: ", "Denied")
       }
}

6. Meminta izin

  1. Buat fungsi yang disebut onClickRequestPermission(view: View), lalu salin kode ini ke dalamnya. Dalam beberapa butir poin berikutnya, kita akan menguraikan yang terjadi di dalamnya.
fun onClickRequestPermission(view: View) {
   when {
       ContextCompat.checkSelfPermission(
           this,
           Manifest.permission.CAMERA
       ) == PackageManager.PERMISSION_GRANTED -> {
           layout.showSnackbar(
               view,
               getString(R.string.permission_granted),
               Snackbar.LENGTH_INDEFINITE,
               null
           ) {}
       }

       ActivityCompat.shouldShowRequestPermissionRationale(
           this,
           Manifest.permission.CAMERA
       ) -> {
           layout.showSnackbar(
               view,
               getString(R.string.permission_required),
               Snackbar.LENGTH_INDEFINITE,
               getString(R.string.ok)
           ) {
               requestPermissionLauncher.launch(
                   Manifest.permission.CAMERA
               )
           }
       }

       else -> {
           requestPermissionLauncher.launch(
               Manifest.permission.CAMERA
           )
       }
   }
}
  • Siapkan pernyataan when untuk mencakup tiga kasus: jika izin sudah diberikan, jika aplikasi menganggapnya harus menampilkan alasan izin permintaan, dan jika belum diminta.
when {
   ContextCompat.checkSelfPermission(
       this,
       Manifest.permission.CAMERA
   ) == PackageManager.PERMISSION_GRANTED -> {

   }

   ActivityCompat.shouldShowRequestPermissionRationale(
       this,
       Manifest.permission.CAMERA
   ) -> {

   }

   else -> {

   }
}
  • Jika izin diberikan, tampilkan snackbar yang mengumumkannya.
ContextCompat.checkSelfPermission(
   this,
   Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED -> {
   layout.showSnackbar(
       view,
       getString(R.string.permission_granted),
       Snackbar.LENGTH_INDEFINITE,
       null
   ) {}
}
  • Jika shouldShowRequestPermissionRationale() menampilkan nilai benar (true), tampilkan UI yang menjelaskan secara lebih terperinci alasan fitur tersebut memerlukan izin tertentu dan juga memberi pengguna cara untuk menerima/menolak izin dari UI.

a25d8c6c1d5051d.png

ActivityCompat.shouldShowRequestPermissionRationale(
   this,
   Manifest.permission.CAMERA
) -> {
   layout.showSnackbar(
       view,
       getString(R.string.permission_required),
       Snackbar.LENGTH_INDEFINITE,
       getString(R.string.ok)
   ) {
       requestPermissionLauncher.launch(
           Manifest.permission.CAMERA
       )
   }
}
  • Selain itu, minta izin.
else -> {
   requestPermissionLauncher.launch(
       Manifest.permission.CAMERA
   )
}

7. Ringkasan

Itu saja. Codelab ini menampilkan cara menambahkan izin runtime dan dapat digunakan untuk izin terkait lokasi, jaringan, media, dan lainnya!

Anda dapat melihat kode akhir dan membaca selengkapnya dalam dokumentasi.