Saya telah membahas dokumen resmi tentang model Izin baru di Android M. Ini berbicara tentang shouldShowRequestPermissionRationale()
fungsi yang kembali true
jika aplikasi telah meminta izin ini sebelumnya dan pengguna menolak permintaan tersebut. Jika pengguna menolak permintaan izin di masa lalu dan memilih opsi Jangan tanya lagi, metode ini kembali false
.
Tetapi bagaimana kita bisa membedakan antara dua kasus berikut?
Kasus 1 : Aplikasi ini tidak memiliki izin dan pengguna belum pernah meminta izin sebelumnya. Dalam hal ini, shouldShowRequestPermissionRationale () akan mengembalikan false karena ini adalah pertama kalinya kami bertanya kepada pengguna.
Kasus 2 : Pengguna telah menolak izin dan memilih "Jangan tanya lagi", dalam hal ini juga seharusnyaShowRequestPermissionRationale () akan mengembalikan false.
Saya ingin mengirim pengguna ke halaman pengaturan App dalam Kasus 2. Bagaimana cara membedakan dua kasus ini?
sumber
shouldShowRequestPermissionRationale()
pengembalian salah dalam kasus ini, yang akan melukai kode yang mengandalkan bendera "pernah saya tanyakan sebelumnya".permissions
Android. github.com/android/permissions-samplesJawaban:
Setelah M Pratinjau 1, jika dialog ditampilkan untuk pertama kalinya , tidak ada kotak centang Jangan pernah tanya lagi .
Jika pengguna menolak permintaan izin, akan ada kotak centang Jangan tanya lagi di dialog izin saat izin kedua kali diminta.
Jadi logikanya harus seperti ini:
Minta izin:
Periksa apakah izin ditolak atau diberikan pada
onRequestPermissionsResult
.Jika izin ditolak sebelumnya, kali ini akan ada kotak centang Jangan tanya lagi di dialog izin.
Panggil
shouldShowRequestPermissionRationale
untuk melihat apakah pengguna memeriksa Jangan pernah bertanya lagi .shouldShowRequestPermissionRationale
metode mengembalikan false hanya jika pengguna memilih Never ask again atau kebijakan perangkat melarang aplikasi memiliki izin itu:Jadi, Anda tidak perlu melacak jika pengguna memeriksa Jangan pernah bertanya lagi atau tidak.
sumber
context
diActivityCompat.shouldShowRequestPermissionRationale(...)
parameter sebenarnya tipeActivity
. Mungkin tidak mempengaruhi Anda semua tetapi dalam kasus saya itu mempengaruhi Anda.should
callback DAN menyimpan nilai counter-nya di NVM hanya untuk mengetahui apakah saya perlu meminta permintaan lagi saat aplikasi dibuka! ... wow (facepalm) ... apakah terlalu sulit untuk membuat hanya satu panggilan mengembalikan status enumerasi ??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 hanyalah menggunakan metode checkPermission dengan argumen yang tepat.
Berikut ini sebuah contoh,
Anda akan mendapatkan panggilan balik pada onPermissionAsk untuk kasus 1, dan onPermissionDisabled untuk case 2.
Selamat coding :)
sumber
public void onPermissionAsk() { ActivityCompat.requestPermissions( thisActivity, ...
.thisActivity
tidak lain adalahYourActivity.this
.context
yang kamu gunakan?shouldShowRequestPermissionRationale(permission)
tidak ada diandroid.content.Context
. itu ada di ActivityCompatMEMPERBARUI
Saya percaya bahwa jawaban CanC bawah ini adalah yang benar yang harus diikuti. Satu-satunya cara untuk mengetahui dengan pasti adalah memverifikasi ini di callback onRequestPermissionResult menggunakan shouldShowPermissionRationale.
==
Jawaban asli saya:
Satu-satunya cara yang saya temukan adalah melacak sendiri apakah ini pertama kali atau tidak (misalnya menggunakan preferensi bersama). Jika ini bukan pertama kalinya, gunakan
shouldShowRequestPermissionRationale()
untuk membedakan.Lihat juga: Android M - periksa izin runtime - cara menentukan apakah pengguna menandai "Never ask again"?
sumber
Cara saya memahaminya, shouldShowRequestPermissionRationale () menjalankan sejumlah kasus penggunaan di bawah tenda, dan memberi tahu aplikasi apakah akan menampilkan penjelasan tentang izin yang diminta atau tidak.
Gagasan di balik izin Run Time adalah bahwa sebagian besar waktu, pengguna akan mengatakan Ya untuk permintaan izin. Dengan begitu pengguna harus melakukan hanya satu klik. Tentu saja permintaan harus digunakan dalam konteks yang benar - yaitu meminta izin Kamera ketika tombol "Kamera" ditekan.
Jika pengguna menolak permintaan, tetapi setelah beberapa waktu muncul dan menekan tombol "Kamera" lagi, seharusnyaShowRequestPermissionRationale () akan kembali benar, sehingga aplikasi dapat menunjukkan beberapa penjelasan yang bermakna mengapa izin diminta, dan mengapa aplikasi tidak akan bekerja dengan baik tanpa itu. Biasanya Anda akan menunjukkan di jendela dialog tombol untuk menolak lagi / memutuskan nanti, dan tombol untuk memberikan izin. Tombol izin izin dalam dialog rasional, harus memulai permintaan izin lagi. Kali ini pengguna juga akan memiliki kotak centang "Jangan tampilkan lagi". Jika dia memutuskan untuk memilihnya, dan menolak izin lagi, itu akan memberi tahu sistem Android bahwa pengguna dan aplikasi tidak berada di halaman yang sama. Tindakan itu akan memiliki dua konsekuensi - shouldShowRequestPermissionRationale () akan selalu mengembalikan false,
Tetapi ada juga skenario lain yang mungkin di mana onRequestPermissionsResult dapat digunakan. Misalnya beberapa perangkat mungkin memiliki kebijakan perangkat yang menonaktifkan kamera (berfungsi untuk CIA, DARPA, dll.). Di perangkat ini, onRequestPermissionsResult akan selalu mengembalikan false, dan metode requestPermissions () akan secara diam-diam menolak permintaan tersebut.
Itulah yang saya kumpulkan dengan mendengarkan podcast dengan Ben Poiesz - seorang manajer produk pada kerangka Android.
http://androidbackstage.blogspot.jp/2015/08/episode-33-permission-mission.html
sumber
Cukup poskan opsi lain, jika ada yang mau. Anda dapat menggunakan EasyPermissions yang disediakan oleh Google sendiri, untuk, sebagaimana dikatakan, "Sederhanakan izin sistem Android M".
Maka Anda tidak harus menangani
shouldShowRequestPermissionRationale
secara langsung.sumber
permissionPermanentlyDenied
internal hanya meneleponshouldShowPermissionsRationale
dan kembalitrue
jika pengguna tidak pernah diminta untuk memberikan izin.Jika ada yang tertarik dengan solusi Kotlin, saya refactored jawaban @mururaj berada di Kotlin. Juga sedikit dimodernisasi untuk memiliki blok penyelesaian bukan pendengar.
PermissionUtil
PermissionHandler
Penerapan
sumber
Periksa implementasi ini. bekerja cukup baik untuk saya. pada dasarnya Anda memeriksa izin dalam metode checkPermissions () melewati daftar izin. Anda memeriksa hasil permintaan izin pada onRequestPermissionsResult (). Implementasinya memungkinkan Anda mengatasi kedua kasus tersebut ketika pengguna memilih "tidak pernah bertanya lagi" atau tidak. Dalam implementasi ini, jika se memilih "tidak pernah bertanya lagi", dialog memiliki opsi untuk membawanya ke Aktivitas Pengaturan Aplikasi.
Semua kode ini ada di dalam fragmen saya. Saya berpikir bahwa akan lebih baik untuk membuat kelas khusus untuk melakukan ini, seperti PermissionManager, tetapi saya tidak yakin tentang itu.
sumber
Semoga bermanfaat bagi seseorang: -
Apa yang saya perhatikan adalah, jika kita memeriksa flag shouldShowRequestPermissionRationale () untuk metode callback onRequestPermissionsResult (), itu 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 untuk contoh kerja rinci .
sumber
Kita bisa melakukannya dengan cara ini?
sumber
shouldShowRequestPermissionRationale
untuk izin KHUSUS selalu mengembalikan BENAR SAJA setelah pengguna menolaknya tanpa kotak centangKami tertarik pada nilai SALAH
Jadi ada 3 kasus hilang dengan nilai palsu :
1. tidak ada tindakan seperti itu sebelumnya dan sekarang pengguna memutuskan untuk menyetujui atau menolak.
Cukup tentukan preferensi
ASKED_PERMISSION_*
yang tidak ada sekarang dan akan berlaku padaonRequestPermissionsResult
saat itu dimulai dalam hal setuju atau menolakJadi, sementara preferensi ini tidak ada, tidak ada alasan untuk memeriksa
shouldShowRequestPermissionRationale
2. pengguna mengklik setuju.
Cukup lakukan:
Yang akan mengembalikan true dan tidak ada alasan untuk memeriksa
shouldShowRequestPermissionRationale
3. pengguna mengklik tolak dengan kotak centang (diminta kedua kali atau lebih)
Ini WAKTU bekerja dengan
shouldShowRequestPermissionRationale
yang akan kembali SALAH(preferensi ada dan kami tidak memiliki izin)
sumber
Kode ini meminta pengguna untuk meminta izin selama runtime, jika pengguna mengizinkan, itu menjalankan metode hasil, jika pengguna menolak, ia bertanya lagi dengan discription dengan pengguna deny (itu bertanya lagi dengan instruksi), tetapi jika pengguna memilih tidak pernah bertanya lagi. itu menangani tidak pernah bertanya lagi, menampilkan opsi pengaturan terbuka dengan instruksi.
sumber