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 RequestAsyncPermissionStatus 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:

  • Full Support -Podporovány
  • Not Supported – Nepodporuje se nebo nevyžaduje
Oprávnění 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
ContactsWrite Android supported iOS supported UWP supported watchOS not supported tvOS not supported Tizen not supported
Svítilna Android supported iOS not supported UWP not supported watchOS not supported tvOS not supported Tizen supported
UmístěníWhenInUse 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
Média 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
telefonní Android supported iOS supported UWP not supported watchOS not supported tvOS not supported Tizen not supported
Photos Android not supported iOS supported UWP not supported watchOS not supported tvOS supported Tizen not supported
Připomenutí Android not supported iOS supported UWP not supported watchOS supported tvOS not supported Tizen not supported
Senzory 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
Řeč Android supported iOS supported UWP not supported watchOS not supported tvOS not supported Tizen not supported
StorageRead Android supported iOS not supported UWP not supported watchOS not supported tvOS not supported Tizen not supported
Přepsání úložiště Android supported iOS not supported UWP not supported watchOS not supported tvOS not supported Tizen not supported

Pokud je oprávnění označeno jako not supported 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 .

rozhraní API

Další videa o Xamarinu najdete na Channel 9 a YouTube.