Xamarin.Android'de İzinler
Genel bakış
Android uygulamaları kendi korumalı alanında çalışır ve güvenlik nedeniyle cihazdaki belirli sistem kaynaklarına veya donanıma erişimi yoktur. Kullanıcının bu kaynakları kullanabilmesi için uygulamaya açıkça izin vermesi gerekir. Örneğin, bir uygulama kullanıcının açık izni olmadan cihazda GPS'e erişemez. Android, bir uygulama korumalı bir kaynağa izinsiz erişmeye çalışırsa bir oluşturur Java.Lang.SecurityException
.
İzinler, uygulama geliştirildiğinde uygulama geliştiricisi tarafından AndroidManifest.xml bildirilir. Android'in bu izinler için kullanıcının onayını almak için iki farklı iş akışı vardır:
- Android 5.1 (API düzeyi 22) veya daha düşük sürümü hedefleyen uygulamalar için, izin isteği uygulama yüklendiğinde oluştu. Kullanıcı izinleri vermemişse uygulama yüklenmez. Uygulama yüklendikten sonra, uygulamayı kaldırmak dışında izinleri iptal etmenin bir yolu yoktur.
- Android 6.0'dan (API düzeyi 23) başlayarak kullanıcılara izinler üzerinde daha fazla denetim verildi; uygulama cihazda yüklü olduğu sürece izinleri verebilir veya iptal edebilir. Bu ekran görüntüsü, Google Kişiler uygulamasının izin ayarlarını gösterir. Çeşitli izinleri listeler ve kullanıcının izinleri etkinleştirmesine veya devre dışı bırakmasına izin verir:
Android uygulamalarının korumalı bir kaynağa erişim izni olup olmadığını görmek için çalışma zamanında denetlemesi gerekir. Uygulamanın izni yoksa, kullanıcının izinleri vermesi için Android SDK tarafından sağlanan yeni API'leri kullanarak istekte bulunması gerekir. İzinler iki kategoriye ayrılır:
- Normal İzinler – Bunlar, kullanıcının güvenliği veya gizliliği için çok az güvenlik riski oluşturan izinlerdir. Android 6.0, yükleme sırasında otomatik olarak normal izinler verir. Normal izinlerin tam listesi için lütfen Android belgelerine bakın.
- Tehlikeli İzinler – Normal izinlerin aksine, tehlikeli izinler kullanıcının güvenliğini veya gizliliğini koruyan izinlerdir. Bunlar kullanıcı tarafından açıkça verilmelidir. SMS iletisi göndermek veya almak, tehlikeli bir izin gerektiren bir eyleme örnektir.
Önemli
bir iznin ait olduğu kategori zaman içinde değişebilir. "Normal" izin olarak kategorilere ayrılmış bir izin, gelecekteki API düzeylerinde tehlikeli bir izne yükseltilebilir.
Tehlikeli izinler, izin gruplarına daha da alt bölümlere ayrılır. İzin grubu, mantıksal olarak ilişkili izinleri barındırır. Kullanıcı bir izin grubunun bir üyesine izin verdiğinde, Android bu grubun tüm üyelerine otomatik olarak izin verir. Örneğin, STORAGE
izin grubu hem hem READ_EXTERNAL_STORAGE
de WRITE_EXTERNAL_STORAGE
izinlerini barındırıyor. Kullanıcı için READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
izin verirse, izin aynı anda otomatik olarak verilir.
Bir veya daha fazla izin istemeden önce, uygulamanın izin istemeden önce neden izin gerektirdiğine ilişkin bir gerekçe sağlamak en iyi yöntemdir. Kullanıcı rasyonaliteyi anladıktan sonra uygulama kullanıcıdan izin isteyebilir. Rasyonaliteyi anlayarak, kullanıcı izni vermek isterse bilinçli bir karar verebilir ve vermezse sonuçları anlayabilir.
İzinleri denetleme ve isteme iş akışının tamamı çalışma zamanı izinleri denetimi olarak bilinir ve aşağıdaki diyagramda özetlenebilir:
Android Destek Kitaplığı, Android'in eski sürümlerine yönelik izinler için bazı yeni API'leri destekler. Bu geri aktarılan API'ler cihazdaki Android sürümünü otomatik olarak denetler, bu nedenle her seferinde API düzeyi denetimi yapılması gerekmez.
Bu belgede, Xamarin.Android uygulamasına nasıl izin ekleneceği ve Android 6.0 (API düzeyi 23) veya üstünü hedefleyen uygulamaların çalışma zamanı izin denetimi gerçekleştirmesi gerekir.
Not
Donanım izinleri, uygulamanın Google Play tarafından nasıl filtrelendiğini etkileyebilir. Örneğin, uygulama kamera için izin gerektiriyorsa, Google Play uygulamayı Kamera yüklü olmayan bir cihazda Google Play Store'da göstermez.
Gereksinimler
Xamarin.Android projelerinin Xamarin.Android.Support.Compat NuGet paketini içermesi kesinlikle önerilir. Bu paket izine özgü API'leri Android'in eski sürümlerine geri aktarır ve uygulamanın üzerinde çalıştığı Android sürümünü sürekli denetlemeye gerek kalmadan tek bir ortak arabirim sağlar.
Sistem İzinleri İsteme
Android izinleriyle çalışmanın ilk adımı, Android bildirim dosyasındaki izinleri bildirmektir. Bu, uygulamanın hedeflediğini API düzeyinden bağımsız olarak yapılmalıdır.
Android 6.0 veya üzerini hedefleyen uygulamalar, kullanıcı geçmişte bir noktada izin verdiğinden, iznin bir sonraki sefer geçerli olacağını varsayamaz. Android 6.0'a yönelik bir uygulamanın her zaman çalışma zamanı izin denetimi gerçekleştirmesi gerekir. Android 5.1 veya üzerini hedefleyen uygulamaların çalışma zamanı izin denetimi gerçekleştirmesi gerekmez.
Not
Uygulamalar yalnızca ihtiyaç duydukları izinleri istemelidir.
Bildirimde İzinleri Bildirme
İzinler öğesiyle uses-permission
AndroidManifest.xml eklenir. Örneğin, bir uygulama cihazın konumunu bulmak için ince ve kurs konumu izinleri gerektirir. Bildirime aşağıdaki iki öğe eklenir:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Visual Studio'da yerleşik olarak bulunan araç desteğini kullanarak izinleri bildirmek mümkündür:
Çözüm Gezgini Özellikler'e çift tıklayın ve Özellikler penceresi Android Bildirimi sekmesini seçin:
Uygulamanın bir AndroidManifest.xml yoksa, AndroidManifest.xml bulunamadı'ya tıklayın . Aşağıda gösterildiği gibi eklemek için tıklayın:
Gerekli izinler listesinden uygulamanızın ihtiyaç duyduğu izinleri seçin ve kaydedin:
Xamarin.Android derleme hatalarını ayıklamak için derleme zamanında otomatik olarak bazı izinler ekler. Bu, uygulamada hata ayıklamayı kolaylaştırır. Özellikle, iki önemli izin ve READ_EXTERNAL_STORAGE
'tirINTERNET
. Otomatik olarak ayarlanan bu izinler Gerekli izinler listesinde etkinleştirilmemiş gibi görünür. Ancak yayın derlemeleri, yalnızca Gerekli izinler listesinde açıkça ayarlanan izinleri kullanır.
Android 5.1 (API düzeyi 22) veya daha düşük olan uygulamalar için yapılması gereken başka bir şey yoktur. Android 6.0 (API 23 düzey 23) veya üzeri sürümlerde çalışacak uygulamalar, çalışma zamanı izin denetimlerinin nasıl gerçekleştirileceğine ilişkin sonraki bölüme geçmelidir.
Android 6.0'da Çalışma Zamanı İzin Denetimleri
Yöntemi ContextCompat.CheckSelfPermission
(Android Destek Kitaplığı ile kullanılabilir) belirli bir izin verilip verilmediğini denetlemek için kullanılır. Bu yöntem, iki değerden birine sahip bir Android.Content.PM.Permission
sabit listesi döndürür:
Permission.Granted
– Belirtilen izin verildi.Permission.Denied
– Belirtilen izin verilmedi.
Bu kod parçacığı, bir Etkinlikte Kamera iznini denetlemeye yönelik bir örnektir:
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.
}
İzin vermek için bilinçli bir karar verebilmek için kullanıcıyı bir uygulama için neden izin gerekli olduğu konusunda bilgilendirmek en iyi yöntemdir. Bunun bir örneği, fotoğrafları alan ve coğrafi olarak etiketleyen bir uygulama olabilir. Kullanıcıya kamera izninin gerekli olduğu açıktır, ancak uygulamanın neden cihazın konumuna da ihtiyaç duyduğu net olmayabilir. Rasyonalite, kullanıcının konum izninin neden istendiğini ve kamera izninin gerekli olduğunu anlamasına yardımcı olacak bir ileti görüntülemelidir.
ActivityCompat.ShouldShowRequestPermissionRationale
yöntemi, rasyonalitenin kullanıcıya gösterilip gösterilmeyeceğini belirlemek için kullanılır. Belirli bir izin için rasyonalitenin görüntülenmesi gerekiyorsa bu yöntem döndürülecektir true
. Bu ekran görüntüsünde, uygulamanın neden cihazın konumunu bilmesi gerektiğini açıklayan bir Snackbar örneği gösterilmektedir:
Kullanıcı izin verirse yöntemi ActivityCompat.RequestPermissions(Activity activity, string[] permissions, int requestCode)
çağrılmalıdır. Bu yöntem aşağıdaki parametreleri gerektirir:
- activity – Bu, izinleri isteyen ve Android tarafından sonuçlar hakkında bilgilendirilecek etkinliktir.
- permissions : İstenen izinlerin listesi.
- requestCode : İzin isteğinin sonuçlarını bir çağrıyla eşleştirmek için kullanılan bir
RequestPermissions
tamsayı değeri. Bu değer sıfırdan büyük olmalıdır.
Bu kod parçacığı, ele alınan iki yönteme bir örnektir. İlk olarak, izin mantığının gösterilip gösterilmeyeceğini belirlemek için bir denetim yapılır. Rasyonalite gösterilecekse, rasyonalite ile birlikte bir Snackbar görüntülenir. Kullanıcı Snackbar'da Tamam'a tıklarsa uygulama izinleri ister. Kullanıcı rasyonaliteyi kabul etmiyorsa, uygulama izin istemeye devam etmemelidir. Rasyonalite gösterilmiyorsa, Etkinlik şu izni isteyecektir:
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
kullanıcı zaten izin vermiş olsa bile çağrılabilir. Sonraki çağrılar gerekli değildir, ancak kullanıcıya izni onaylama (veya iptal etme) fırsatı sağlar. Çağrıldığında RequestPermission
, denetim işletim sistemine devredilir ve bu da izinleri kabul etmek için bir kullanıcı arabirimi görüntüler:
Kullanıcı tamamlandıktan sonra, Android sonuçları bir geri çağırma yöntemiyle OnRequestPermissionResult
Etkinlik'e döndürür. Bu yöntem, Activity tarafından uygulanması gereken arabirimin ActivityCompat.IOnRequestPermissionsResultCallback
bir parçasıdır. Bu arabirimin tek bir yöntemi vardır. OnRequestPermissionsResult
Bu yöntem, Kullanıcının seçimlerini Etkinlik'e bildirmek için Android tarafından çağrılacaktır. Kullanıcı izin verdiyse uygulama devam edebilir ve korumalı kaynağı kullanabilir. Uygulama örneği OnRequestPermissionResult
aşağıda gösterilmiştir:
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);
}
}
Özet
Bu kılavuzda, Bir Android cihazında izinleri ekleme ve denetleme işlemleri açıklanmaktadır. Eski Android uygulamaları (API düzeyi 23) ile yeni Android uygulamaları (API düzeyi < 22) arasındaki izinlerin çalışma şekli > arasındaki farklar. Android 6.0'da çalışma zamanı izin denetimlerinin nasıl gerçekleştirileceğini anlatıldı.