Xamarin.Essentials:Oprávnění
Třída Permissions poskytuje možnost kontrolovat a požadovat oprávnění modulu runtime.
Začínáme
Pokud chcete začít používat toto rozhraní API, přečtěte si úvodní příručkuXamarin.Essentials, abyste měli jistotu, že je knihovna správně nainstalovaná a nastavená ve vašich projektech.
Toto rozhraní API používá oprávnění modulu runtime v Androidu. Ujistěte se, že Xamarin.Essentials je v aplikaci plně inicializováno a zpracování oprávnění.
V projektu MainLauncher
Androidu nebo v libovolném Activity
spuštěné Xamarin.Essentials aplikaci musí být inicializována OnCreate
metoda:
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
//...
}
Chcete-li zpracovávat oprávnění modulu runtime v Androidu, Xamarin.Essentials musí přijmout všechny OnRequestPermissionsResult
. Do všech Activity
tříd přidejte následující kód:
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);
}
Použití oprávnění
Přidejte do Xamarin.Essentials předmětu odkaz:
using Xamarin.Essentials;
Kontrola oprávnění
Pokud chcete zkontrolovat aktuální stav oprávnění, použijte CheckStatusAsync
metodu spolu s konkrétním oprávněním k získání stavu.
var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
A PermissionException
je vyvolán, pokud požadované oprávnění není deklarováno.
Před vyžádáním je nejlepší zkontrolovat stav oprávnění. Pokud se uživateli nikdy nezobrazí výzva, vrátí každý operační systém jiný výchozí stav. iOS vrátí Unknown
, zatímco ostatní vrátí Denied
. Pokud je Granted
stav, není potřeba provádět další hovory. Pokud je stav v Denied
iOSu, měli byste vyzvat uživatele, aby změnil oprávnění v nastavení a v Androidu, můžete volat ShouldShowRationale
, abyste zjistili, jestli uživatel už oprávnění v minulosti odepřel.
Žádost o oprávnění
Pokud chcete požádat o oprávnění od uživatelů, použijte metodu RequestAsync
spolu s konkrétním oprávněním k vyžádání. Pokud uživatel dříve udělil oprávnění a neodvolal ho, vrátí se tato metoda Granted
okamžitě a nezobrazí dialogové okno.
var status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
A PermissionException
je vyvolán, pokud požadované oprávnění není deklarováno.
Upozorňujeme, že na některých platformách může být žádost o oprávnění aktivována pouze jednou. Další výzvy musí vývojář zpracovat, aby zkontroloval, jestli je oprávnění ve Denied
stavu, a požádat uživatele, aby ho ručně zapnul.
Stav oprávnění
Při použití CheckStatusAsync
nebo RequestAsync
PermissionStatus
vrácení se vrátí, které lze použít k určení dalších kroků:
- Neznámé – oprávnění je v neznámém stavu.
- Odepřeno – uživatel zamítl žádost o oprávnění.
- Zakázáno – Tato funkce je na zařízení zakázaná.
- Uděleno – Uživatel udělil oprávnění nebo je automaticky udělen
- Omezeno – v omezeném stavu
Vysvětlení, proč je potřeba oprávnění
Osvědčeným postupem je vysvětlit, proč vaše aplikace potřebuje konkrétní oprávnění. V iOSu musíte zadat řetězec, který se zobrazí uživateli. Android nemá tuto schopnost a také výchozí stav oprávnění zakázáno. Tím se omezí možnost zjistit, jestli uživatel oprávnění odepřel nebo jestli se uživateli poprvé zobrazí výzva. Metodu ShouldShowRationale
lze použít k určení, jestli se má zobrazit vzdělávací uživatelské rozhraní. Pokud metoda vrátí true
toto je proto, že uživatel odepřel nebo zakázal oprávnění v minulosti. Při volání této metody se vždy vrátí false
jiné platformy.
Dostupná oprávnění
Xamarin.Essentials pokusí se abstraktovat co nejvíce oprávnění. Každý operační systém má ale jinou sadu oprávnění modulu runtime. Kromě toho existují rozdíly při poskytování jednoho rozhraní API pro některá oprávnění. Tady je průvodce aktuálně dostupnými oprávněními:
Průvodce ikonou:
- -Podporovány
- – Nepodporuje se nebo nevyžaduje
Oprávnění | Android | iOS | UWP | watchOS | tvOS | Tizen |
---|---|---|---|---|---|---|
CalendarRead | ||||||
CalendarWrite | ||||||
Kamera | ||||||
ContactsRead | ||||||
ContactsWrite | ||||||
Svítilna | ||||||
UmístěníWhenInUse | ||||||
LocationAlways | ||||||
Média | ||||||
Mikrofon | ||||||
telefonní | ||||||
Photos | ||||||
Připomenutí | ||||||
Senzory | ||||||
Sms | ||||||
Řeč | ||||||
StorageRead | ||||||
Přepsání úložiště |
Pokud je oprávnění označeno jako vždy, vrátí Granted
se při zaškrtnutí nebo vyžádání.
Obecné použití
Následující kód představuje vzor obecného použití pro určení, jestli bylo uděleno oprávnění, a požádá ho, pokud ne. Tento kód používá funkce, které jsou dostupné ve Xamarin.Essentials verzi 1.6.0 nebo novější.
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;
}
Každý typ oprávnění může mít vytvořenou instanci, kterou lze volat přímo.
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;
}
Rozšíření oprávnění
Rozhraní API pro oprávnění byla vytvořena tak, aby byla flexibilní a rozšiřitelná pro aplikace, které vyžadují další ověření nebo oprávnění, která nejsou součástí Xamarin.Essentials. Vytvořte novou třídu, která dědí BasePermission
z a implementuje požadované abstraktní metody.
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();
}
}
Při implementaci oprávnění v konkrétní platformě BasePlatformPermission
může být třída zděděna. Poskytuje další pomocné metody platformy pro automatickou kontrolu deklarací. To může pomoct při vytváření vlastních oprávnění, která seskupují. Můžete například požádat o přístup ke čtení i zápisu do úložiště v Androidu pomocí následujícího vlastního oprávnění.
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();
}
Pak můžete volat nové oprávnění z projektu Androidu.
await Permissions.RequestAsync<ReadWriteStoragePermission>();
Pokud chcete toto rozhraní API volat ze sdíleného kódu, můžete vytvořit rozhraní a pomocí služby závislostí zaregistrovat a získat implementaci.
public interface IReadWritePermission
{
Task<PermissionStatus> CheckStatusAsync();
Task<PermissionStatus> RequestAsync();
}
Pak implementujte rozhraní v projektu platformy:
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();
}
Pak můžete zaregistrovat konkrétní implementaci:
DependencyService.Register<IReadWritePermission, ReadWriteStoragePermission>();
Pak ho můžete ze sdíleného projektu vyřešit a použít:
var readWritePermission = DependencyService.Get<IReadWritePermission>();
var status = await readWritePermission.CheckStatusAsync();
if (status != PermissionStatus.Granted)
{
status = await readWritePermission.RequestAsync();
}
Specifika implementace platformy
Oprávnění musí mít odpovídající atributy nastavené v souboru manifestu Androidu. Ve výchozím nastavení se stav oprávnění odepře.
Další informace o oprávněních najdete v dokumentaci k Xamarin.Android .