Xamarin.Essentials: İzinler
İzinler sınıfı, çalışma zamanı izinlerini denetleme ve isteme özelliğini sağlar.
başlarken
Bu API 'yi kullanmaya başlamak için, kitaplığın projelerinizde düzgün bir şekilde yüklendiğinden ve ayarlandığından emin olmak için Başlarken Kılavuzunu okuyun.
Bu API, Android üzerinde çalışma zamanı izinlerini kullanır. Lütfen Xamarin.Essentials uygulamanızın tam olarak başlatılmış ve izin işlemenin uygulamanızda ayarlandığından emin olun.
Android projesinde MainLauncher veya başlatılan ' de, ActivityXamarin.EssentialsOnCreate yönteminde başlatılmalıdır:
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
//...
}
Android üzerinde çalışma zamanı izinlerini işlemek için Xamarin.Essentials herhangi bir almalıdır OnRequestPermissionsResult . Aşağıdaki kodu tüm Activity sınıflara ekleyin:
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);
}
Izinleri kullanma
Sınıfınıza bir başvuru ekleyin Xamarin.Essentials :
using Xamarin.Essentials;
Izinler denetleniyor
Bir iznin geçerli durumunu denetlemek için, CheckStatusAsync durumunu almak üzere belirli bir izinle birlikte yöntemi kullanın.
var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
PermissionExceptionGerekli izin bildirilmemiş ise oluşturulur.
İznin istenmeden önce durumunu denetlemesi en iyisidir. Kullanıcıya hiç istem yoksa, her işletim sistemi farklı bir varsayılan durum döndürür. iOS geri Unknown dönirken diğerleri döndürülür Denied . Durum Granted daha sonra, başka çağrılar yapmaya gerek yoktur. İOS 'ta, bu durum, Denied kullanıcının ShouldShowRationale geçmişte izin daha önce reddetmiş olup olmadığını algılamak için çağrıp ayarlar ve Android üzerinde izni değiştirmesini istebilmelisiniz.
İzin İsteme
Kullanıcılardan izin istemek için, RequestAsync yöntemini istemek üzere belirli bir izinle birlikte kullanın. Kullanıcı daha önce izin vermiş ve iptal edilmediği takdirde, bu yöntem Granted hemen döndürülür ve bir iletişim kutusu görüntülemez.
var status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
PermissionExceptionGerekli izin bildirilmemiş ise oluşturulur.
Bazı platformlarda izin isteği yalnızca tek bir kez etkinleştiribileceğine ilişkin unutmayın. Başka istemler, bir iznin durumunda olup olmadığını kontrol etmek Denied ve kullanıcıdan el ile açıp istememesini istemek için geliştirici tarafından işlenmelidir.
İzin durumu
Veya kullanıldığında CheckStatusAsyncRequestAsyncPermissionStatus , sonraki adımları belirlemede kullanılabilecek bir döndürülür:
- Bilinmiyor-izin bilinmeyen bir durumda
- Reddedildi-kullanıcı izin isteğini reddetti
- Devre dışı-Bu özellik cihazda devre dışı bırakıldı
- Verildi-kullanıcıya izin verildi veya otomatik olarak izin verildi
- Kısıtlı durumda kısıtlanmış
Iznin neden gerekli olduğunu açıklayın
Uygulamanızın neden belirli bir izne ihtiyacı olduğunu açıklamak en iyi uygulamadır. İOS 'ta, kullanıcıya görüntülenen bir dize belirtmeniz gerekir. Android bu becerisine sahip değildir ve ayrıca varsayılan izin durumunu devre dışı olarak ayarlar. Bu, kullanıcının izni reddetmesinin veya ilk kez kullanıcıya sormasına ilişkin olduğunu bilme özelliğini kısıtlar. ShouldShowRationaleYöntemi, eğitim Kullanıcı arabiriminin görüntülenip görüntülenmediğini anlamak için kullanılabilir. Yöntem bunu döndürürse, true kullanıcının geçmişte izin reddetmiş veya devre dışı bırakıldığı için. Bu yöntem çağrılırken, diğer platformlar her zaman döndürülür false .
Kullanılabilir Izinler
Xamarin.Essentials mümkün olduğunca çok sayıda izin soyut olarak çalışır. Ancak, her işletim sisteminin farklı bir çalışma zamanı izinleri kümesi vardır. Ayrıca, bazı izinler için tek bir API sağlarken farklılık vardır. Şu anda kullanılabilir izinlere yönelik bir kılavuz aşağıda verilmiştir:
Simge Kılavuzu:
- Tam destek
destek-desteklenir
değildir-desteklenmez/gerekli değildir
| İzin | Android | iOS | UWP | watchOS | tvOS | Tizen |
|---|---|---|---|---|---|---|
| CalendarRead | Desteklenen desteklenen |
desteklenen desteklenen |
![]() |
desteklenen |
desteklenmeyen |
desteklenmeyen |
| CalendarWrite | Desteklenen desteklenen |
desteklenen desteklenen |
![]() |
desteklenen |
desteklenmeyen |
desteklenmeyen |
| Kamera | Desteklenen desteklenen |
desteklenen desteklenen |
![]() |
![]() |
desteklenmeyen |
![]() |
| ContactsRead | Desteklenen desteklenen |
desteklenen desteklenen |
![]() |
![]() |
desteklenmeyen |
desteklenmeyen |
| ContactsWrite | Desteklenen desteklenen |
desteklenen desteklenen |
![]() |
![]() |
desteklenmeyen |
desteklenmeyen |
| El Feneri | Desteklenen desteklenen |
![]() |
![]() |
![]() |
desteklenmeyen |
![]() |
| Locationwhenınuse | Desteklenen desteklenen |
desteklenen desteklenen |
![]() |
desteklenen |
desteklenen |
![]() |
| LocationAlways | Desteklenen desteklenen |
desteklenen desteklenen |
![]() |
desteklenen |
desteklenmeyen |
![]() |
| Medya | ![]() |
desteklenen desteklenen |
![]() |
![]() |
desteklenmeyen |
desteklenmeyen |
| Mikrofon | Desteklenen desteklenen |
desteklenen desteklenen |
![]() |
![]() |
desteklenmeyen |
![]() |
| Telefon | Desteklenen desteklenen |
desteklenen desteklenen |
![]() |
![]() |
desteklenmeyen |
desteklenmeyen |
| Fotoğraflar | ![]() |
desteklenen desteklenen |
![]() |
![]() |
desteklenen |
desteklenmeyen |
| Anımsatıcılar | ![]() |
desteklenen desteklenen |
![]() |
desteklenen |
desteklenmeyen |
desteklenmeyen |
| Sensörlerden | Desteklenen desteklenen |
desteklenen desteklenen |
![]() |
desteklenen |
desteklenmeyen |
desteklenmeyen |
| Kısa | Desteklenen desteklenen |
desteklenen desteklenen |
![]() |
![]() |
desteklenmeyen |
desteklenmeyen |
| Konuşma | Desteklenen desteklenen |
desteklenen desteklenen |
![]() |
![]() |
desteklenmeyen |
desteklenmeyen |
| StorageRead | Desteklenen desteklenen |
![]() |
![]() |
![]() |
desteklenmeyen |
desteklenmeyen |
| StorageWrite | Desteklenen desteklenen |
![]() |
![]() |
![]() |
desteklenmeyen |
desteklenmeyen |
İzin
desteklenmiyor olarak işaretlenmişse , her zaman
işaretlendiğinde veya istendiğinde döndürülür.
Genel kullanım
Aşağıdaki kod, bir iznin verilip verilmediğini belirlemek için genel kullanım modelini gösterir. Bu kod, Xamarin.Essentials Sürüm 1.6.0 veya sonrası ile kullanılabilen özellikleri kullanır.
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;
}
Her izin türü, yöntemlerin doğrudan çağrılabilecek şekilde oluşturulmuş bir örneğine sahip olabilir.
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;
}
Izinleri genişletme
Izinler API 'SI, ' de bulunmayan ek doğrulama veya izinler gerektiren uygulamalar için esnek ve genişletilebilir olacak şekilde oluşturulmuştur Xamarin.Essentials . ' Den devralan BasePermission ve gerekli soyut yöntemleri uygulayan yeni bir sınıf oluşturun.
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();
}
}
Belirli bir platformda bir izin uygularken, BasePlatformPermission sınıfı öğesinden devralınabilir. Bu, bildirimleri otomatik olarak denetlemek için ek platform Yardımcısı yöntemleri sağlar. Bu, gruplamaları yapan özel izinler oluştururken yardımcı olabilir. Örneğin, aşağıdaki özel izni kullanarak Android üzerinde depolama için hem okuma hem de yazma erişimi isteyebilirsiniz.
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();
}
Daha sonra, Android projesinden yeni izninizi çağırabilirsiniz.
await Permissions.RequestAsync<ReadWriteStoragePermission>();
Paylaşılan kodınızdan bu API 'yi çağırmak isterseniz, bir arabirim oluşturabilir ve uygulamayı kaydetmek ve almak için bir bağımlılık hizmeti kullanabilirsiniz.
public interface IReadWritePermission
{
Task<PermissionStatus> CheckStatusAsync();
Task<PermissionStatus> RequestAsync();
}
Daha sonra arabirimi platform projenizde uygulayın:
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();
}
Ardından, belirli bir uygulamayı kaydedebilirsiniz:
DependencyService.Register<IReadWritePermission, ReadWriteStoragePermission>();
Ardından, paylaşılan projenizden bunu çözümleyebilir ve kullanabilirsiniz:
var readWritePermission = DependencyService.Get<IReadWritePermission>();
var status = await readWritePermission.CheckStatusAsync();
if (status != PermissionStatus.Granted)
{
status = await readWritePermission.RequestAsync();
}
Platform uygulama özellikleri
İzinler, Android bildirim dosyasında eşleşen özniteliklerin ayarlanmış olmalıdır. İzin durumu varsayılan olarak reddedildi.
Xamarin. Android belgelerindeki izinlerle ilgili daha fazla bilgi edinin.
API
- Xamarin. Essentials /Permissions "Data-LinkType =" dış ">izinleri kaynak kodu
- İzin API 'SI belgeleri