Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Implementasi Flutter Permissions

Setelah memahami konsep dasar permissions, sekarang kita akan mengimplementasikannya di aplikasi Flutter menggunakan package permission_handler. Package ini sangat direkomendasikan karena menyediakan API yang konsisten untuk menangani permissions di Android dan iOS.

1. Menggunakan Package permission_handler

a. Menambahkan Dependensi

Buka file pubspec.yaml Anda dan tambahkan permission_handler di bawah dependencies.

dependencies:
  flutter:
    sdk: flutter
  permission_handler: ^10.2.0 # Gunakan versi terbaru

Setelah itu, jalankan flutter pub get di terminal Anda.

b. Konfigurasi Platform-Specific

Seperti yang dibahas sebelumnya, Anda perlu mengkonfigurasi file manifest/info untuk setiap platform.

  • Android (android/app/src/main/AndroidManifest.xml): Tambahkan izin yang diperlukan di dalam tag <manifest>. Contoh untuk kamera:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android">
        <uses-permission android:name="android.permission.CAMERA"/>
        <!-- Tambahkan izin lain yang dibutuhkan di sini -->
        <application ...>
            <!-- ... -->
        </application>
    </manifest>
    
  • iOS (ios/Runner/Info.plist): Tambahkan deskripsi penggunaan izin di dalam tag <dict>. Contoh untuk kamera:

    <dict>
        <key>NSCameraUsageDescription</key>
        <string>Aplikasi ini membutuhkan akses kamera untuk mengambil foto.</string>
        <!-- Tambahkan deskripsi izin lain yang dibutuhkan di sini -->
    </dict>
    

    Pastikan untuk mengganti string deskripsi dengan penjelasan yang relevan untuk pengguna Anda.

2. Langkah-langkah Implementasi dengan permission_handler

a. Import Package

import 'package:permission_handler/permission_handler.dart';

b. Periksa Status Izin

Anda dapat memeriksa status izin tunggal atau beberapa izin sekaligus.

// Periksa status izin kamera
PermissionStatus cameraStatus = await Permission.camera.status;
print('Camera permission status: $cameraStatus');

// Periksa status izin lokasi
PermissionStatus locationStatus = await Permission.location.status;
print('Location permission status: $locationStatus');

c. Minta Izin

Jika izin belum diberikan, Anda dapat memintanya. Method request() akan menampilkan dialog permintaan izin kepada pengguna.

PermissionStatus status = await Permission.camera.request();

if (status.isGranted) {
  print('Camera permission granted');
} else if (status.isDenied) {
  print('Camera permission denied');
} else if (status.isPermanentlyDenied) {
  print('Camera permission permanently denied');
}

d. Tangani Hasil Permintaan

Berdasarkan PermissionStatus yang dikembalikan:

  • isGranted: Izin diberikan. Lanjutkan fungsionalitas.
  • isDenied: Izin ditolak. Anda bisa menjelaskan mengapa izin diperlukan dan meminta lagi.
  • isPermanentlyDenied: Izin ditolak permanen. Pengguna harus mengaktifkannya secara manual dari pengaturan aplikasi.

e. Buka Pengaturan Aplikasi

Jika izin ditolak permanen, Anda dapat mengarahkan pengguna langsung ke pengaturan aplikasi mereka.

if (status.isPermanentlyDenied) {
  // Tampilkan dialog atau pesan kepada pengguna
  // Lalu arahkan ke pengaturan aplikasi
  openAppSettings();
}

3. Studi Kasus: Aplikasi Kamera Sederhana

Mari kita buat aplikasi sederhana yang meminta izin kamera dan menampilkan statusnya.

Langkah 1: Buat Proyek Baru

Buat proyek Flutter baru.

Langkah 2: main.dart

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Camera Permission Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CameraPermissionScreen(),
    );
  }
}

class CameraPermissionScreen extends StatefulWidget {
  @override
  _CameraPermissionScreenState createState() => _CameraPermissionScreenState();
}

class _CameraPermissionScreenState extends State<CameraPermissionScreen> {
  String _permissionStatusText = 'Checking camera permission...';

  @override
  void initState() {
    super.initState();
    _checkAndRequestCameraPermission();
  }

  Future<void> _checkAndRequestCameraPermission() async {
    PermissionStatus status = await Permission.camera.status;

    if (status.isGranted) {
      setState(() {
        _permissionStatusText = 'Camera permission GRANTED. You can use the camera!';
      });
    } else if (status.isDenied) {
      // Izin ditolak, coba minta lagi
      status = await Permission.camera.request();
      if (status.isGranted) {
        setState(() {
          _permissionStatusText = 'Camera permission GRANTED after request.';
        });
      } else {
        setState(() {
          _permissionStatusText = 'Camera permission DENIED.';
        });
      }
    } else if (status.isPermanentlyDenied) {
      setState(() {
        _permissionStatusText = 'Camera permission PERMANENTLY DENIED. Please enable it from app settings.';
      });
    } else if (status.isRestricted) {
      setState(() {
        _permissionStatusText = 'Camera permission RESTRICTED.';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Camera Permission Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              _permissionStatusText,
              textAlign: TextAlign.center,
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 20),
            if (_permissionStatusText.contains('PERMANENTLY DENIED'))
              ElevatedButton(
                onPressed: () {
                  openAppSettings(); // Buka pengaturan aplikasi
                },
                child: Text('Open App Settings'),
              ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _checkAndRequestCameraPermission,
              child: Text('Re-check Permission'),
            ),
          ],
        ),
      ),
    );
  }
}

Penjelasan Kode:

  • _permissionStatusText: Variabel state untuk menampilkan status izin saat ini.
  • initState(): Memanggil _checkAndRequestCameraPermission() saat widget pertama kali dibuat.
  • _checkAndRequestCameraPermission():
    • Pertama, memeriksa status izin kamera.
    • Jika isGranted, langsung update UI.
    • Jika isDenied, mencoba meminta izin lagi.
    • Jika isPermanentlyDenied, menampilkan pesan dan tombol untuk membuka pengaturan aplikasi.
  • openAppSettings(): Fungsi dari permission_handler yang akan membuka pengaturan aplikasi perangkat, memungkinkan pengguna untuk mengaktifkan izin secara manual.
  • ElevatedButton "Re-check Permission": Memungkinkan pengguna untuk memeriksa ulang status izin setelah mereka mungkin mengubahnya di pengaturan.

Dengan studi kasus ini, Anda telah berhasil mengimplementasikan alur permintaan izin yang lengkap untuk kamera, termasuk penanganan berbagai status izin dan mengarahkan pengguna ke pengaturan aplikasi jika diperlukan. Ini adalah pola yang dapat Anda adaptasi untuk permissions lainnya.