Xamarin.Android'de İzinler
Genel Bakış
Android uygulamaları kendi korumalı alanda çalışır ve güvenlik nedeniyle cihaz üzerinde belirli sistem kaynaklarına veya donanıma erişimleri olmaz. Kullanıcının bu kaynakları kullanamadan önce uygulamaya açıkça izin verilmesi gerekir. Örneğin, bir uygulama kullanıcının açık izni olmadan bir cihaz üzerinde GPS'e erişemeden. Android, bir uygulama Java.Lang.SecurityException izin olmadan korumalı bir kaynağa erişmeye çalışırsa bir atar.
İzinler, uygulama AndroidManifest.xml uygulama geliştiricisi tarafından uygulamanın içinde bildiriliyor. Android, kullanıcının bu izinler için onay almak için iki farklı iş akışına sahip:
- Android 5.1 (API düzeyi 22) veya daha düşük bir sürümü hedef alan uygulamalar için, uygulama yüklenirken izin isteği oluştu. Kullanıcı izinleri verilmemişse uygulama yüklenmez. Uygulama yüklendikten sonra izinleri iptal etmek için uygulamayı kaldırmanız gerekir.
- Android 6.0'dan başlayarak (API düzeyi 23), kullanıcılara izinler üzerinde daha fazla denetim verildi; uygulama cihazda yüklü olduğu sürece izinler vere veya iptal edilebilir. 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ştirmesini veya devre dışı bırakmasını sağlar:

Android uygulamalarının korumalı bir kaynağa erişim izni olup olduklarını görmek için çalışma zamanında denetlemesi gerekir. Uygulamanın izni yoksa, kullanıcının izinler vermek için Android SDK api'leri kullanarak istekte olması 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 sağlar. Normal izinlerin tam listesi için lütfen Android belgelerine başvurun.
- Tehlikeli İzinler– Normal izinlerin aksine, tehlikeli izinler kullanıcının güvenliğini veya gizliliğini koruyan izinlerdir. Bunların kullanıcı tarafından açıkça verilmesi gerekir. SMS iletisi göndermek veya almak, tehlikeli 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 iznin gelecekteki API düzeylerinde tehlikeli bir izine yükseltmiş olması mümkündür.
Tehlikeli izinler, izin gruplarına daha fazla bölündü. İzin grubu, mantıksal olarak ilişkili izinleri tutar. Kullanıcı bir izin grubunun bir üyesine izin verdi mi, Android otomatik olarak o grubun tüm üyelerine izinler sağlar. Örneğin, izin STORAGE grubu hem hem de WRITE_EXTERNAL_STORAGE izinlerini READ_EXTERNAL_STORAGE tutar. Kullanıcı iznini READ_EXTERNAL_STORAGE verdiyse, WRITE_EXTERNAL_STORAGE bu izin aynı anda otomatik olarak yapılır.
Bir veya daha fazla izin isteğimeden önce, uygulamanın izin isteği öncesinde neden izin gerektirdiğine yönelik bir gerekçe sağlamak en iyi uygulamadır. Kullanıcı mantığı anlayacaktır, uygulama kullanıcıdan izin talep ediyor olabilir. Gerekçeyi an kullanarak, kullanıcı izin vermek ve izin vermese de bu kararı anlamak isteyen bilinçli bir karar ve ardından bu kararı alsa da anlayacaktır.
İzinleri denetleme ve istekte bulundurma iş akışının tamamı çalışma zamanı izin denetimi olarak bilinir ve aşağıdaki diyagramda özetlenebilir:
Android Destek Kitaplığı, android'in eski sürümlerine izinler için bazı yeni API'leri arkaportlar. Bu arka alan API'ler cihaz üzerinde Android sürümünü otomatik olarak kontrol eder, bu nedenle her zaman BIR API düzeyi denetimi yapmak gerekli değildir.
Bu belgede bir Xamarin.Android uygulamasına izin ekleme ve Android 6.0 (API düzeyi 23) veya daha yüksek bir sürümü hedef alan uygulamaların nasıl çalışma zamanı izin denetimi gerçekleştirmesi gerektiği ele alacaktır.
Not
Donanım izinleri, uygulamanın uygulamanın uygulamanıza göre filtrelenmiş Google Play. Örneğin, uygulama kamera için izin gerektiriyorsa, Google Play kamera yüklü Google Play Store cihazda uygulamayı uygulamada göstermez.
Gereksinimler
Xamarin.Android projelerinin Xamarin.Android.Support.Compat NuGet önerilir. Bu paket, izinlere özgü API'leri android'in eski sürümlerine geri teslim etmek için uygulamanın üzerinde çalıştır olduğu Android sürümünü sürekli denetlemeye gerek kalmadan ortak bir arabirim sağlar.
Sistem İzinleri İsteği
Android izinleri ile çalışmanın ilk adımı, android bildirim dosyasında izinleri bildirgedir. Bu, uygulamanın hedeflemektedir API düzeyinden bağımsız olarak yapılması gerekir.
Android 6.0 veya sonraki bir sürümü hedef alan uygulamalar, kullanıcıya geçmişte bir noktada izin verilmesi nedeniyle 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 daha düşük bir sürümü hedef alan uygulamaların çalışma zamanı izin denetimi gerçekleştirmesi gerekli değildir.
Not
Uygulamalar yalnızca gerekli izinleri talep edeler.
Bildirimde İzinleri Bildirime Bildirim
İzinler, öğesiyleAndroidManifest.xml öğesine 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" />
Aşağıdakiler gibi yerleşik araç desteğini kullanarak izinleri Visual Studio:
Çözüm Gezgini'deÖzellikler'e çift tıklayın ve Özellikler penceresi:
Uygulamada henüz bir uygulama yoksa, AndroidManifest.xml Bulunamadı'AndroidManifest.xml tıklayın. Aşağıda gösterildiği gibi bir tane eklemek için tıklayın:
Gerekli izinler listesinden uygulamanıza gereken izinleri seçin ve şunları kaydedin:
Xamarin.Android derlemelerde hata ayıklamaya derleme zamanında otomatik olarak bazı izinler ekler. Bu, uygulamada hata ayıklamayı kolaylaştırır. Özellikle ve olmak üzere dikkati gereken iki izin INTERNETREAD_EXTERNAL_STORAGE vardır. Bu otomatik olarak ayarlanmış izinler Gerekli izinler listesinde etkinleştirilmemiş gibi görünür. Ancak yayın derlemeleri yalnızca Gerekli izinler listesinde açıkça ayarlanmış izinleri kullanır.
Android 5.1(API düzeyi 22) veya daha düşük bir sürümü hedef alan uygulamalarda yapılması gereken başka bir şey yoktur. Android 6.0 (API 23 düzeyi 23) veya üzerinde çalıştıracak uygulamalar, çalışma zamanı izin denetimleri gerçekleştirmeye yönelik bir sonraki bölüme geçmektedir.
Android 6.0'da Çalışma Zamanı İzin Denetimleri
Yöntemi ContextCompat.CheckSelfPermission (Android Destek Kitaplığı ile birlikte kullanılabilir) belirli bir iznin verilmiş olup olduğunu kontrol etmek için kullanılır. Bu yöntem, iki Android.Content.PM.Permission değerden birini olan bir enum'u geri verir:
Permission.Granted– Belirtilen izin verildi.Permission.Denied– Belirtilen izin verilmedi.
Bu kod parçacığı, bir Etkinlikte Kamera iznini denetlemeye 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 verilmesi için bir uygulama için neden izin gerekli olduğu konusunda kullanıcıya bilgi vermek en iyi uygulamadır. Buna örnek olarak fotoğraf alan ve coğrafi etiketler alan bir uygulama olabilir. Kullanıcıya kamera izninin gerekli olduğu açıktır, ancak uygulamanın neden cihazın konumunun da gerekli olduğu net değildir. Gerekçe, kullanıcıya konum izninin neden istenebilir olduğunu ve kamera izninin gerekli olduğunu anlamada yardımcı olmak için bir ileti görüntülemeli.
yöntemi, ActivityCompat.ShouldShowRequestPermissionRationale gerekçenin kullanıcıya göster olup olmadığını belirlemek için kullanılır. Bu yöntem, true verilen bir iznin gerekçesi görüntüleniyorsa geri döner. Bu ekran görüntüsünde, uygulamanın cihazın konumunu neden bilmek zorunda olduğunu açıklayan bir uygulama tarafından görüntülenen BirBar örneği gösterilir:

Kullanıcı iznini verdiyse ActivityCompat.RequestPermissions(Activity activity, string[] permissions, int requestCode) yöntemi çağrılır. Bu yöntem aşağıdaki parametreleri gerektirir:
- activity– bu, izinleri istenen ve Android tarafından sonuçlar hakkında bilgi sahibi olunan etkinliktir.
- permissions: İstenen izinlerin listesi.
- Requestcode : bir çağrıya izin isteğinin sonuçlarını eşleştirmek için kullanılan bir tamsayı değeri . Bu değer sıfırdan büyük olmalıdır.
Bu kod parçacığı, ele alınan iki yöntemin bir örneğidir. İlk olarak, izin izinin gösterilip gösterilmeyeceğini belirlemekte bir denetim yapılır. Ktionale gösterilirse, daha sonra bir Snackbar, ktionale ile görüntülenir. Kullanıcı, Snackbar çubuğunda Tamam ' ı tıklarsa, uygulama izinleri ister. Kullanıcı, oyıteale kabul etmezse, uygulama izin istemek için devam etmemelidir. Artionale gösterilmiyorsa, etkinlik izin ister:
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) olanağı sağlar. RequestPermissionÇağrıldığında, denetim, izinleri kabul etmek için bir kullanıcı arabirimi görüntüleyen işletim sistemine devredilmiş olur:

Kullanıcı bittikten sonra, Android geri çağırma yöntemi aracılığıyla sonuçları etkinliğe döndürür OnRequestPermissionResult . Bu yöntem, bir arabirimin, ActivityCompat.IOnRequestPermissionsResultCallback etkinlik tarafından uygulanması gereken bir parçasıdır. Bu arabirimin, OnRequestPermissionsResult Kullanıcı seçeneklerinin etkinliğini bilgilendirmek Için Android tarafından çağrılacak tek bir yöntemi vardır. Kullanıcı izni verdiyseniz, uygulama devam edebilir ve korunan kaynağı kullanabilir. Öğesinin nasıl uygulanacağını gösteren bir örnek OnRequestPermissionResult aşağıda verilmiş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 konusu açıklanmaktadır. İzinlerin eski Android Uygulamaları (API düzeyi < 23) ve yeni Android Uygulamaları (API düzeyi 22) arasında çalışma şekli arasındaki farklar > . Android 6,0 ' de çalışma zamanı izin denetimlerinin nasıl gerçekleştirileceğini ele alınmaktadır.






