Share via


Xamarin.Essentials:Izin

permissions sınıfı, çalışma zamanı izinlerini denetleme ve isteme olanağı sağlar.

Kullanmaya başlayın

Bu API'yi kullanmaya başlamak için kitaplığın projelerinizde düzgün yüklendiğinden ve ayarlandığından emin olmak için Xamarin.Essentials kullanmaya başlama kılavuzunu okuyun.

Bu API, Android'de çalışma zamanı izinlerini kullanır. Lütfen tam olarak başlatıldığından Xamarin.Essentials ve uygulamanızda izin işlemenin ayarlandığından emin olun.

Android projesinde MainLauncher veya başlatılan Xamarin.Essentials herhangi bir Activity proje yönteminde OnCreate 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'de çalışma zamanı izinlerini işlemek için herhangi Xamarin.Essentials bir OnRequestPermissionsResultalmalıdır. 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);
}

İzinleri Kullanma

Sınıfınızda için Xamarin.Essentials bir başvuru ekleyin:

using Xamarin.Essentials;

İzinleri Denetleme

bir iznin geçerli durumunu denetlemek için, durumunu almak için belirli izinle birlikte yöntemini kullanın CheckStatusAsync .

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

Gerekli izin bildirilmemişse bir PermissionException oluşturulur.

İstekte bulunmadan önce iznin durumunu denetlemek en iyisidir. Kullanıcıdan hiç sorulmazsa her işletim sistemi farklı bir varsayılan durum döndürür. iOS döndürürken Unknown, diğerleri döndürür Denied. Durum böyleyse Granted başka aramalar yapmanıza gerek yoktur. iOS'ta durum böyleyse Denied , kullanıcıdan ayarlardaki izni değiştirmesini istemeniz gerekir ve Android'de, kullanıcının geçmişte izni zaten reddedip reddetmediğini algılamak için arayabilirsiniz ShouldShowRationale .

İzin İsteme

Kullanıcılardan izin istemek için, isteğin RequestAsync belirli izniyle birlikte yöntemini kullanın. Kullanıcı daha önce izin verdiyse ve iptal etmediyse, bu yöntem hemen döner Granted ve bir iletişim kutusu görüntülemez.

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

Gerekli izin bildirilmemişse bir PermissionException oluşturulur.

Bazı platformlarda bir izin isteğinin yalnızca tek bir kez etkinleştirilebileceğini unutmayın. Bir iznin Denied durumunda olup olmadığını denetlemek ve kullanıcıdan bunu el ile açmasını istemek için geliştirici tarafından başka istemler işlenmelidir.

İzin Durumu

veya kullanırken CheckStatusAsyncRequestAsync , sonraki adımları belirlemek için kullanılabilecek bir PermissionStatus döndürülür:

  • Bilinmiyor - İzin bilinmeyen bir durumda
  • Reddedildi - Kullanıcı izin isteğini reddetti
  • Devre dışı - Özellik cihazda devre dışı bırakıldı
  • Verildi - Kullanıcıya izin verildi veya otomatik olarak verildi
  • Kısıtlı - Kısıtlı durumda

İznin neden gerekli olduğunu açıklama

Uygulamanızın neden belirli bir izne ihtiyacı olduğunu açıklamak en iyi yöntemdir. iOS'ta kullanıcıya görüntülenecek bir dize belirtmeniz gerekir. Android'in bu özelliği yoktur ve ayrıca izin durumunu Devre Dışı olarak varsayılan olarak kullanır. Bu, kullanıcının izni reddedip reddetmediğini veya kullanıcıdan ilk kez isteyip istemediğini anlama becerisini sınırlar. ShouldShowRationale yöntemi, bir eğitim kullanıcı arabiriminin görüntülenip görüntülenmediğini belirlemek için kullanılabilir. Yöntemin döndürmesinin true nedeni, kullanıcının geçmişte izni reddetmesi veya devre dışı bırakmış olmasıdır. Bu yöntem çağrılırken diğer platformlar her zaman döndürülecektir false .

Kullanılabilir İzinler

Xamarin.Essentials mümkün olduğunca çok izni soyutlama girişiminde bulunur. 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ıklar vardır. Şu anda kullanılabilir izinler için bir kılavuz aşağıdadır:

Simge Kılavuzu:

  • Full Support -Desteklenen
  • Not Supported - Desteklenmiyor/gerekli
İzin Android iOS UWP watchOS tvOS Tizen
CalendarRead Android supported iOS supported UWP not supported watchOS supported tvOS not supported Tizen not supported
Takvim Yaz 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
KişilerRead Android supported iOS supported UWP supported watchOS not supported tvOS not supported Tizen not supported
Kişiler Yazma Android supported iOS supported UWP supported watchOS not supported tvOS not supported Tizen not supported
El Feneri Android supported iOS not supported UWP not supported watchOS not supported tvOS not supported Tizen supported
LocationWhenInUse 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
Medya 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
Phone Android supported iOS supported UWP not supported watchOS not supported tvOS not supported Tizen not supported
Fotoğraflar Android not supported iOS supported UWP not supported watchOS not supported tvOS supported Tizen not supported
Anımsatıcılar Android not supported iOS supported UWP not supported watchOS supported tvOS not supported Tizen not supported
Algılayıcılar 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
Konuşma Android supported iOS supported UWP not supported watchOS not supported tvOS not supported Tizen not supported
Depolama Read Android supported iOS not supported UWP not supported watchOS not supported tvOS not supported Tizen not supported
Depolama Write Android supported iOS not supported UWP not supported watchOS not supported tvOS not supported Tizen not supported

İzin olarak not supported işaretlenirse, her zaman işaretlendiğinde veya istendiğinde döndürülecektir Granted .

Genel Kullanım

Aşağıdaki kod, bir iznin verilip verilmediğini belirlemek için genel kullanım desenini sunar ve verilmemişse istekte bulunur. Bu kod, sürüm 1.6.0 veya üzeri ile Xamarin.Essentials 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ılabileceği 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;
}

İzinleri Genişletme

İzinler API'si, içinde olmayan Xamarin.Essentialsek doğrulama veya izinler gerektiren uygulamalar için esnek ve genişletilebilir olacak şekilde oluşturulmuştur. öğesinden BasePermission devralan yeni bir sınıf oluşturun ve gerekli soyut yöntemleri uygulayın.

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 uygulanırken sınıfı BasePlatformPermission öğesinden devralınabilir. Bu, bildirimleri otomatik olarak denetlemek için ek platform yardımcı yöntemleri sağlar. Bu, gruplandırmalar için özel izinler oluştururken yardımcı olabilir. Örneğin, aşağıdaki özel izni kullanarak Android'de depolamaya 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();
}

Ardından Android projesinden yeni izninizi çağırabilirsiniz.

await Permissions.RequestAsync<ReadWriteStoragePermission>();

Bu API'yi paylaşılan kodunuzdan çağırmak isterseniz bir arabirim oluşturabilir ve bir bağımlılık hizmeti kullanarak kaydolabilir ve uygulamayı alabilirsiniz.

public interface IReadWritePermission
{        
    Task<PermissionStatus> CheckStatusAsync();
    Task<PermissionStatus> RequestAsync();
}

Ardından platform projenizde arabirimini 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 çö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 ayarlanmış eşleşen özniteliklere sahip olmalıdır. İzin durumu varsayılan olarak Reddedildi olarak değişir.

Xamarin.Android'de İzinler belgeleri hakkında daha fazla bilgi edinin.

API

Channel 9 ve YouTube'da daha fazla Xamarin videosu bulun.