Diğer uygulamalarla olan etkileşimleri kısıtlama

İ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:

  1. Uygulamanın Uygulama bilgileri ekranını açın.
  2. İ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.