🎯 Główna Idea
Moduł Permissions upraszcza obsługę uprawnień Android. Zamiast ręcznie zarządzać ActivityResultContracts, wystarczy proste wywołanie z callbackiem.
📝 Podstawowe użycie
// Poproś o pojedyncze uprawnienie
ADict.Permissions.request(activity, Permission.CAMERA) { granted ->
if (granted) {
openCamera()
} else {
showDeniedMessage()
}
}
// Sprawdź bez pytania
if (ADict.Permissions.isGranted(context, Permission.LOCATION)) {
getCurrentLocation()
}
📋 Wiele uprawnień naraz
// Poproś o kilka uprawnień
ADict.Permissions.requestMultiple(
activity,
listOf(Permission.CAMERA, Permission.RECORD_AUDIO, Permission.LOCATION)
) { results ->
// results: Map<String, Boolean>
if (results.all { it.value }) {
// Wszystkie przyznane
startVideoRecordingWithLocation()
} else {
// Sprawdź które brakują
val missing = results.filter { !it.value }.keys
showMissingPermissions(missing)
}
}
// Sprawdź które brakują
val missing = ADict.Permissions.getMissingPermissions(
context,
listOf(Permission.CAMERA, Permission.RECORD_AUDIO)
)
if (missing.isEmpty()) {
// Wszystkie są
}
💬 Z wyjaśnieniem (Rationale)
Automatycznie pokazuje dialog z wyjaśnieniem gdy potrzeba:
ADict.Permissions.requestWithRationale(
activity = activity,
permission = Permission.CAMERA,
rationale = "Potrzebujemy dostępu do kamery, aby zrobić zdjęcie profilowe",
rationaleTitle = "Wymagane uprawnienie", // opcjonalne
positiveButton = "OK", // opcjonalne
negativeButton = "Anuluj", // opcjonalne
onGranted = {
openCamera()
},
onDenied = {
showAlternativeUpload()
}
)
// Jeśli uprawnienie jest permanentnie odrzucone,
// automatycznie pokaże dialog z opcją przejścia do ustawień
📊 Stan uprawnienia
val state = ADict.Permissions.getState(activity, Permission.CAMERA)
when (state) {
PermissionState.GRANTED -> {
// Przyznane - można używać
openCamera()
}
PermissionState.DENIED -> {
// Odrzucone, ale można zapytać ponownie
showRationale()
}
PermissionState.PERMANENTLY_DENIED -> {
// Odrzucone z "Don't ask again" - trzeba iść do ustawień
showSettingsPrompt()
}
PermissionState.NOT_APPLICABLE -> {
// Nie dotyczy (np. Android 12 permission na Android 10)
}
}
📱 Dostępne uprawnienia
| Stała | Uprawnienie | Uwagi |
|---|---|---|
| Permission.CAMERA | Kamera | |
| Permission.LOCATION | Dokładna lokalizacja | |
| Permission.LOCATION_COARSE | Przybliżona lokalizacja | |
| Permission.RECORD_AUDIO | Mikrofon | |
| Permission.READ_CONTACTS | Odczyt kontaktów | |
| Permission.WRITE_CONTACTS | Zapis kontaktów | |
| Permission.READ_STORAGE | Odczyt pamięci | Legacy |
| Permission.READ_MEDIA_IMAGES | Odczyt zdjęć | Android 13+ |
| Permission.READ_MEDIA_VIDEO | Odczyt wideo | Android 13+ |
| Permission.POST_NOTIFICATIONS | Powiadomienia | Android 13+ |
| Permission.BLUETOOTH_CONNECT | Połączenie BT | Android 12+ |
| Permission.BLUETOOTH_SCAN | Skanowanie BT | Android 12+ |
🔧 Funkcje pomocnicze
// Otwórz ustawienia aplikacji
ADict.Permissions.openAppSettings(context)
// Otwórz ustawienia lokalizacji
ADict.Permissions.openLocationSettings(context)
// Otwórz ustawienia Bluetooth
ADict.Permissions.openBluetoothSettings(context)
// Czy lokalizacja włączona w systemie?
if (!ADict.Permissions.isLocationEnabled(context)) {
showEnableLocationPrompt()
}
// Czy Bluetooth włączony?
if (!ADict.Permissions.isBluetoothEnabled(context)) {
showEnableBluetoothPrompt()
}
// Obsłuż wynik w Activity (jeśli nie używasz ActivityResultContracts)
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
ADict.Permissions.onRequestPermissionsResult(requestCode, permissions, grantResults)
}