Bagikan melalui


Xamarin.Essentials:Izin

Kelas Izin menyediakan kemampuan untuk memeriksa dan meminta izin runtime.

Memulai

Untuk mulai menggunakan API ini, baca panduan memulai untuk Xamarin.Essentials memastikan pustaka diinstal dan disiapkan dengan benar di proyek Anda.

API ini menggunakan izin runtime di Android. Pastikan bahwa Xamarin.Essentials sepenuhnya diinisialisasi dan penanganan izin disiapkan di aplikasi Anda.

Dalam proyek MainLauncher Android atau apa pun Activity yang diluncurkan Xamarin.Essentials harus diinisialisasi dalam OnCreate metode :

protected override void OnCreate(Bundle savedInstanceState) 
{
    //...
    base.OnCreate(savedInstanceState);
    Xamarin.Essentials.Platform.Init(this, savedInstanceState); // add this line to your code, it may also be called: bundle
    //...
}    

Untuk menangani izin runtime di Android, Xamarin.Essentials harus menerima apa pun OnRequestPermissionsResult. Tambahkan kode berikut ke semua Activity kelas:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
{
    Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

Menggunakan Izin

Tambahkan referensi ke Xamarin.Essentials di kelas Anda:

using Xamarin.Essentials;

Memeriksa Izin

Untuk memeriksa status izin saat ini, gunakan CheckStatusAsync metode bersama dengan izin tertentu untuk mendapatkan status.

var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();

PermissionException akan dilemparkan jika izin yang diperlukan tidak dinyatakan.

Yang terbaik adalah memeriksa status izin sebelum memintanya. Setiap sistem operasi mengembalikan status default yang berbeda jika pengguna belum pernah diminta. iOS mengembalikan Unknown, sementara yang lain mengembalikan Denied. Jika statusnya maka Granted tidak perlu melakukan panggilan lain. Di iOS jika statusnya adalah Denied Anda harus meminta pengguna untuk mengubah izin di pengaturan dan di Android Anda dapat memanggil ShouldShowRationale untuk mendeteksi apakah pengguna telah menolak izin di masa lalu.

Meminta Izin

Untuk meminta izin dari pengguna, gunakan RequestAsync metode bersama dengan izin khusus untuk meminta. Jika pengguna sebelumnya memberikan izin dan belum mencabutnya, maka metode ini akan segera kembali Granted dan tidak menampilkan dialog.

var status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();

PermissionException akan dilemparkan jika izin yang diperlukan tidak dinyatakan.

Perhatikan, bahwa pada beberapa platform permintaan izin hanya dapat diaktifkan satu kali. Perintah lebih lanjut harus ditangani oleh pengembang untuk memeriksa apakah izin dalam Denied status dan meminta pengguna untuk mengaktifkannya secara manual.

Status Izin

Saat menggunakan CheckStatusAsync atau RequestAsyncPermissionStatus akan dikembalikan yang dapat digunakan untuk menentukan langkah-langkah berikutnya:

  • Tidak diketahui - Izin dalam status tidak diketahui
  • Ditolak - Pengguna menolak permintaan izin
  • Dinonaktifkan - Fitur dinonaktifkan pada perangkat
  • Diberikan - Pengguna memberikan izin atau secara otomatis diberikan
  • Dibatasi - Dalam status terbatas

Menjelaskan mengapa izin diperlukan

Praktik terbaik adalah menjelaskan mengapa aplikasi Anda membutuhkan izin tertentu. Di iOS, Anda harus menentukan string yang ditampilkan kepada pengguna. Android tidak memiliki kemampuan ini dan dan juga default status izin ke Dinonaktifkan. Ini membatasi kemampuan untuk mengetahui apakah pengguna menolak izin atau apakah itu pertama kalinya meminta pengguna. Metode ShouldShowRationale ini dapat digunakan untuk menentukan apakah antarmuka pengguna pendidikan harus ditampilkan. Jika metode mengembalikan true ini adalah karena pengguna telah menolak atau menonaktifkan izin di masa lalu. Platform lain akan selalu kembali false saat memanggil metode ini.

Izin yang Tersedia

Xamarin.Essentials mencoba untuk mengabstraksi izin sebanyak mungkin. Namun, setiap sistem operasi memiliki serangkaian izin runtime yang berbeda. Selain itu ada perbedaan saat menyediakan satu API untuk beberapa izin. Berikut adalah panduan untuk izin yang saat ini tersedia:

Panduan Ikon:

  • Full Support -Didukung
  • Not Supported - Tidak didukung/diperlukan
Izin Android iOS UWP watchOS tvOS Tizen
CalendarRead Android supported iOS supported UWP not supported watchOS supported tvOS not supported Tizen not supported
CalendarWrite Android supported iOS supported UWP not supported watchOS supported tvOS not supported Tizen not supported
Kamera Android supported iOS supported UWP not supported watchOS not supported tvOS not supported Tizen supported
ContactsRead Android supported iOS supported UWP supported watchOS not supported tvOS not supported Tizen not supported
KontakWrite Android supported iOS supported UWP supported watchOS not supported tvOS not supported Tizen not supported
Senter Android supported iOS not supported UWP not supported watchOS not supported tvOS not supported Tizen supported
LocationWhenInUse Android supported iOS supported UWP supported watchOS supported tvOS supported Tizen supported
LocationAlways Android supported iOS supported UWP supported watchOS supported tvOS not supported Tizen supported
Media Android not supported iOS supported UWP not supported watchOS not supported tvOS not supported Tizen not supported
Mikrofon Android supported iOS supported UWP supported watchOS not supported tvOS not supported Tizen supported
Telepon Android supported iOS supported UWP not supported watchOS not supported tvOS not supported Tizen not supported
Foto Android not supported iOS supported UWP not supported watchOS not supported tvOS supported Tizen not supported
Pengingat Android not supported iOS supported UWP not supported watchOS supported tvOS not supported Tizen not supported
Sensor Android supported iOS supported UWP supported watchOS supported tvOS not supported Tizen not supported
SMS Android supported iOS supported UWP not supported watchOS not supported tvOS not supported Tizen not supported
Ucapan Android supported iOS supported UWP not supported watchOS not supported tvOS not supported Tizen not supported
PenyimpananBaca Android supported iOS not supported UWP not supported watchOS not supported tvOS not supported Tizen not supported
StorageWrite Android supported iOS not supported UWP not supported watchOS not supported tvOS not supported Tizen not supported

Jika izin ditandai sebagai not supported akan selalu kembali Granted saat dicentang atau diminta.

Penggunaan Umum

Kode berikut menyajikan pola penggunaan umum untuk menentukan apakah izin telah diberikan dan memintanya jika belum. Kode ini menggunakan fitur yang tersedia dengan Xamarin.Essentials versi 1.6.0 atau yang lebih baru.

public async Task<PermissionStatus> CheckAndRequestLocationPermission()
{
    var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
    
    if (status == PermissionStatus.Granted)
        return status;        
    
    if (status == PermissionStatus.Denied && DeviceInfo.Platform == DevicePlatform.iOS)
    {
        // Prompt the user to turn on in settings
        // On iOS once a permission has been denied it may not be requested again from the application
        return status;
    }
    
    if (Permissions.ShouldShowRationale<Permissions.LocationWhenInUse>())
    {
        // Prompt the user with additional information as to why the permission is needed
    }   

    status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();

    return status;
}

Setiap jenis izin dapat memiliki instans yang dibuat bahwa metode dapat dipanggil secara langsung.

public async Task GetLocationAsync()
{
    var status = await CheckAndRequestPermissionAsync(new Permissions.LocationWhenInUse());
    if (status != PermissionStatus.Granted)
    {
        // Notify user permission was denied
        return;
    }

    var location = await Geolocation.GetLocationAsync();
}

public async Task<PermissionStatus> CheckAndRequestPermissionAsync<T>(T permission)
            where T : BasePermission
{
    var status = await permission.CheckStatusAsync();
    if (status != PermissionStatus.Granted)
    {
        status = await permission.RequestAsync();
    }

    return status;
}

Memperluas Izin

API Izin dibuat agar fleksibel dan dapat diperluas untuk aplikasi yang memerlukan validasi atau izin tambahan yang tidak disertakan dalam Xamarin.Essentials. Buat kelas baru yang mewarisi dari BasePermission dan menerapkan metode abstrak yang diperlukan.

public class MyPermission : BasePermission
{
    // This method checks if current status of the permission
    public override Task<PermissionStatus> CheckStatusAsync()
    {
        throw new System.NotImplementedException();
    }

    // This method is optional and a PermissionException is often thrown if a permission is not declared
    public override void EnsureDeclared()
    {
        throw new System.NotImplementedException();
    }

    // Requests the user to accept or deny a permission
    public override Task<PermissionStatus> RequestAsync()
    {
        throw new System.NotImplementedException();
    }
}

Saat menerapkan izin di platform tertentu, BasePlatformPermission kelas dapat diwariskan. Ini menyediakan metode pembantu platform tambahan untuk secara otomatis memeriksa deklarasi. Ini dapat membantu saat membuat izin kustom yang melakukan pengelompokan. Misalnya, Anda dapat meminta akses Baca dan Tulis ke penyimpanan di Android menggunakan izin kustom berikut.

public class ReadWriteStoragePermission : Xamarin.Essentials.Permissions.BasePlatformPermission
{
    public override (string androidPermission, bool isRuntime)[] RequiredPermissions => new List<(string androidPermission, bool isRuntime)>
    {
        (Android.Manifest.Permission.ReadExternalStorage, true),
        (Android.Manifest.Permission.WriteExternalStorage, true)
    }.ToArray();
}

Kemudian Anda dapat memanggil izin baru dari proyek Android.

await Permissions.RequestAsync<ReadWriteStoragePermission>();

Jika Anda ingin memanggil API ini dari kode bersama, Anda dapat membuat antarmuka dan menggunakan layanan dependensi untuk mendaftar dan mendapatkan implementasinya.

public interface IReadWritePermission
{        
    Task<PermissionStatus> CheckStatusAsync();
    Task<PermissionStatus> RequestAsync();
}

Kemudian terapkan antarmuka dalam proyek platform Anda:

public class ReadWriteStoragePermission : Xamarin.Essentials.Permissions.BasePlatformPermission, IReadWritePermission
{
    public override (string androidPermission, bool isRuntime)[] RequiredPermissions => new List<(string androidPermission, bool isRuntime)>
    {
        (Android.Manifest.Permission.ReadExternalStorage, true),
        (Android.Manifest.Permission.WriteExternalStorage, true)
    }.ToArray();
}

Anda kemudian dapat mendaftarkan implementasi tertentu:

DependencyService.Register<IReadWritePermission, ReadWriteStoragePermission>();

Kemudian dari proyek bersama Anda, Anda dapat menyelesaikan dan menggunakannya:

var readWritePermission = DependencyService.Get<IReadWritePermission>();
var status = await readWritePermission.CheckStatusAsync();
if (status != PermissionStatus.Granted)
{
    status = await readWritePermission.RequestAsync();
}

Spesifikasi Implementasi Platform

Izin harus memiliki atribut yang cocok yang diatur dalam file Manifes Android. Status izin default ke Ditolak.

Baca selengkapnya tentang dokumentasi Izin di Xamarin.Android .

API

Temukan video Xamarin lainnya di Channel 9 dan YouTube.