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 RequestAsync
PermissionStatus
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:
- -Didukung
- - Tidak didukung/diperlukan
Izin | Android | iOS | UWP | watchOS | tvOS | Tizen |
---|---|---|---|---|---|---|
CalendarRead | ||||||
CalendarWrite | ||||||
Kamera | ||||||
ContactsRead | ||||||
KontakWrite | ||||||
Senter | ||||||
LocationWhenInUse | ||||||
LocationAlways | ||||||
Media | ||||||
Mikrofon | ||||||
Telepon | ||||||
Foto | ||||||
Pengingat | ||||||
Sensor | ||||||
SMS | ||||||
Ucapan | ||||||
PenyimpananBaca | ||||||
StorageWrite |
Jika izin ditandai sebagai 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 .