Oprávnění v Xamarin.Androidu
Přehled
Aplikace pro Android běží ve vlastním sandboxu a z bezpečnostních důvodů nemají na zařízení přístup k určitým systémovým prostředkům nebo hardwaru. Uživatel musí aplikaci explicitně udělit oprávnění, aby mohl tyto prostředky používat. Aplikace například nemůže získat přístup k GPS na zařízení bez explicitního oprávnění uživatele. Android vyvolá Java.Lang.SecurityException
výjimku, pokud se aplikace pokusí o přístup k chráněnému prostředku bez oprávnění.
Oprávnění se deklarují v AndroidManifest.xml vývojáři aplikace při vývoji aplikace. Android má dva různé pracovní postupy pro získání souhlasu uživatele s těmito oprávněními:
- U aplikací, které cílí na Android 5.1 (úroveň rozhraní API 22) nebo nižší, došlo při instalaci aplikace k žádosti o oprávnění. Pokud uživatel oprávnění neudělil, aplikace se nenainstaluje. Po instalaci aplikace neexistuje způsob, jak odvolat oprávnění s výjimkou odinstalace aplikace.
- Od Verze Android 6.0 (úroveň rozhraní API 23) měli uživatelé větší kontrolu nad oprávněními; můžou udělit nebo odvolat oprávnění, pokud je aplikace nainstalovaná na zařízení. Tento snímek obrazovky ukazuje nastavení oprávnění pro aplikaci Kontakty Google. Obsahuje seznam různých oprávnění a umožňuje uživateli povolit nebo zakázat oprávnění:
Aplikace pro Android musí za běhu zkontrolovat, jestli mají oprávnění pro přístup k chráněnému prostředku. Pokud aplikace nemá oprávnění, musí vyhovět novým rozhraním API poskytovaným sadou Android SDK, aby uživateli udělila oprávnění. Oprávnění jsou rozdělena do dvou kategorií:
- Normální oprávnění – jedná se o oprávnění, která představují malé bezpečnostní riziko pro zabezpečení nebo ochranu osobních údajů uživatele. Android 6.0 automaticky udělí normální oprávnění v době instalace. Úplný seznam normálních oprávnění najdete v dokumentaci k Androidu.
- Nebezpečná oprávnění – na rozdíl od normálních oprávnění jsou nebezpečná oprávnění ta, která chrání zabezpečení nebo ochranu osobních údajů uživatele. Musí je explicitně udělit uživatel. Odeslání nebo přijetí zprávy SMS je příkladem akce vyžadující nebezpečné oprávnění.
Důležité
Kategorie, ke které oprávnění patří, se může v průběhu času měnit. Je možné, že oprávnění, která byla zařazena do kategorie "normální" oprávnění, může být zvýšena v budoucích úrovních rozhraní API na nebezpečné oprávnění.
Nebezpečná oprávnění jsou dále rozdělena do skupin oprávnění. Skupina oprávnění bude obsahovat oprávnění, která jsou logicky spojená. Když uživatel udělí oprávnění jednomu členu skupiny oprávnění, Android automaticky udělí oprávnění všem členům této skupiny. Skupina oprávnění například STORAGE
obsahuje WRITE_EXTERNAL_STORAGE
oprávnění i READ_EXTERNAL_STORAGE
oprávnění. Pokud uživatel udělí oprávnění READ_EXTERNAL_STORAGE
, WRITE_EXTERNAL_STORAGE
oprávnění se automaticky udělí současně.
Před vyžádáním jednoho nebo více oprávnění je osvědčeným postupem poskytnout odůvodnění, proč aplikace před vyžádáním oprávnění vyžaduje oprávnění. Jakmile uživatel pochopí odůvodnění, může aplikace požádat o oprávnění od uživatele. Pochopením odůvodnění může uživatel učinit informované rozhodnutí, pokud chce udělit oprávnění, a pochopit důsledky, pokud ne.
Celý pracovní postup kontroly a žádosti o oprávnění se označuje jako kontrola oprávnění za běhu a dá se shrnout v následujícím diagramu:
Knihovna podpory Pro Android backportuje některá nová rozhraní API pro oprávnění ke starším verzím Androidu. Tato backportovaná rozhraní API automaticky kontrolují verzi Androidu na zařízení, takže není nutné pokaždé provést kontrolu na úrovni rozhraní API.
Tento dokument popisuje, jak přidat oprávnění k aplikaci Xamarin.Android a jak aplikace, které cílí na Android 6.0 (úroveň rozhraní API 23) nebo vyšší, by měly provádět kontrolu oprávnění za běhu.
Poznámka:
Je možné, že oprávnění k hardwaru můžou ovlivnit filtrování aplikace službou Google Play. Pokud například aplikace vyžaduje oprávnění k fotoaparátu, google Play aplikaci na zařízení, které nemá nainstalovanou kameru, nezobrazí aplikaci v Obchodě Google Play.
Požadavky
Důrazně doporučujeme, aby projekty Xamarin.Android zahrnovaly balíček NuGet Xamarin.Android.Support.Compat . Tento balíček backportuje rozhraní API specifická pro oprávnění ke starším verzím Androidu a poskytne jedno společné rozhraní, aniž by bylo nutné neustále kontrolovat verzi Androidu, na které aplikace běží.
Vyžádání systémových oprávnění
Prvním krokem při práci s oprávněními Androidu je deklarování oprávnění v souboru manifestu Androidu. To se musí provést bez ohledu na úroveň rozhraní API, na kterou aplikace cílí.
Aplikace, které cílí na Android 6.0 nebo vyšší, nemohou předpokládat, že protože uživatel udělil oprávnění v určitém okamžiku v minulosti, že oprávnění bude při příštím spuštění platné. Aplikace, která cílí na Android 6.0, musí vždy provést kontrolu oprávnění modulu runtime. Aplikace, které cílí na Android 5.1 nebo nižší, nemusí provádět kontrolu oprávnění za běhu.
Poznámka:
Aplikace by měly požadovat pouze oprávnění, která vyžadují.
Deklarace oprávnění v manifestu
Oprávnění se přidají do AndroidManifest.xml s prvkem uses-permission
. Pokud například aplikace vyhledá pozici zařízení, vyžaduje oprávnění k přesné poloze a umístění kurzu. Do manifestu jsou přidány následující dva prvky:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Oprávnění je možné deklarovat pomocí podpory nástrojů integrované v sadě Visual Studio:
Poklikejte na vlastnosti v Průzkumník řešení a v okno Vlastnosti vyberte kartu Manifest androidu:
Pokud aplikace ještě nemá AndroidManifest.xml, klikněte na tlačítko Ne AndroidManifest.xml nalezeno. Kliknutím přidáte jednu, jak je znázorněno níže:
V seznamu Požadovaných oprávnění vyberte všechna oprávnění, která vaše aplikace potřebuje, a uložte:
Xamarin.Android automaticky přidá některá oprávnění v době sestavení k ladění sestavení. To usnadní ladění aplikace. Zejména dvě důležité oprávnění jsou INTERNET
a READ_EXTERNAL_STORAGE
. V seznamu Požadovaných oprávnění se tato automaticky nastavená oprávnění nezobrazí. Sestavení vydaných verzí však používají pouze oprávnění, která jsou explicitně nastavena v seznamu Požadovaná oprávnění .
U aplikací, které cílí na Android 5.1 (úroveň rozhraní API 22) nebo nižší, není potřeba dělat nic dalšího. Aplikace, které budou běžet na Androidu 6.0 (rozhraní API 23 úrovně 23) nebo vyšší, by měly pokračovat k další části o provádění kontrol oprávnění za běhu.
Kontroly oprávnění modulu runtime v Androidu 6.0
Metoda ContextCompat.CheckSelfPermission
(dostupná v knihovně podpory Androidu) slouží ke kontrole, jestli bylo uděleno konkrétní oprávnění. Tato metoda vrátí Android.Content.PM.Permission
výčet, který má jednu ze dvou hodnot:
Permission.Granted
– Zadané oprávnění bylo uděleno.Permission.Denied
– Zadané oprávnění nebylo uděleno.
Tento fragment kódu je příkladem kontroly oprávnění Kamera v aktivitě:
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) == (int)Permission.Granted)
{
// We have permission, go ahead and use the camera.
}
else
{
// Camera permission is not granted. If necessary display rationale & request.
}
Osvědčeným postupem je informovat uživatele o tom, proč je oprávnění nezbytné pro aplikaci, aby bylo možné informované rozhodnutí udělit oprávnění. Příkladem by byla aplikace, která chytá fotky a geografické značky. Uživateli je jasné, že oprávnění fotoaparátu je nezbytné, ale nemusí být jasné, proč aplikace potřebuje také umístění zařízení. Zdůvodnění by mělo zobrazit zprávu, která uživateli pomůže pochopit, proč je žádoucí oprávnění k poloze a že je vyžadováno oprávnění kamery.
Metoda ActivityCompat.ShouldShowRequestPermissionRationale
se používá k určení, jestli se má uživateli zobrazit odůvodnění. Tato metoda vrátí true
, pokud se má zobrazit odůvodnění daného oprávnění. Tento snímek obrazovky ukazuje příklad snackbaru zobrazeného aplikací, která vysvětluje, proč aplikace potřebuje znát umístění zařízení:
Pokud uživatel udělí oprávnění, ActivityCompat.RequestPermissions(Activity activity, string[] permissions, int requestCode)
měla by být volána metoda. Tato metoda vyžaduje následující parametry:
- activity – Jedná se o aktivitu , která žádá o oprávnění a je informována Androidem o výsledcích.
- oprávnění – seznam požadovaných oprávnění.
- requestCode – celočíselná hodnota, která se používá ke spárování výsledků žádosti o oprávnění k
RequestPermissions
volání. Tato hodnota by měla být větší než nula.
Tento fragment kódu je příkladem dvou metod, které byly popsány. Nejprve zkontrolujete, jestli se má zobrazit odůvodnění oprávnění. Pokud se má odůvodnění zobrazit, zobrazí se snackbar s odůvodněním. Pokud uživatel klikne na OK na snackbaru, aplikace požádá o oprávnění. Pokud uživatel neakceptuje odůvodnění, neměl by aplikace pokračovat v vyžádání oprávnění. Pokud se odůvodnění nezobrazí, aktivita požádá o oprávnění:
if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.AccessFineLocation))
{
// Provide an additional rationale to the user if the permission was not granted
// and the user would benefit from additional context for the use of the permission.
// For example if the user has previously denied the permission.
Log.Info(TAG, "Displaying camera permission rationale to provide additional context.");
var requiredPermissions = new String[] { Manifest.Permission.AccessFineLocation };
Snackbar.Make(layout,
Resource.String.permission_location_rationale,
Snackbar.LengthIndefinite)
.SetAction(Resource.String.ok,
new Action<View>(delegate(View obj) {
ActivityCompat.RequestPermissions(this, requiredPermissions, REQUEST_LOCATION);
}
)
).Show();
}
else
{
ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.Camera }, REQUEST_LOCATION);
}
RequestPermission
lze volat i v případě, že uživatel již udělil oprávnění. Další volání nejsou nutná, ale poskytují uživateli možnost potvrdit (nebo odvolat) oprávnění. Při RequestPermission
zavolání se ovládací prvek předá operačnímu systému, který zobrazí uživatelské rozhraní pro přijetí oprávnění:
Po dokončení uživatele Android vrátí výsledky do aktivity metodou zpětného volání . OnRequestPermissionResult
Tato metoda je součástí rozhraní ActivityCompat.IOnRequestPermissionsResultCallback
, které musí být implementováno aktivitou. Toto rozhraní má jednu metodu, OnRequestPermissionsResult
která bude vyvolána Androidem, aby informovala aktivitu o možnostech uživatele. Pokud uživatel udělil oprávnění, může aplikace pokračovat a používat chráněný prostředek. Příklad implementace OnRequestPermissionResult
je uvedený níže:
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
{
if (requestCode == REQUEST_LOCATION)
{
// Received permission result for camera permission.
Log.Info(TAG, "Received response for Location permission request.");
// Check if the only required permission has been granted
if ((grantResults.Length == 1) && (grantResults[0] == Permission.Granted)) {
// Location permission has been granted, okay to retrieve the location of the device.
Log.Info(TAG, "Location permission has now been granted.");
Snackbar.Make(layout, Resource.String.permission_available_camera, Snackbar.LengthShort).Show();
}
else
{
Log.Info(TAG, "Location permission was NOT granted.");
Snackbar.Make(layout, Resource.String.permissions_not_granted, Snackbar.LengthShort).Show();
}
}
else
{
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
Shrnutí
Tato příručka popisuje, jak přidat a zkontrolovat oprávnění v zařízení s Androidem. Rozdíly v tom, jak fungují oprávnění mezi starými aplikacemi pro Android (úroveň < 23 rozhraní API) a novými aplikacemi pro Android (úroveň > 22 rozhraní API). Popisuje, jak provádět kontroly oprávnění za běhu v Androidu 6.0.