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
- Versi terbaru Android Studio.
Yang harus sudah Anda ketahui
- Kotlin, seperti yang diajarkan di Kotlin Bootcamp
- Keterampilan pengembangan Android dasar, seperti yang diajarkan dalam Mengembangkan Aplikasi Android dengan Kotlin
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
- Mulai project Android Studio baru.
- Pilih Empty Activity.
- Beri nama project Permissions Codelab dan setel bahasa ke Kotlin.
3. Menyiapkan kode
- Tambahkan versi terbaru dependensi berikut ke dalam file
build.gradle
level aplikasi. Hal ini memungkinkan Anda menggunakan libraryActivity
yang akan dibahas nanti dalam codelab.
implementation "androidx.activity:activity-ktx:1.2.2"
implementation "androidx.fragment:fragment-ktx:1.3.2"
- Setel opsi build
viewBinding
ke benar (true) di blok Android untuk mengaktifkan ViewBinding.
android {
...
buildFeatures {
viewBinding true
}
}
- Lalu tekan tombol palu hijau untuk membangun. Tindakan ini akan menghasilkan class binding yang disebut
ActivityMainBinding
yang akan Anda gunakan nanti untukViewBinding
.
- 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>
- 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>
- Pada
MainActivity.kt
, di atas metodeonCreate()
, tentukan variabel untuk tata letak danViewBinding
.
private lateinit var layout: View
private lateinit var binding: ActivityMainBinding
- Ganti kode dalam metode
onCreate()
dengan kode di bawah ini. Kode ini melakukan inisialisasi binding, membuatval
untuk mewakili tampilan dan menyetelnya ke root binding, serta menyetel tata letak kemainLayout
binding.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
layout = binding.mainLayout
setContentView(view)
}
- 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.
- 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")
}
}
- Tetapkan
requestPermissionLauncher
sama denganregisterForActivityResult
dan teruskanActivityResultContracts.RequestPermission()
.
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
- 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.
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.