Save the date! Android Dev Summit is coming to Sunnyvale, CA on Oct 23-24, 2019.

Praktik terbaik izin aplikasi

Permintaan izin melindungi informasi rahasia yang tersedia pada perangkat dan sebaiknya hanya digunakan ketika membutuhkan akses ke informasi untuk menjalankan aplikasi Anda. Dokumen ini memberikan tips tentang cara mendapatkan fungsionalitas yang sama (atau lebih baik) tanpa memerlukan akses ke informasi semacam itu; dokumen ini bukan pembahasan menyeluruh tentang cara kerja izin pada sistem operasi Android.

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

Prinsip-prinsip menggunakan izin Android

Kami sarankan agar Anda mengikuti prinsip-prinsip berikut ketika menggunakan izin Android:

# 1: Hanya gunakan izin yang diperlukan agar aplikasi berfungsi. Bergantung pada cara Anda menggunakan izin, mungkin ada cara lain untuk melakukan tugas yang Anda perlukan (intent sistem, ID, dan pemindahan 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: Jadikan akses sistem 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 dijalankan, 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 dengan cara menangani data sensitif pengguna:

Konteks situasional meningkat: Pengguna dimintai izin pada saat aplikasi dijalankan, 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, maka 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 transaksi 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.

Hindari 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 menjalankan Android 6.0 (API level 23) atau lebih baru, setiap kali pengguna mencoba beberapa fitur aplikasi baru yang memerlukan izin, aplikasi tersebut mengganggu pekerjaan pengguna dengan permintaan izin. Jika pengguna menjalankan versi Android yang lebih lama, pengguna harus memberikan setiap izin aplikasi saat menginstal aplikasi; jika daftar terlalu panjang atau sepertinya tidak sesuai, pengguna dapat memutuskan untuk tidak menginstal aplikasi Anda sama sekali. Karena alasan ini, Anda harus 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 pengguna memengaruhi jumlah download saat dibandingkan dengan aplikasi sejenis yang meminta lebih sedikit izin, tindakan terbaik adalah menghindari permintaan izin untuk fungsi yang tidak diperlukan.

Menggunakan intent sebagai pengganti

Pada banyak kasus, Anda bisa memilih satu di antara dua cara bagaimana aplikasi 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 ketika 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 secara langsung menggunakan objek Camera (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 tepat, 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 tersebut, sistem akan meminta pengguna untuk memilih sebuah aplikasi. Jika tidak menetapkan pengendali default, pengguna harus melalui kotak dialog tambahan setiap kali menjalankan operasi tersebut.

Jangan membuat bingung pengguna

Jika pengguna menjalankan Android 6.0 (API level 23) atau yang lebih baru, pengguna harus memberikan izin kepada aplikasi Anda selagi mereka menjalankan aplikasi tersebut. Jika Anda menghadapkan pengguna pada banyak permintaan izin sekaligus, Anda akan membuat pengguna bingung dan mereka akan menutup aplikasi Anda. Karena itu, sebaiknya hanya minta izin saat Anda memerlukannya.

Pada beberapa kasus, satu atau beberapa izin akses mungkin sangat vital bagi aplikasi Anda. Mungkin terlihat masuk akal untuk meminta semua izin itu segera setelah aplikasi diluncurkan. Misalnya, jika Anda membuat aplikasi fotografi, aplikasi tersebut akan memerlukan akses ke kamera perangkat. Ketika pengguna meluncurkan aplikasi untuk pertama kalinya, mereka tidak akan terkejut saat dimintai izin untuk menggunakan kamera. 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.

Menjeda 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 umumnya pada kasus ini - misalnya, media player mematikan atau menjeda suara selama panggilan telepon - adalah mendeteksi ada tidaknya perubahan status panggilan menggunakan PhoneStateListener atau mendeteksi ada tidaknya siaran android.intent.action.PHONE_STATE. Masalahnya dengan 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.

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() dan aplikasi akan otomatis berjalan setelah OS mengalihkan fokus audionya. Dokumentasi yang lebih lengkap terkait cara melakukan hal ini dapat ditemukan di sini.

Menentukan perangkat tempat instance Anda berjalan

Pada kasus ini, Anda memerlukan ID unik untuk menentukan perangkat mana yang menjalankan instance aplikasi Anda.

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 com.google.android.gms.iid InstanceID API. 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().

Membuat 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 analitik pengguna terkadang memerlukan ID yang digunakan bersama-sama dengan aplikasi lain. Solusi yang umum untuk hal ini adalah memanfaatkan ID perangkat seperti Device IMEI, yang memerlukan grup izin Device ID and call information (PHONE pada API level 23+) dan tidak dapat disetel ulang oleh pengguna. Pada 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, pada kasus ini, penggunaan com.google.android.gms.iid InstanceID API atau fungsi sistem untuk membuat ID dengan cakupan aplikasi bukan merupakan solusi tepat karena ID tersebut mungkin perlu dibagikan ke banyak aplikasi. Solusi alternatifnya adalah menggunakan Advertising Identifier yang tersedia dari class AdvertisingIdClient..Info melalui metode getId(). Anda dapat membuat objek AdvertisingIdClient.Info menggunakan metode getAdvertisingIdInfo(Context) dan memanggil metode getId() untuk menggunakan ID tersebut. Perhatikan bahwa metode ini bersifat memblokir, jadi sebaiknya Anda tidak memanggilnya dari thread utama. Penjelasan lengkap tentang metode ini tersedia di sini.

Mengetahui library yang Anda gunakan

Terkadang, library yang Anda gunakan dalam aplikasi memerlukan izin. Misalnya, library iklan dan analitik mungkin memerlukan akses ke grup izin Location atau Identity untuk mengimplementasikan fungsionalitas 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, cobalah menghindari library yang memerlukan grup izin Identity kecuali jika ada alasan yang jelas dari sisi pengguna mengapa aplikasi membutuhkan izin tersebut. Secara khusus, untuk library yang menyediakan fungsionalitas lokasi, pastikan Anda tidak diharuskan untuk meminta izin FINE_LOCATION kecuali jika Anda menggunakan fungsionalitas penargetan berbasis lokasi.

Menjelaskan alasan Anda memerlukan izin

Dialog izin yang ditampilkan oleh sistem ketika Anda memanggil requestPermissions() menunjukkan jenis izin yang diperlukan aplikasi Anda, 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 analitik.1

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

...ketika mengetahui mengapa 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 seperti Anda mengumpulkan data secara diam-diam.

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

Pengujian untuk kedua model izin

Mulai Android 6.0 (API level 23), pengguna memberikan dan mencabut izin aplikasi pada saat dijalankan, bukan pada saat diinstal. Akibatnya, Anda harus menguji aplikasi dalam berbagai kondisi. Sebelum Android 6.0, Anda dapat mengasumsikan bahwa jika aplikasi Anda berjalan, ia memiliki semua izin yang dinyatakan dalam manifes aplikasi. Mulai Android 6.0, pengguna dapat mengaktifkan atau menonaktifkan izin untuk aplikasi apa saja, bahkan aplikasi yang menargetkan API level 22 atau 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 lebih tinggi:

  • Identifikasi izin aplikasi Anda saat ini dan lokasi 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 ini dengan setiap izin tersebut dalam kondisi aktif dan nonaktif, untuk memastikan aplikasi dapat 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.