Xamarin.Essentials: Oprávnění

Třída Permissions poskytuje možnost zkontrolovat a vyžádat oprávnění modulu runtime.

Začínáme

Pokud chcete začít používat toto rozhraní API, přečtěte si příručku Začínáme pro a ujistěte se, ž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 Xamarin.Essentials se, že je plně inicializované a že je ve vaší aplikaci nastaveno zpracování oprávnění.

V projektu androidu nebo v MainLauncher projektu, Activity který se Xamarin.Essentials spustí, musí být inicializována v OnCreate metodě :

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
    //...
}    

Pokud chcete v Androidu zpracovávat oprávnění modulu runtime, Xamarin.Essentials musí přijmout všechny OnRequestPermissionsResult . Do všech tříd přidejte následující Activity 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í

Do třídy Xamarin.Essentials přidejte odkaz na :

using Xamarin.Essentials;

Kontrola oprávnění

Pokud chcete zkontrolovat aktuální stav oprávnění, použijte metodu spolu s konkrétním oprávněním k CheckStatusAsync získání stavu pro .

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

Je PermissionException vyvolána, pokud není deklarované požadované oprávnění.

Než si oprávnění vyžádáte, je nejlepší zkontrolovat jeho stav. Pokud uživatel nikdy nebyl vyzván, vrátí každý operační systém jiný výchozí stav. iOS vrátí Unknown , zatímco jiné vrátí Denied . Pokud je stav Granted , není nutné provádět další volání. Pokud je stav v iOSu, měli byste uživatele vyzvat, aby v nastavení změnil oprávnění, a v Androidu můžete zavolat a zjistit, jestli už uživatel oprávnění v minulosti DeniedShouldShowRationale zamítl.

Vyžadování oprávnění

Pokud chcete požádat o oprávnění od uživatelů, použijte RequestAsync metodu 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í tato metoda okamžitě Granted a nezobrazí dialogové okno.

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

Je PermissionException vyvolána, pokud není deklarované požadované oprávnění.

Upozorňujeme, že na některých platformách je možné žádost o oprávnění aktivovat pouze jednou. Vývojář musí zpracovat další výzvy, aby zkontrolovat, jestli je oprávnění ve stavu , a požádat uživatele, aby ho Denied zapsal ručně.

Stav oprávnění

Při použití CheckStatusAsync nebo se vrátí , který lze použít k určení dalších RequestAsyncPermissionStatus kroků:

  • Neznámé – Oprávnění je v neznámém stavu.
  • Odepření – Uživatel zamítl žádost o oprávnění
  • Zakázáno – Tato funkce je na zařízení zakázaná.
  • Uděleno – Uživatel má udělené oprávnění nebo je mu automaticky uděleno
  • S omezeným přístupem – 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 tuto možnost nemá a také výchozí stav oprávnění na Zakázáno. Tím se omezí možnost vědět, jestli uživatel oprávnění zamítl nebo jestli ho uživatel poprvé vyzve. Pomocí ShouldShowRationale metody můžete určit, jestli se má zobrazit vzdělávací uživatelské rozhraní. Pokud metoda vrátí tuto hodnotu, je to proto, že uživatel oprávnění v minulosti true zamítl nebo zakázal. Při volání této metody se vždy false vrátí jiné platformy.

Dostupná oprávnění

Xamarin.Essentials se pokusí abstrahovat co nejvíce oprávnění. Každý operační systém ale má 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 ikonami:

  • Plná podpora – podporováno
  • Nepodporuje se nepodporuje nepodporuje se nebo se nevyžaduje
Oprávnění Android iOS UWP watchOS tvOS Tizen
CalendarRead Android podporovaný Androidem Podpora iOSu UPW se Podporované watchOS pro TvOS nepodporuje Tizen se nepodporuje.
CalendarWrite Android podporovaný Androidem Podpora iOSu UPW se Podporované watchOS pro TvOS nepodporuje Tizen se nepodporuje.
Camera Android podporovaný Androidem Podpora iOSu UPW se WatchOS se TvOS nepodporuje Podpora Tizenu
ContactsRead Android podporovaný Androidem Podpora iOSu Podpora UPW pro WatchOS se TvOS nepodporuje Tizen se nepodporuje.
ContactsWrite Android podporovaný Androidem Podpora iOSu Podpora UPW pro WatchOS se TvOS nepodporuje Tizen se nepodporuje.
Svítilna Android podporovaný Androidem iOS se nepodporuje UPW se WatchOS se TvOS nepodporuje Podpora Tizenu
UmístěníWhenInUse Android podporovaný Androidem Podpora iOSu Podpora UPW pro Podporované watchOS pro Podpora tvOS Podpora Tizenu
UmístěníCesty Android podporovaný Androidem Podpora iOSu Podpora UPW pro Podporované watchOS pro TvOS nepodporuje Podpora Tizenu
Média Android se nepodporuje. Podpora iOSu UPW se WatchOS se TvOS nepodporuje Tizen se nepodporuje.
Mikrofon Android podporovaný Androidem Podpora iOSu Podpora UPW pro WatchOS se TvOS nepodporuje Podpora Tizenu
Rozložení Android podporovaný Androidem Podpora iOSu UPW se WatchOS se TvOS nepodporuje Tizen se nepodporuje.
Fotky Android se nepodporuje. Podpora iOSu UPW se WatchOS se Podpora tvOS Tizen se nepodporuje.
Připomínky Android se nepodporuje. Podpora iOSu UPW se Podporované watchOS pro TvOS nepodporuje Tizen se nepodporuje.
Senzory Android podporovaný Androidem Podpora iOSu Podpora UPW pro Podporované watchOS pro TvOS nepodporuje Tizen se nepodporuje.
Sms Android podporovaný Androidem Podpora iOSu UPW se WatchOS se TvOS nepodporuje Tizen se nepodporuje.
Řeč Android podporovaný Androidem Podpora iOSu UPW se WatchOS se TvOS nepodporuje Tizen se nepodporuje.
StorageRead Android podporovaný Androidem iOS se nepodporuje UPW se WatchOS se TvOS nepodporuje Tizen se nepodporuje.
StorageWrite Android podporovaný Androidem iOS se nepodporuje UPW se WatchOS se TvOS nepodporuje Tizen se nepodporuje.

Pokud je oprávnění označeno jako nepodporuje se, vrátí se vždy, když je not supported zaškrtnuté nebo vyžádané.

Obecné použití

Následující kód představuje vzor obecného použití pro určení, zda bylo uděleno oprávnění, a požádá o něj, pokud ne. Tento kód používá funkce, které jsou k dispozici 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 z metod.

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 oprávnění bylo vytvořeno tak, aby bylo 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í z a BasePermission 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í na konkrétní platformě může BasePlatformPermission být třída zděděna z. To poskytuje další pomocné metody platformy pro automatickou kontrolu deklarací. To vám může pomoct při vytváření vlastních oprávnění, která seskupují. Můžete například požádat o přístup pro čtení i zápis k úložišti v Androidu s použitím 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 nové oprávnění volat z projektu pro Android.

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í do 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>();

Ze sdíleného projektu pak můžete problém vyřešit a použít:

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

Specifické pro implementaci platformy

V souboru manifestu Android musí mít oprávnění nastavené stejné atributy. Stav oprávnění je ve výchozím nastavení odepřen.

Přečtěte si další informace o oprávněních v dokumentaci Xamarin. Android .

rozhraní API

Další videa Xamarin najdete na webu Channel 9 a YouTube.