İzinler yalnızca sistem işlevselliği istemek için kullanılmaz. Ayrıca, diğer uygulamaların uygulamanızın bileşenleriyle nasıl etkileşimde bulunabileceğini de kısıtlayabilirsiniz.
Bu kılavuzda, başka bir uygulamanın beyan ettiği izinler kümesinin nasıl kontrol edileceği açıklanmaktadır. Kılavuzda, diğer uygulamaların uygulamanızla etkileşimini kısıtlamak için etkinlikleri, hizmetleri, içerik sağlayıcıları ve yayın alıcıları nasıl yapılandırabileceğiniz de açıklanmaktadır.
Başka bir uygulamanın izinlerini kontrol etme
Başka bir uygulamanın bildirdiği izinler grubunu görüntülemek için aşağıdaki adımları tamamlamak üzere bir cihaz veya emülatör kullanın:
- Bir uygulamanın Uygulama bilgileri ekranını açın.
İzinler'i seçin. Uygulama izinleri ekranı yüklenir.
Bu ekranda bir dizi izin grubu gösterilir. Sistem, bir uygulamanın bildirdiği izinler kümesini bu gruplar halinde düzenler.
İzinleri kontrol etmenin başka yararlı yolları da vardır:
- Bir hizmete yapılan arama sırasında izni kontrol etmek için
Context.checkCallingPermission()içine bir izin dizesi iletin. Bu yöntem, söz konusu iznin geçerli çağırma işlemine verilip verilmediğini belirten bir tam sayı döndürür. Bu işlevin yalnızca başka bir işlemden gelen bir çağrıyı yürütürken kullanılabileceğini unutmayın. Bu çağrı genellikle bir hizmetten yayınlanan bir IDL arayüzü aracılığıyla veya başka bir şekilde başka bir işleme verilir. - Başka bir işleme belirli bir iznin verilip verilmediğini kontrol etmek için işlem kimliğini (PID)
Context.checkPermission()'ye iletin. - Başka bir pakete belirli bir iznin verilip verilmediğini kontrol etmek için paket adını
PackageManager.checkPermission()'ye iletin.
Uygulamanızın etkinlikleriyle etkileşimleri kısıtlama
Manifest dosyasında, <activity> etiketinin android:permission özelliğini kullanarak hangi uygulamaların Activity başlatabileceğini kısıtlayın. İzin, Context.startActivity() ve Activity.startActivityForResult() sırasında kontrol edilir. Arayan kişi gerekli izne sahip değilse SecurityException oluşur.
Uygulamanızın hizmetleriyle etkileşimleri kısıtlama
Manifest dosyasında, hangi diğer uygulamaların ilişkili Service'yi başlatabileceğini veya bu uygulamaya bağlanabileceğini kısıtlamak için <service> etiketinin android:permission özelliğini kullanın. İzin, Context.startService(), Context.stopService() ve Context.bindService() sırasında kontrol edilir. Arayan kullanıcıda gerekli izin yoksa SecurityException oluşur.
Uygulamanızın içerik sağlayıcılarıyla etkileşimleri kısıtlama
Manifest dosyasında, <provider> etiketinin android:permission özelliğini kullanarak ContentProvider içindeki verilere hangi diğer uygulamaların erişebileceğini kısıtlayın.
(İçerik sağlayıcılar, aşağıdaki bölümde açıklanan URI izinleri adlı önemli bir ek güvenlik olanağından yararlanabilir.)
Diğer bileşenlerin aksine, içerik sağlayıcılar için ayarlayabileceğiniz iki ayrı izin özelliği vardır: android:readPermission, hangi uygulamaların sağlayıcıdan okuma yapabileceğini kısıtlar ve android:writePermission, hangi uygulamaların sağlayıcıya yazma yapabileceğini kısıtlar. Bir sağlayıcı hem okuma hem de yazma izniyle korunuyorsa yalnızca yazma iznine sahip olmanın, uygulamanın sağlayıcıdan okuma yapmasına izin vermeyeceğini unutmayın.
İzinler, sağlayıcı ilk kez alındığında ve bir uygulama sağlayıcı üzerinde işlemler gerçekleştirdiğinde kontrol edilir. İstekte bulunan uygulamada bu izinlerden biri yoksa SecurityException oluşur. ContentResolver.query()'ı kullanmak için okuma izni, ContentResolver.insert(), ContentResolver.update() veya ContentResolver.delete()'ı kullanmak için yazma izni gerekir. Bu durumlarda gerekli iznin alınmaması SecurityException ile sonuçlanır.
URI bazında erişim izni verme
Sistem, diğer uygulamaların uygulamanızın içerik sağlayıcılarına nasıl erişebileceği konusunda daha ayrıntılı kontrol sağlar. Özellikle, içerik sağlayıcınız okuma ve yazma izinleriyle kendisini koruyabilirken doğrudan istemcilerinin belirli URI'leri diğer uygulamalarla paylaşmasına izin vermeye devam edebilir. Uygulamanızın bu modeli desteklediğini bildirmek için android:grantUriPermissions özelliğini veya <grant-uri-permission> öğesini kullanın.
Ayrıca, URI bazında izin de verebilirsiniz. Bir etkinliği başlatırken veya bir etkinliğe sonuç döndürürken Intent.FLAG_GRANT_READ_URI_PERMISSION intent işaretini, Intent.FLAG_GRANT_WRITE_URI_PERMISSION intent işaretini ya da her iki işareti de ayarlayın. Bu, diğer uygulamalara sırasıyla amaçta yer alan veri URI'si için okuma, yazma veya okuma ve yazma izinleri verir. Diğer uygulamalar, içerik sağlayıcıdaki verilere daha genel olarak erişme izni olup olmadığına bakılmaksızın, belirli URI için bu izinleri alır.
Örneğin, bir kullanıcının resim eki içeren bir e-postayı görüntülemek için uygulamanızı kullandığını varsayalım. Diğer uygulamalar genellikle e-posta içeriklerine erişemez ancak resmi görüntülemek isteyebilir. Uygulamanız, bir resim görüntüleme uygulamasının resmi görmesine izin vermek için bir amaç ve Intent.FLAG_GRANT_READ_URI_PERMISSION amaç işaretini kullanabilir.
Bir diğer önemli nokta ise uygulama görünürlüğüdür. Uygulamanız Android 11'i (API düzeyi 30) veya sonraki sürümleri hedefliyorsa sistem, bazı uygulamaları uygulamanız için otomatik olarak görünür hale getirir ve diğer uygulamaları varsayılan olarak gizler. Uygulamanızda içerik sağlayıcı varsa ve başka bir uygulamaya URI izni vermişse uygulamanız bu diğer uygulama tarafından otomatik olarak görülebilir.
Daha fazla bilgi için grantUriPermission(), revokeUriPermission() ve checkUriPermission() yöntemleriyle ilgili referans materyali inceleyin.
Uygulamanızın yayın alıcılarıyla etkileşimleri kısıtlama
<receiver> etiketinin android:permission özelliğini kullanarak, ilişkili BroadcastReceiver'ye hangi diğer uygulamaların yayın gönderebileceğini kısıtlayın. Sistem, gönderilen yayını belirtilen alıcıya teslim etmeye çalıştığı için
Context.sendBroadcast() döndükten sonra izni kontrol eder. Bu, izin hatasının, arayana geri gönderilen bir istisnaya neden olmadığı anlamına gelir. Yalnızca Intent teslim edilmez.
İzinleri programatik olarak da yapılandırabilirsiniz:
- Programatik olarak kaydedilmiş bir alıcıya hangi diğer uygulamaların yayın yapabileceğini kontrol etmek için:
Context.registerReceiver()için bir izin sağlayın. - Hangi yayın alıcıların yayın alabileceğini kısıtlamak için:
Context.sendBroadcast()çağrılırken izin sağlayın.
Hem alıcının hem de yayıncının izin isteyebileceğini unutmayın. Bu durumda, amacın ilişkili hedefe iletilmesi için her iki izin kontrolünün de başarılı olması gerekir. Daha fazla bilgi için Yayınları izinlerle kısıtlama başlıklı makaleyi inceleyin.