Sobes.tech
Junior

Koje vrste dozvola postoje u Flutter aplikacijama?

sobes.tech АИ

Одговор од АИ

Dozvole u Flutter aplikacijama upravljaju operativni sistem uređaja (Android ili iOS). Flutter omogućava pristup odgovarajućim API-jevima platforme za zahtev i proveru ovih dozvola.

Glavne vrste dozvola:

  • Dozvole pri instalaciji (Install-time permissions): Automatski se daju pri instalaciji aplikacije. Ne zahtevaju eksplicitni zahtev od korisnika tokom rada aplikacije. U Android-u pripadaju kategorijama normal i signature.
  • Dozvole u toku izvršavanja (Runtime permissions): Najvažnije i najosetljivije dozvole, kao što su pristup lokaciji, kameri, mikrofonu, kontaktima i fajlovima. Zahtevaju eksplicitni zahtev tokom rada aplikacije. Korisnik može da da ili odbije takvu dozvolu. U Android-u pripadaju kategoriji dangerous.
  • Specijalne dozvole (Special permissions): Dozvole koje zahtevaju poseban interakciju sa korisnikom za odobrenje, na primer, dozvola za crtanje preko drugih prozora (ACTION_MANAGE_OVERLAY_PERMISSION) ili dozvola za zapis u sistemske postavke (WRITE_SETTINGS).

Flutter koristi dodatke (plugins) za interakciju sa API-jevima platforme i upravljanje dozvolama. Najrašireniji plugin je permission_handler.

Prilikom korišćenja permission_handler koriste se sledeći statusi dozvola:

  • granted: Dozvola je odobrena.
  • denied: Dozvola je odbijena (može se ponovo zatražiti).
  • restricted: Dozvola je ograničena od strane platforme.
  • permanentlyDenied: Dozvola je trajno odbijena, potrebno je uputiti korisnika u podešavanja aplikacije.
  • limited: Dozvola je delimično odobrena (na primer, pristup samo odabrane fotografije u iOS-u).

Primer zahteva za dozvolu pristupa kameri:

import 'package:permission_handler/permission_handler.dart';

// Asinhrona funkcija za zahtev za dozvolu
Future<void> requestCameraPermission() async {
  // Dobijanje statusa dozvole
  var status = await Permission.camera.status;
  // Ako dozvola još nije odobrena
  if (status.isDenied) {
    // Zahtev za dozvolu
    status = await Permission.camera.request();
    // Provera statusa nakon zahteva
    if (status.isGranted) {
      // Dozvola je odobrena, može se koristiti kamera
      print('Dozvola za kameru odobrena');
    } else if (status.isPermanentlyDenied) {
      // Dozvola je trajno odbijena, usmeravamo korisnika u podešavanja
      print('Dozvola za kameru je trajno odbijena, otvorite podešavanja');
      openAppSettings(); // funkcija iz permission_handler
    } else {
      // Dozvola je odbijena, ali se može ponovo zatražiti
      print('Dozvola za kameru je odbijena');
    }
  } else if (status.isGranted) {
    // Dozvola je već odobrena
    print('Dozvola za kameru je već odobrena');
  }
}

Potrebno je dodati odgovarajuće dozvole u Android manifest (android/app/src/main/AndroidManifest.xml) i Info.plist za iOS (ios/Runner/Info.plist).

Primer dodavanja dozvole u AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Dozvola za pristup kameri -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <application
        ...>
        <!-- Vaše aktivnosti -->
    </application>
</manifest>

Primer dodavanja opisa za korišćenje dozvole u Info.plist (za iOS, potrebno za dozvole u toku izvršavanja):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	...
	<!-- Opis razloga za korišćenje kamere -->
	<key>NSCameraUsageDescription</key>
	<string>Ova aplikacija koristi vašu kameru za snimanje fotografija.</string>
	...
</dict>
</plist>

Važno je zahtevati dozvole u odgovarajućem trenutku korišćenja funkcije koja ih zahteva, kako bi se izbeglo negativno korisničko iskustvo.