Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Praktik terbaik izin aplikasi

Permintaan izin melindungi informasi sensitif yang tersedia dari perangkat dan hanya boleh digunakan saat akses ke informasi diperlukan agar aplikasi Anda berfungsi. Dokumen ini memberikan tips tentang cara agar Anda dapat menyediakan fungsi yang sama (atau lebih baik) tanpa memerlukan akses ke informasi tersebut. Ini bukan diskusi lengkap tentang cara kerja izin di sistem operasi Android.

Untuk pembahasan umum lainnya tentang izin Android, silakan baca Ringkasan izin. Untuk penjelasan cara menangani izin dalam kode Anda, baca Meminta izin aplikasi.

Prinsip-prinsip menggunakan izin Android

Sebaiknya Anda mengikuti prinsip-prinsip berikut ketika menggunakan izin Android:

#1: Hanya gunakan izin yang diperlukan untuk memfungsikan aplikasi. Bergantung pada cara Anda menggunakan izin, mungkin ada cara lain untuk melakukan tugas yang Anda perlukan (intent sistem, ID, dan memindahkan aplikasi ke latar belakang untuk panggilan ponsel) tanpa mengandalkan akses ke informasi sensitif.

#2: Perhatikan izin yang diperlukan library. Saat menyertakan sebuah library, Anda juga akan mewarisi persyaratan izinnya. Anda harus benar-benar memahami library yang Anda sertakan, izin yang diperlukannya, dan penggunaan izin tersebut.

#3: Ciptakan transparansi. Saat membuat permintaan izin, jelaskan apa yang Anda akses dan mengapa Anda perlu mengaksesnya, sehingga pengguna bisa membuat keputusan yang tepat. Sediakan informasi ini beserta permintaan izin termasuk dialog izin penginstalan, waktu proses, dan update.

#4: Nyatakan akses sistem secara eksplisit. Selalu berikan indikasi saat Anda mengakses kapabilitas sensitif (seperti kamera atau mikrofon) agar pengguna mengetahui kapan Anda mengumpulkan data, dan untuk menghindari persepsi bahwa Anda mengumpulkan data secara diam-diam.

Bagian selanjutnya dari panduan ini menguraikan aturan tersebut dalam konteks mengembangkan aplikasi Android.

Izin dalam Android 6.0+

Android 6.0 Marshmallow memperkenalkan model izin baru yang memungkinkan aplikasi meminta izin dari pengguna saat waktu proses, bukan sebelum penginstalan. Aplikasi yang mendukung model baru ini meminta izin saat aplikasi benar-benar memerlukan layanan atau data yang dilindungi oleh layanan tersebut. Meskipun tidak (selalu) mengubah perilaku aplikasi secara menyeluruh, model ini mengakibatkan beberapa perubahan yang relevan dalam cara menangani data sensitif pengguna:

Konteks situasional meningkat: Pengguna dimintai izin pada saat waktu proses, dalam konteks aplikasi Anda, untuk mengakses fungsionalitas yang dicakup oleh grup izin tersebut. Pengguna akan lebih peka pada konteks permintaan izin, dan jika ada ketidakcocokan antara izin yang Anda minta dengan tujuan aplikasi Anda, akan lebih penting lagi untuk memberikan penjelasan terperinci kepada pengguna mengenai alasan Anda meminta izin tersebut. Jika memungkinkan, sebaiknya berikan penjelasan tentang permintaan ini baik pada saat meminta izin maupun dalam dialog tindak lanjut jika pengguna menolak permintaan tersebut.

Fleksibilitas yang lebih besar dalam memberikan izin: Pengguna dapat menolak akses ke izin tertentu pada saat diminta dan pada setelan, tetapi mereka mungkin masih terkejut saat hal itu menyebabkan fungsionalitas rusak. Sebaiknya pantau seberapa banyak pengguna yang menolak izin (misalnya menggunakan Google Analytics) agar Anda dapat memfaktorkan ulang aplikasi Anda untuk menghindari ketergantungan pada izin tersebut, atau agar Anda dapat memberikan penjelasan yang lebih baik mengapa izin diperlukan untuk membuat aplikasi berfungsi dengan baik. Anda juga perlu memastikan bahwa aplikasi Anda menangani pengecualian yang dibuat saat pengguna menolak permintaan izin atau menonaktifkan izin pada setelan.

Beban transaksional meningkat: Pengguna akan diminta memberikan akses untuk grup izin secara satu per satu, bukan sebagai kumpulan. Dengan alasan tersebut, penting sekali bagi Anda untuk meminimalkan jumlah izin yang diminta karena hal itu akan meningkatkan beban pengguna untuk memberikan izin dan meningkatkan kemungkinan bahwa setidaknya salah satu permintaan akan ditolak.

Izin yang meminta menjadi pengendali default

Beberapa aplikasi bergantung pada akses ke informasi pengguna sensitif yang terkait dengan log panggilan dan pesan SMS. Jika ingin meminta izin khusus untuk log panggilan dan pesan SMS serta memublikasikan aplikasi ke Play Store, Anda harus meminta pengguna menetapkan aplikasi Anda sebagai pengendali default untuk fungsi sistem inti sebelum meminta izin waktu proses ini.

Untuk informasi selengkapnya tentang pengendali default, termasuk panduan menampilkan permintaan pengendali default kepada pengguna, lihat panduan izin yang hanya digunakan dalam pengendali default.

Menghindari meminta izin yang tidak perlu

Setiap kali meminta izin, Anda memaksa pengguna untuk membuat keputusan. Anda harus meminimalkan frekuensi Anda membuat permintaan izin ini. Jika pengguna menggunakan Android 6.0 (API level 23) atau yang lebih baru, setiap kali pengguna mencoba fitur aplikasi baru yang membutuhkan izin, aplikasi harus menginterupsi pekerjaan pengguna dengan permintaan izin. Jika pengguna menggunakan Android versi sebelumnya, pengguna harus memberikan semua izin aplikasi ketika menginstal aplikasi; jika daftarnya terlalu panjang atau tampak tidak sesuai, pengguna mungkin akan memutuskan untuk tidak menginstal aplikasi Anda. Karena alasan ini, sebaiknya Anda meminimalkan jumlah izin yang dibutuhkan aplikasi Anda.

Bagian ini memberikan alternatif untuk kasus penggunaan umum yang akan membantu Anda membatasi jumlah permintaan izin yang dibuat. Karena jumlah dan jenis izin yang dimunculkan kepada pengguna memengaruhi jumlah download saat dibandingkan dengan aplikasi sejenis yang meminta lebih sedikit izin, tindakan terbaiknya adalah menghindari permintaan izin untuk fungsi yang tidak diperlukan.

Gunakan intent sebagai pengganti

Pada banyak kasus, Anda dapat memilih satu di antara dua cara bagaimana aplikasi Anda menjalankan tugas. Aplikasi dapat meminta izin untuk menjalankan sendiri tugasnya, atau dapat menggunakan intent untuk meminta aplikasi lain menjalankan tugas tersebut.

Misalnya, anggaplah aplikasi Anda perlu mengambil foto menggunakan kamera perangkat. Aplikasi Anda dapat meminta izin CAMERA agar dapat mengakses kamera secara langsung. Selanjutnya, aplikasi Anda akan menggunakan API kamera untuk mengontrol kamera dan mengambil foto. Dengan pendekatan ini, aplikasi Anda mengontrol sepenuhnya proses fotografi, dan Anda dapat memasukkan UI kamera ke dalam aplikasi.

Namun, jika Anda tidak perlu sering-sering mengakses data pengguna — dengan kata lain, pengguna tidak akan terlalu terganggu jika dialog waktu proses ditampilkan setiap kali Anda perlu mengakses data — Anda dapat menggunakan permintaan berdasarkan intent. Android menyediakan beberapa intent sistem yang dapat digunakan aplikasi tanpa memerlukan izin karena pengguna dapat memilih apa, jika ada, yang ingin dibagikan kepada aplikasi saat permintaan berbasis intent dibuat.

Misalnya, jenis tindakan intent MediaStore.ACTION_IMAGE_CAPTURE atau MediaStore.ACTION_VIDEO_CAPTURE dapat digunakan untuk mengambil gambar atau video tanpa menggunakan objek Kamera secara langsung (atau memerlukan izin). Dalam hal ini, intent sistem akan meminta izin pengguna atas nama Anda setiap kali foto diambil.

Demikian pula jika perlu menelepon, mengakses kontak pengguna, dan sebagainya, Anda dapat melakukannya dengan membuat intent yang sesuai, atau Anda dapat meminta izin dan mengakses objek yang tepat secara langsung. Masing-masing pendekatan ini memiliki kelebihan dan kekurangan.

Jika Anda menggunakan izin:

  • Aplikasi Anda memiliki kontrol penuh atas pengalaman pengguna saat Anda menjalankan operasi. Namun, kontrol seluas itu meningkatkan kerumitan kode karena Anda perlu mendesain UI yang sesuai.
  • Pengguna akan diminta memberikan izin satu kali, entah saat aplikasi dijalankan atau saat penginstalan (bergantung versi Android pengguna). Setelah itu, aplikasi Anda dapat menjalankan operasi tanpa memerlukan interaksi lebih lanjut dari pengguna. Namun, jika pengguna tidak memberikan izin (atau mencabutnya nanti), maka aplikasi Anda akan kehilangan seluruh kemampuan untuk menjalankan operasi itu.

Jika Anda menggunakan intent:

  • Anda tidak perlu merancang UI untuk operasi tersebut. Aplikasi yang menangani intent akan menyediakan UI.
  • Pengguna dapat menggunakan aplikasi pilihannya untuk tugas tersebut. Misalnya, pengguna dapat memilih aplikasi foto favorit mereka untuk mengambil gambar.
  • Jika pengguna tidak memiliki aplikasi default untuk operasi, sistem akan meminta pengguna untuk memilih aplikasi. Jika pengguna tidak menetapkan pengendali default, pengguna tersebut mungkin harus melalui dialog tambahan setiap kali melakukan operasi.

Jangan membuat bingung pengguna

Jika pengguna menjalankan Android 6.0 (API level 23) atau yang lebih baru, pengguna harus memberikan izin kepada aplikasi saat mereka menjalankan aplikasi. Jika Anda menghadapkan pengguna pada banyak permintaan izin sekaligus, Anda dapat membuat bingung pengguna dan menyebabkan mereka keluar dari aplikasi. Sebagai gantinya, Anda harus meminta izin yang diperlukan.

Dalam beberapa kasus, satu atau beberapa izin mungkin benar-benar penting bagi aplikasi Anda. Apabila demikian, wajar bagi Anda untuk meminta semua izin tersebut segera setelah aplikasi diluncurkan. Misalnya, jika Anda membuat aplikasi fotografi, aplikasi Anda akan memerlukan akses ke kamera perangkat. Saat pengguna meluncurkan aplikasi tersebut untuk pertama kalinya, mereka tidak akan terkejut saat dimintai izin untuk menggunakan kamera. Akan tetapi, jika aplikasi yang sama juga memiliki fitur berbagi foto kepada kontak pengguna, sebaiknya Anda tidak meminta izin READ_CONTACTS pada saat peluncuran pertama. Sebagai gantinya, tunggu sampai pengguna mencoba menggunakan fitur "berbagi" dan mintalah izin pada saat itu.

Jika aplikasi Anda menyediakan tutorial, bisa dipertimbangkan untuk meminta izin yang sangat diperlukan aplikasi pada akhir rangkaian tutorial tersebut.

Jeda media setelah kehilangan fokus audio

Pada kasus ini, aplikasi Anda harus pindah ke latar belakang saat pengguna menerima panggilan telepon dan berfokus kembali hanya setelah panggilan berhenti.

Pendekatan umum dalam kasus ini - misalnya, pemutar media membisukan suara atau berhenti sejenak selama panggilan telepon - adalah untuk mendengarkan perubahan dalam status panggilan menggunakan PhoneStateListener atau mendengarkan siaran android.intent.action.PHONE_STATE. Masalah dari solusi ini adalah aplikasi memerlukan izin READ_PHONE_STATE, yang memaksa pengguna memberikan akses ke berbagai bagian data sensitif seperti ID perangkat dan hardware SIM serta nomor telepon dari panggilan masuk tersebut. Selain itu, peristiwa LISTEN_CELL_LOCATION dan LISTEN_CELL_INFO memerlukan izin lokasi saat aplikasi berjalan di Android 10 (API level 29) atau versi yang lebih baru (khususnya, ACCESS_FINE_LOCATION Jika aplikasi menargetkan Android 10 atau versi yang lebih baru).

Anda dapat mendeteksi apakah pengguna sedang melakukan panggilan telepon tanpa izin READ_PHONE_STATE atau MODIFY_PHONE_STATE dengan meminta AudioFocus untuk aplikasi Anda, yang tidak memerlukan izin eksplisit (karena tidak mengakses informasi sensitif). Cukup masukkan kode yang diperlukan untuk memindahkan audio aplikasi Anda ke latar belakang di pengendali peristiwa onAudioFocusChange() lalu aplikasi akan berjalan secara otomatis setelah OS mengalihkan fokus audionya. Dokumentasi yang lebih lengkap terkait cara melakukan hal ini dapat ditemukan di sini.

Tentukan perangkat tempat instance Anda berjalan

Pada kasus ini, Anda memerlukan ID unik untuk menentukan di perangkat mana instance aplikasi Anda dijalankan.

Aplikasi mungkin memiliki preferensi atau pengiriman pesan khusus perangkat (misalnya menyimpan playlist khusus perangkat untuk pengguna di cloud sehingga mereka dapat mengakses playlist berbeda untuk di mobil dan di rumah). Solusi umumnya adalah memanfaatkan ID perangkat seperti Device IMEI, tetapi cara ini memerlukan grup izin Device ID and call information (PHONE dalam M+). Metode ini juga menggunakan ID yang tidak dapat disetel ulang dan dibagikan ke semua aplikasi.

Ada dua alternatif untuk menggunakan jenis ID ini:

  1. Gunakan InstanceID API com.google.android.gms.iid. getInstance(Context context).getID() akan menampilkan ID perangkat unik untuk instance aplikasi Anda. Hasilnya adalah ID dalam cakupan instance aplikasi yang dapat digunakan sebagai kunci saat menyimpan informasi aplikasi dan disetel ulang jika pengguna menginstal ulang aplikasi tersebut.
  2. Buat ID Anda sendiri yang dicakupkan ke penyimpanan aplikasi Anda menggunakan fungsi sistem dasar seperti randomUUID().

Buat ID unik untuk periklanan atau analisis pengguna

Pada kasus ini, Anda memerlukan ID unik untuk membuat profil bagi pengguna yang tidak login ke aplikasi Anda (misalnya untuk iklan yang menargetkan atau mengukur konversi).

Pembuatan profil untuk periklanan dan analisis pengguna terkadang memerlukan ID yang digunakan bersama-sama dengan aplikasi lain. Solusi yang lazim untuk ini melibatkan pemanfaatan ID perangkat seperti Device IMEI, yang memerlukan grup izin Device ID and call information (PHONEdalam API level 23+) dan tidak dapat disetel ulang oleh pengguna. Di setiap kasus ini, selain menggunakan ID yang tidak dapat disetel ulang dan meminta izin yang mungkin tampak tidak lazim bagi pengguna, Anda juga akan melanggar Kebijakan Program Developer Play.

Sayangnya dalam kasus ini, menggunakan InstanceID API com.google.android.gms.iid atau fungsi sistem untuk membuat ID dalam cakupan aplikasi bukan solusi yang tepat karena ID mungkin perlu dibagikan ke seluruh aplikasi. Solusi alternatifnya adalah menggunakan Advertising Identifier yang tersedia dari class AdvertisingIdClient.Info melalui metode getId(). Anda bisa membuat objek AdvertisingIdClient.Info menggunakan metode getAdvertisingIdInfo(Context) dan memanggil metode getId() untuk menggunakan ID. Perhatikan bahwa metode ini bersifat memblokir, sehingga Anda sebaiknya tidak memanggilnya dari thread utama; penjelasan terperinci tentang metode ini tersedia di sini.

Ketahui library yang Anda gunakan

Terkadang, library yang Anda gunakan dalam aplikasi memerlukan izin. Misalnya, library iklan dan analisis mungkin memerlukan akses ke grup izin LOCATION untuk mengimplementasikan fungsi yang diperlukan. Namun, dari sudut pandang pengguna, permintaan izin ini berasal dari aplikasi Anda, bukan dari library.

Sama seperti pengguna yang memilih aplikasi dengan permintaan izin lebih sedikit untuk fungsionalitas yang sama, developer perlu meninjau library mereka dan memilih SDK pihak ketiga yang tidak menggunakan izin yang tidak perlu. Misalnya, jika Anda menggunakan library yang menyediakan fungsionalitas lokasi, pastikan Anda tidak meminta izin FINE_LOCATION kecuali jika Anda menggunakan fungsionalitas penargetan berbasis lokasi.

Batasi akses latar belakang ke lokasi

Saat aplikasi Anda berjalan di latar belakang, akses ke lokasi harus diwajibkan untuk fungsi inti aplikasi dan menunjukkan manfaat yang jelas bagi pengguna.

Jelaskan alasan Anda memerlukan izin

Dialog izin yang ditampilkan oleh sistem ketika Anda memanggil requestPermissions() menunjukkan jenis izin yang diperlukan aplikasi, tetapi tidak menyebutkan alasannya. Pada beberapa kasus, hal ini mungkin membingungkan pengguna. Sebaiknya jelaskan kepada pengguna alasan aplikasi Anda memerlukan izin sebelum memanggil requestPermissions().

Penelitian menunjukkan bahwa pengguna jauh lebih nyaman dengan permintaan izin jika mereka tahu alasan aplikasi membutuhkannya. Sebuah studi pengguna menunjukkan bahwa:

...kesediaan pengguna untuk memberikan izin bagi aplikasi seluler tertentu sangat dipengaruhi oleh tujuan yang terkait dengan izin tersebut. Misalnya, kesediaan pengguna untuk memberikan akses ke lokasinya akan berbeda-beda bergantung pada apakah permintaan tersebut diperlukan untuk mendukung fungsionalitas inti aplikasi, atau untuk membagikan informasi tersebut kepada jaringan periklanan atau perusahaan analisis.1

Berdasarkan penelitian kelompoknya, Profesor Jason Hong dari CMU menyimpulkan bahwa, secara umum:

...jika mengetahui alasan aplikasi menggunakan informasi sensitif seperti lokasi mereka — misalnya, untuk periklanan tertarget — orang-orang akan merasa lebih nyaman daripada sekadar diberi tahu bahwa aplikasi menggunakan lokasi mereka.1

Akibatnya, jika Anda hanya menggunakan sebagian kecil panggilan API yang termasuk dalam sebuah grup izin, sebaiknya cantumkan secara eksplisit manakah dari izin tersebut yang Anda gunakan, dan apa alasannya. Contoh:

  • Jika Anda hanya menggunakan lokasi sementara, beri tahukan hal ini kepada pengguna dalam deskripsi aplikasi atau artikel bantuan aplikasi Anda.
  • Jika Anda memerlukan akses ke pesan SMS untuk menerima kode autentikasi yang melindungi pengguna dari penipuan, beri tahukan hal ini kepada pengguna dalam deskripsi aplikasi dan/atau saat pertama kali Anda mengakses data.

    Catatan: Jika aplikasi Anda menargetkan Android 8.0 (API level 26) atau yang lebih tinggi, jangan minta izin READ_SMS sebagai bagian dari proses verifikasi kredensial pengguna. Sebagai gantinya, buat token khusus aplikasi menggunakan createAppSpecificSmsToken(), lalu teruskan token ini ke aplikasi atau layanan lain yang dapat mengirimkan pesan SMS verifikasi.

Dalam kondisi tertentu, ada baiknya juga memberi tahu pengguna tentang akses data sensitif secara real-time. Misalnya, jika Anda mengakses kamera atau mikrofon, sebaiknya beri tahu pengguna melalui ikon notifikasi di suatu tempat dalam aplikasi Anda, atau dalam tray notifikasi (jika aplikasi berjalan di latar belakang), sehingga tidak tampak seolah-olah Anda mengumpulkan data secara diam-diam.

Yang terakhir, jika Anda perlu meminta izin agar sesuatu dalam aplikasi Anda berfungsi, tetapi alasannya tidak jelas bagi pengguna, temukan cara agar pengguna mengetahui mengapa Anda memerlukan izin paling sensitif tersebut.

Lakukan pengujian untuk kedua model izin

Mulai Android 6.0 (API level 23), pengguna memberikan dan mencabut izin aplikasi pada waktu proses, bukan saat menginstal aplikasi. Akibatnya, Anda harus menguji aplikasi dalam berbagai macam kondisi. Sebelum Android 6.0, Anda bisa berasumsi bahwa selama aplikasi bisa berjalan, aplikasi itu memiliki semua izin yang dinyatakan dalam manifes aplikasi. Mulai Android 6.0, pengguna dapat mengaktifkan atau menonaktifkan izin untuk aplikasi apa pun, bahkan untuk aplikasi yang menargetkan API level 22 atau versi yang lebih rendah. Anda harus menjalankan pengujian untuk memastikan aplikasi berfungsi dengan benar, baik memiliki izin maupun tidak.

Tips berikut akan membantu Anda mengidentifikasi masalah kode terkait izin pada perangkat yang menjalankan API level 23 atau yang lebih tinggi:

  • Identifikasi izin aplikasi Anda saat ini dan jalur kode yang terkait.
  • Uji alur pengguna pada semua layanan dan data yang dilindungi izin.
  • Uji dengan berbagai kombinasi izin yang diberikan atau dicabut. Misalnya, aplikasi kamera mungkin mencantumkan CAMERA, READ_CONTACTS, dan ACCESS_FINE_LOCATION dalam manifesnya. Anda harus menguji aplikasi dengan setiap izin tersebut diaktifkan dan dinonaktifkan, untuk memastikan aplikasi bisa menangani semua konfigurasi izin dengan baik.
  • Gunakan fitur adb untuk mengelola izin dari command line:
    • Cantumkan daftar izin dan status menurut grupnya:
      $ adb shell pm list permissions -d -g
    • Beri atau cabut satu atau beberapa izin:
      $ adb shell pm [grant|revoke] <permission-name> ...
  • Analisis aplikasi Anda untuk mengidentifikasi layanan yang menggunakan izin.

Referensi lainnya

Referensi

[1] Modeling Users’ Mobile App Privacy Preferences: Restoring Usability in a Sea of Permission Settings, oleh J. Lin B. Liu, N. Sadeh dan J. Hong. Dalam Proceedings of SOUPS 2014.