В настоящее время я пишу приложение для чата для Android. Начиная с 23 SDK и выше, ему нужны некоторые разрешения, которые пользователь должен разрешить, такие как крайне важные (в моем чате будет использоваться место создания конкретного чата) и только небольшие функции, такие как загрузка изображений в хранилище Firebase (для этого нужны доступ к памяти телефона, поэтому для этого требуется соответствующее разрешение).
У меня есть следующий интерфейс для обратных вызовов.
object PermissionUtils {
interface PermissionAskListener {
fun onPermissionGranted()
/*
User has already granted this permission
The app must had been launched earlier and the user must had "allowed" that permission
*/
fun onPermissionRequest()
/*
The app is launched FIRST TIME..
We don't need to show additional dialog, we just request for the permission..
*/
fun onPermissionPreviouslyDenied()
/*
The app was launched earlier and the user simply "denied" the permission..
The user had NOT clicked "DO NOT SHOW AGAIN"
We need to show additional dialog in this case explaining how "allowing this permission" would be useful to the user
*/
fun onPermissionDisabled()
/*
The app had launched earlier and the user "denied" the permission..
AND ALSO had clicked "DO NOT ASK AGAIN"
We need to show Toask/alertdialog/.. to indicate that the user had denied the permission by checking do not disturb too...
So, you might want to take the user to setting>app>permission page where the user can allow the permission..
*/
}
fun checkForPermission(activity: Activity, permission: String, permissionAskListener: PermissionAskListener) {
//code omitted, here's the logic of calls listener members
}
}
И я использую его в таком коде:
//calling from onCreate()
checkForPermission(
this, android.Manifest.permission.READ_EXTERNAL_STORAGE,
object : PermissionAskListener {
override fun onPermissionGranted() {
showToast(getString(R.string.msg_permissions_granted), Toast.LENGTH_LONG)
uplodAnImageToFirebase()
}
override fun onPermissionRequest() {
ActivityCompat.requestPermissions(
this@MainActivity, arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), readStorage
)
}
override fun onPermissionPreviouslyDenied() {
AlertDialog.Builder(this@MainActivity)
.setTitle(getString(R.string.title_permission_required))
.setMessage(getString(R.string.msg_permission_required))
.setCancelable(false)
.setPositiveButton(getString(R.string.action_allow)) { _, _ ->
ActivityCompat.requestPermissions(
this@MainActivity,
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
readStorage
)
}
.setNegativeButton(getString(R.string.action_cancel)) { dialog, _ ->
dialog.cancel()
showToast(getString(R.string.msg_we_cant_give_functionality), Toast.LENGTH_LONG)
}
.show()
}
override fun onPermissionDisabled() {
AlertDialog.Builder(this@MainActivity)
.setTitle(getString(R.string.title_permission_disabled))
.setMessage(getString(R.string.msg_please_enable_permission))
.setCancelable(false)
.setPositiveButton(
getString(R.string.action_go_to_settings)
) { _, _ -> startActivity(Intent(Settings.ACTION_SETTINGS)) }
.setNegativeButton(getString(R.string.action_cancel)) { dialog, _ ->
dialog.cancel()
showToast(getString(R.string.msg_we_cant_give_functionality), Toast.LENGTH_LONG)
}
.show()
}
}
)
Как вы можете видеть из кода, только onPermissionGranted () делает что-то конкретное, а onPermissionPreviouslyDenied () и onPermissionDisabled () просто говорят пользователю скучные и обычные вещи, которые я хочу включить в некоторый класс, который создаст диалоги для дополнительные важные вещи (например, местоположение; если отказано в разрешении, я бы хотел закрыть все приложение), или просто загрузить, что просто заблокирует функциональность.
Я знаю, как делать такие запросы на разрешение и тому подобное. Я не знаю, как создавать эти классы с помощью диалогов - создавать перечисление, которое я передаю всякий раз, когда я вызываю метод onDisabled / onPreviouslyDenied из действия, или создавать для него Builder, или создавать Factory ... если вы используете TL; DR, то просто ответ: «Как уменьшить тот же код в моем случае?»