İzinler yalnızca sistem işlevselliği isteğinde bulunmak için değildir. Ayrıca, diğer uygulamaların uygulamanızın bileşenleriyle etkileşimde bulunma şeklini de kısıtlayabilirsiniz.
Bu kılavuzda, başka bir uygulamanın beyan ettiği izin grubunun nasıl kontrol edileceği açıklanmaktadır. Kılavuzda ayrıca diğer uygulamaların uygulamanızla etkileşimde bulunma şeklini kısıtlamak için etkinlikleri, hizmetleri, içerik sağlayıcıları ve yayın alıcılarını nasıl yapılandırabileceğiniz de açıklanmaktadır.
Başka bir uygulamanın izinlerini kontrol etme
Başka bir uygulamanın beyan ettiği izin grubunu görüntülemek için bir cihaz veya emülatör kullanarak aşağıdaki adımları tamamlayın:
- 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 beyan ettiği izin grubunu bu gruplar halinde düzenler.
İzinleri kontrol etmenin başka faydalı yolları da vardır:
- Bir hizmete yapılan çağrı sırasında
Context.checkCallingPermission()
ürününe bir izin dizesi iletin. Bu yöntem, mevcut çağrı işlemine iznin verilip verilmediğini belirten bir tam sayı döndürür. Bunun yalnızca başka bir işlemden gelen, genellikle bir hizmetten yayınlanan veya başka bir işleme verilen IDL arayüzü aracılığıyla gelen bir çağrıyı yürütürken kullanılabileceğini unutmayın. - Başka bir işleme belirli bir izin verilip verilmediğini kontrol etmek için işlemi (PID)
Context.checkPermission()
'e iletin. - Başka bir pakete belirli bir izin verilip verilmediğini kontrol etmek için paket adını
PackageManager.checkPermission()
içine iletin.
Uygulamanızın etkinlikleriyle olan etkileşimleri kısıtlama
Bu Activity
öğesini başlatabilecek diğer uygulamaları kısıtlamak için manifest'teki
<activity>
etiketinde android:permission
özelliğini kullanın. İzin, Context.startActivity()
ve Activity.startActivityForResult()
sırasında kontrol edilir.
Çağrı yapan kişi gerekli izne sahip değilse SecurityException
görünür.
Uygulamanızın hizmetleriyle etkileşimleri kısıtlama
İlişkili Service
öğesine başlatabilecek veya bağlanabilecek diğer uygulamaları kısıtlamak için manifest'teki
<service>
etiketinde android:permission
özelliğini kullanın.
İzin Context.startService()
, Context.stopService()
ve Context.bindService()
sırasında kontrol edilir.
Arayan kişi gerekli izne sahip değilse SecurityException
ortaya çıkar.
Uygulamanızın içerik sağlayıcılarıyla etkileşimleri kısıtlama
ContentProvider
içindeki verilere erişebilecek diğer uygulamaları kısıtlamak için
<provider>
etiketinde android:permission
özelliğini kullanın.
(İçerik sağlayıcılar, aşağıdaki bölümde açıklanan URI izinleri adı verilen önemli bir ek güvenlik özelliğine sahiptir.)
Diğer bileşenlerin aksine, içerik sağlayıcılar için ayarlayabileceğiniz iki ayrı izin özelliği vardır:
android:readPermission
, diğer uygulamaların sağlayıcıdan okuyabileceği öğeleri kısıtlar,
android:writePermission
ise diğer uygulamaların sağlayıcıya yazabileceği uygulamaları kısıtlar. Sağlayıcı hem okuma hem yazma izniyle korunuyorsa yalnızca yazma izninin tutulması uygulamaların sağlayıcıdan okumasına izin vermez.
İzinler, sağlayıcı ilk alındığında ve bir uygulama sağlayıcıda işlem gerçekleştirdiğinde
kontrol edilir. İstekte bulunan uygulamanın iki izni de yoksa SecurityException
oluşur. ContentResolver.query()
kullanımı okuma izni gerektirir. ContentResolver.insert()
, ContentResolver.update()
veya ContentResolver.delete()
kullanmak için yazma izni gerekir. Bu durumların hepsinde gerekli iznin elinizde tutulması, SecurityException
ile sonuçlanır.
URI bazında erişim ver
Sistem, diğer uygulamaların uygulamanızın içerik sağlayıcılarına nasıl erişebileceği konusunda ayrıntılı ek kontrol sağlar. Özellikle içerik sağlayıcınız, kendisini okuma ve yazma izinleriyle korurken, doğrudan istemcilerinin belirli URI'ları diğer uygulamalarla paylaşmasına da izin verebilir. Uygulamanızın bu modeli desteklediğini beyan etmek için android:grantUriPermissions
özelliğini veya <grant-uri-permission>
öğesini kullanın.
Ayrıca, izinleri URI bazında verebilirsiniz. Bir etkinliği başlatırken veya bir etkinliğe sonuç döndürürken Intent.FLAG_GRANT_READ_URI_PERMISSION
amaç işaretini, Intent.FLAG_GRANT_WRITE_URI_PERMISSION
amaç işaretini veya her iki işareti de ayarlayın. Bu işlem, diğer uygulamalara niyete dahil edilen veri URI'si için sırasıyla okuma, yazma veya okuma/yazma izinleri verir. Diğer uygulamalar, içerik sağlayıcıdaki verilere daha genel olarak erişim iznine sahip olup olmadıklarına bakılmaksızın belirli URI için bu izinleri alır.
Örneğin, bir kullanıcının resim eki olan bir e-postayı görüntülemek için uygulamanızı kullandığını varsayalım. Diğer uygulamalar genel olarak e-posta içeriklerine erişmemelidir, ancak resmi görüntülemek istiyor olabilirler.
Uygulamanız, resim görüntüleme uygulamasının resmi görmesine izin vermek için intent ve Intent.FLAG_GRANT_READ_URI_PERMISSION
amaç işaretini kullanabilir.
Dikkat edilecek bir diğer konu da uygulama görünürlüğü. Uygulamanız Android 11 (API düzeyi 30) veya sonraki sürümleri hedefliyorsa sistem bazı uygulamaları otomatik olarak uygulamanıza görünür hale getirir ve diğer uygulamaları varsayılan olarak gizler. Uygulamanızın bir içerik sağlayıcısı varsa ve başka bir uygulamaya URI izinleri verdiyse uygulamanız diğer uygulama tarafından otomatik olarak görülebilir.
Daha fazla bilgi için grantUriPermission()
, revokeUriPermission()
ve checkUriPermission()
yöntemleriyle ilgili referans materyallerini inceleyin.
Uygulamanızın yayın alıcılarıyla etkileşimleri kısıtlama
İlişkili BroadcastReceiver
öğesine yayın gönderebilecek diğer uygulamaları kısıtlamak için
<receiver>
etiketinde android:permission
özelliğini kullanın.
Sistem, gönderilen yayını belirtilen alıcıya teslim etmeye çalıştığından, izin Context.sendBroadcast()
döndürüldükten sonra kontrol edilir. Bu, bir izin hatasının çağrıyı yapana geri gönderilen bir istisnaya yol açmadığı, yalnızca Intent
öğesinin gönderilmediği anlamına gelir.
Aynı şekilde, programatik olarak kayıtlı bir alıcıya hangi diğer uygulamaların yayın yapabileceğini kontrol etmesi için Context.registerReceiver()
uygulamasına bir izin sağlayabilirsiniz. Diğer yandan, Context.sendBroadcast()
yöntemini çağırırken yayını hangi yayın alıcılarının alabileceğini kısıtlamak için bir izin sağlayabilirsiniz.
Hem alıcının hem de yayıncının izin gerektirebileceğini unutmayın. Böyle bir durumda, amacın ilişkilendirilen hedefe yayınlanması 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 konusuna bakın.