Menurut ini: http://developer.android.com/preview/features/runtime-permissions.html#coding suatu aplikasi dapat memeriksa izin runtime dan meminta izin jika belum diberikan. Dialog berikut akan ditampilkan kemudian:
Jika pengguna menolak izin penting, maka aplikasi harus menampilkan penjelasan mengapa izin diperlukan dan dampak penurunan apa yang dimiliki. Dialog itu memiliki dua opsi:
- coba lagi (izin diminta lagi)
- tolak (aplikasi akan berfungsi tanpa izin itu).
Namun jika pengguna memeriksa Never ask again
, dialog kedua dengan penjelasan tidak akan ditampilkan, terutama jika pengguna sudah menolak sekali sebelumnya. Sekarang pertanyaannya adalah: bagaimana aplikasi saya tahu apakah pengguna telah memeriksa Never ask again
? IMO onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
tidak memberi saya informasi itu.
Pertanyaan kedua adalah: apakah Google memiliki rencana untuk memasukkan pesan khusus dalam dialog izin yang akan menjelaskan mengapa aplikasi membutuhkan izin? Dengan begitu tidak akan pernah ada dialog kedua yang pasti akan membuat ux menjadi lebih baik.
sumber
Jawaban:
Pratinjau Pengembang 2 membawa beberapa perubahan pada bagaimana izin diminta oleh aplikasi (lihat juga http://developer.android.com/preview/support.html#preview2-notes ).
Dialog pertama sekarang terlihat seperti ini:
Tidak ada kotak centang "Jangan tampilkan lagi" (tidak seperti pratinjau pengembang 1). Jika pengguna menolak izin dan jika izin itu penting untuk aplikasi, ia dapat menyajikan dialog lain untuk menjelaskan alasan aplikasi meminta izin itu, misalnya seperti ini:
Jika pengguna menolak lagi aplikasi harus dimatikan jika benar-benar membutuhkan izin itu atau tetap berjalan dengan fungsionalitas terbatas. Jika pengguna mempertimbangkan kembali (dan memilih untuk mencoba ulang), izin diminta lagi. Kali ini promptnya terlihat seperti ini:
Kotak centang "Never ask again" yang kedua kali ditampilkan. Jika pengguna menolak lagi dan mencentang kotak tidak akan terjadi lagi. Apakah kotak centang dicentang atau tidak dapat ditentukan dengan menggunakan Activity.shouldShowRequestPermissionRationale (String), misalnya seperti ini:
Itulah yang dikatakan dokumentasi Android ( https://developer.android.com/training/permissions/requesting.html ):
Untuk mengetahui apakah pengguna menolak dengan "tidak pernah bertanya lagi" Anda dapat memeriksa lagi metode shouldShowRequestPermissionRationale di onRequestPermissionsResult Anda saat pengguna tidak memberikan izin.
Anda dapat membuka pengaturan aplikasi Anda dengan kode ini:
Tidak ada cara mengirim pengguna langsung ke halaman Otorisasi.
sumber
Anda dapat memeriksa
shouldShowRequestPermissionRationale()
dionRequestPermissionsResult()
.https://youtu.be/C8lUdPVSzDk?t=2m23s
Periksa apakah izin diberikan atau tidak pada
onRequestPermissionsResult()
. Jika tidak maka periksashouldShowRequestPermissionRationale()
.true
maka perlihatkan penjelasan mengapa izin khusus ini diperlukan. Kemudian tergantung pada pilihan pengguna lagirequestPermissions()
.false
maka tampilkan pesan kesalahan bahwa izin tidak diberikan dan aplikasi tidak dapat melanjutkan lebih jauh atau fitur tertentu dinonaktifkan.Di bawah ini adalah contoh kode.
Rupanya, google maps melakukan hal ini untuk izin lokasi.
sumber
Berikut adalah metode yang bagus dan mudah untuk memeriksa status izin saat ini:
Peringatan: mengembalikan BLOCKED_OR_NEVER_ASKED awal aplikasi pertama, sebelum pengguna menerima / menolak izin melalui prompt pengguna (pada sdk 23+ perangkat)
Memperbarui:
Pustaka dukungan Android sekarang juga tampaknya memiliki kelas
android.support.v4.content.PermissionChecker
yang sangat mirip yang berisicheckSelfPermission()
yang kembali:sumber
BLOCKED_OR_NEVER_ASKED
jika izin belum diminta.android.content.pm
sudah mendefinisikanPERMISSION_GRANTED = 0
danPERMISSION_DENIED = -1
. Mungkin diaturBLOCKED_OR_NEVER_ASKED = PERMISSION_DENIED - 1
atau sesuatu?Setelah pengguna menandai "Jangan tanya lagi," pertanyaan tidak dapat ditampilkan lagi. Tetapi dapat dijelaskan kepada pengguna bahwa ia sebelumnya telah menolak izin dan harus memberikan izin dalam pengaturan. Dan rujuk dia ke pengaturan, dengan kode berikut:
sumber
Semoga bermanfaat bagi seseorang: -
Apa yang saya perhatikan adalah, jika kita memeriksa flag shouldShowRequestPermissionRationale () ke onRequestPermissionsResult () metode panggilan balik, ini hanya menunjukkan dua negara .
Status 1: -Kembalikan benar: - Kapan saja pengguna mengklik Tolak izin (termasuk saat pertama kali).
Status 2: -Returns false: - jika pengguna memilih "tidak pernah bertanya lagi".
Tautan contoh kerja rinci
sumber
onRequestPermissionsResult
, bukan ketika benar-benar meminta izin.Anda dapat menentukannya dengan memeriksa apakah izin pemikiran akan ditampilkan di dalam
onRequestPermissionsResult()
metode panggilan balik. Dan jika Anda menemukan izin yang ditetapkan untuk tidak pernah bertanya lagi , Anda dapat meminta pengguna untuk memberikan izin dari pengaturan.Implementasi penuh saya akan seperti di bawah ini. Ini berfungsi baik untuk permintaan izin tunggal atau ganda . Gunakan yang berikut atau langsung gunakan perpustakaan saya.
sumber
Jika Anda ingin mendeteksi semua "status" (pertama kali ditolak, baru saja ditolak, baru saja ditolak dengan "Never Ask Again" atau ditolak secara permanen) Anda dapat melakukan hal berikut:
Buat 2 booleans
Tetapkan yang pertama sebelum meminta izin:
Tetapkan yang kedua di dalam metode onRequestPermissionsResult Anda:
Gunakan "tabel" berikut untuk melakukan apa pun yang Anda butuhkan di onRequestPermissionsResult () (setelah memeriksa bahwa Anda masih tidak memiliki izin):
sumber
// TRUE FALSE
juga terjadi ketika pengguna mengizinkan izin setelah sebelumnya menolaknya.Saya memiliki masalah yang sama dan saya mengatasinya. Untuk membuat hidup lebih sederhana, saya menulis kelas util untuk menangani izin runtime.
Dan metode PreferenceUtil adalah sebagai berikut.
Sekarang, yang Anda butuhkan adalah menggunakan metode * checkPermission * dengan argumen yang tepat.
Berikut ini sebuah contoh,
Jika pengguna memeriksa Jangan pernah bertanya lagi , Anda akan mendapatkan panggilan balik di onPermissionDisabled .
Selamat coding :)
sumber
shouldShowRequestPermissionRationale
, menyimpan preferensi permintaan yang dikirim ke pengguna. Saya punya ide yang sama dan menemukan jawaban Anda. Nice job manPenjelasan lengkap untuk setiap kasus izin
sumber
Fungsi yang berguna untuk menentukan apakah izin sewenang-wenang telah diblokir untuk meminta (di Kotlin):
Penggunaan ini membutuhkan pengaturan boolean preferensi bersama dengan nama izin yang Anda inginkan (misalnya
android.Manifest.permission.READ_PHONE_STATE
)true
ketika Anda pertama kali meminta izin.Penjelasan:
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
karena beberapa kode hanya dapat dijalankan pada API level 23+.ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED
untuk memeriksa kami belum memiliki izin.!activity.shouldShowRequestPermissionRationale(permission)
untuk memeriksa apakah pengguna telah menolak permintaan aplikasi lagi. Karena kebiasaan fungsi ini , baris berikut juga diperlukan.PreferenceManager.getDefaultSharedPreferences(activity).getBoolean(permission, false)
ini digunakan (bersama dengan menyetel nilai ke true pada permintaan izin pertama) untuk membedakan antara status "Never ask" dan "Never ask again", karena baris sebelumnya tidak mengembalikan informasi ini.sumber
Metode shouldShowRequestPermissionRationale () dapat digunakan untuk memeriksa apakah pengguna memilih opsi 'tidak pernah ditanya lagi' dan menolak izin. Ada banyak contoh kode, jadi saya lebih suka menjelaskan cara menggunakannya untuk tujuan seperti itu, karena saya pikir nama dan implementasinya membuat ini lebih rumit dari yang sebenarnya.
Seperti dijelaskan dalam Meminta Izin saat Jalankan , metode itu mengembalikan true jika opsi 'tidak pernah bertanya lagi' terlihat, salah jika tidak; sehingga mengembalikan false saat pertama kali dialog ditampilkan, kemudian dari yang kedua kembali benar, dan hanya jika pengguna menolak izin memilih opsi, pada saat itu kembali palsu.
Untuk mendeteksi kasus seperti itu, Anda dapat mendeteksi urutan false-true-false, atau (lebih sederhana) Anda dapat memiliki bendera yang melacak waktu awal dialog ditampilkan. Setelah itu, metode itu mengembalikan benar atau salah, di mana yang palsu akan memungkinkan Anda untuk mendeteksi ketika opsi tersebut dipilih.
sumber
Tolong jangan melempari saya dengan batu untuk solusi ini.
Ini berfungsi tetapi sedikit "retas".
Saat Anda menelepon
requestPermissions
, daftarkan waktu saat ini.Lalu masuk
onRequestPermissionsResult
jika hasilnya tidak diberikan, periksa waktu lagi.
Karena pengguna tidak mungkin mengklik begitu cepat pada tombol tolak, kami tahu bahwa ia memilih "tidak pernah bertanya lagi" karena panggilan baliknya instan.
Gunakan dengan risiko Anda sendiri.
sumber
Saya menulis singkatan untuk permintaan izin di Android M. Kode ini juga menangani kompatibilitas ke belakang ke versi Android yang lebih lama.
Semua kode jelek diekstraksi menjadi Fragmen yang melampirkan dan melepaskan dirinya sendiri ke Aktivitas yang meminta izin. Anda dapat menggunakan
PermissionRequestManager
sebagai berikut:Lihatlah: https://gist.github.com/crysxd/385b57d74045a8bd67c4110c34ab74aa
sumber
sumber
Coba pustaka izin sederhana ini. Ini akan menangani semua operasi yang terkait dengan izin dalam 3 langkah mudah. Ini menghemat waktu saya. Anda dapat menyelesaikan semua pekerjaan terkait izin dalam 15 menit .
Dapat menangani Deny, Dapat menangani Tidak pernah bertanya lagi, Dapat memanggil pengaturan aplikasi untuk izin, Dapat memberikan pesan Rasional, Dapat memberikan pesan Penolakan, Dapat memberikan daftar izin yang diterima, Dapat memberikan daftar ditolak izin dan lain-lain
https://github.com/ParkSangGwon/TedPermission
Langkah 1: tambahkan ketergantungan Anda
Langkah2: Minta izin
Langkah 3: Menangani respons izin
sumber
Anda bisa mendengarkan dengan cantik.
Pendengar
MainClass untuk izin
Digunakan dengan cara ini
menimpa padaRequestPermissionsHasil kembali aktivitas atau fragmnet
sumber
Alih-alih, Anda akan menerima panggilan balik pada
onRequestPermissionsResult()
PERMISSION_DENIED saat Anda meminta izin lagi saat jatuh dalam kondisi salahshouldShowRequestPermissionRationale()
Dari Android doc:
Ketika sistem meminta pengguna untuk memberikan izin, pengguna memiliki opsi untuk memberitahu sistem untuk tidak meminta izin itu lagi. Dalam hal itu, kapan saja aplikasi menggunakan
requestPermissions()
untuk meminta izin itu lagi, sistem segera menolak permintaan itu. Sistem memanggilonRequestPermissionsResult()
metode panggilan balik Anda dan lolosPERMISSION_DENIED
, sama seperti jika pengguna menolak permintaan Anda secara eksplisit lagi. Ini berarti bahwa ketika Anda meneleponrequestPermissions()
, Anda tidak dapat mengasumsikan bahwa interaksi langsung dengan pengguna telah terjadi.sumber
Kamu bisa memakai
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)
metode untuk mendeteksi apakah tidak pernah meminta dicentang atau tidak.Untuk referensi lebih lanjut: Periksa ini
Untuk memeriksa beberapa izin gunakan:
jelaskan metode ()
Kode di atas juga akan menampilkan dialog, yang akan mengarahkan pengguna ke layar pengaturan aplikasi dari mana ia dapat memberikan izin jika telah diperiksa tombol jangan pernah bertanya lagi.
sumber
Kamu bisa memakai
dalam
Lihat contoh di bawah ini:
Periksa apakah ada izin ketika pengguna mengklik tombol:
Ketika pengguna menjawab kotak dialog izin kita akan pergi ke onRequestPermissionResult:
sumber
Saya juga ingin mendapatkan informasi apakah pengguna telah memilih "tidak pernah bertanya lagi". Saya telah mencapai 'hampir solusi' dengan bendera yang terlihat jelek, tetapi sebelum saya memberitahu Anda caranya, saya akan memberi tahu Anda tentang motivasi saya:
Saya ingin menawarkan fungsionalitas yang merujuk izin pada awalnya. Jika pengguna menggunakannya dan tidak memiliki hak, ia mendapatkan dialog ke-1 dari atas atau ke-2 dan ke-3. Ketika pengguna memilih 'Never ask again', saya ingin menonaktifkan fungsi dan menampilkannya secara berbeda. - Tindakan saya dipicu oleh entri teks pemintal, saya juga ingin menambahkan '(Izin dicabut)' ke teks label yang ditampilkan. Ini menunjukkan kepada pengguna: 'Ada fungsionalitas tetapi saya tidak dapat menggunakannya, karena pengaturan izin saya.' Namun, ini sepertinya tidak mungkin, karena saya tidak dapat memeriksa apakah 'Never ask again' telah dipilih atau tidak.
Saya datang ke solusi yang bisa saya jalani dengan memiliki fungsi saya selalu diaktifkan dengan pemeriksaan izin aktif. Saya menunjukkan pesan Toast di onRequestPermissionsResult () jika ada respons negatif tetapi hanya jika saya belum menampilkan munculan rasional kustom saya. Jadi, jika pengguna telah memilih 'Jangan tanya lagi', ia hanya menerima pesan roti panggang. Jika pengguna enggan untuk memilih 'tidak pernah bertanya lagi' ia hanya mendapatkan alasan khusus dan permintaan izin muncul dengan sistem operasi tetapi tidak bersulang, karena tiga pemberitahuan berturut-turut akan terlalu menyakitkan.
sumber
Saya harus menerapkan izin dinamis untuk kamera. Di mana 3 kemungkinan kasus terjadi: 1. Izinkan, 2. Ditolak, 3. Jangan tanya lagi.
sumber
Memperluas jawaban mVck di atas, logika berikut menentukan apakah "Never ask again" telah diperiksa untuk Permission Permission yang diberikan:
yang dikutip dari bawah (untuk contoh lengkap lihat jawaban ini )
sumber
Anda dapat membaca dokumen resmi Izin Aplikasi Android
atau Anda dapat menemukan banyak perpustakaan izin android populer di Github
sumber
Untuk menjawab pertanyaan dengan tepat, Apa yang terjadi ketika pengguna menekan "Never Ask Again"?
Metode / fungsi yang ditimpa
Array grantResult keluar menjadi Kosong, sehingga Anda dapat melakukan sesuatu di sana mungkin? Tapi bukan praktik terbaik.
Bagaimana Cara Menangani "Never Ask Again"?
Saya bekerja dengan Fragment, yang membutuhkan izin READ_EXTERNAL_STORAGE.
Fungsi lainnya sepele.
sumber