Content Provider nedir ve neden content:// bağlantıları ortaya çıkar

Kerem Aydın·8 Temmuz 2026·⏱3 dk

Content Provider, uygulamanın verilerine content:// URI aracılığıyla güvenli ve standartlaştırılmış erişim sağlayan bir Android sistem bileşenidir. Günlük kayıtlarında (log) veya Intent içinde content:// görüyorsanız, bu bir sağlayıcı tarafından yönetilen verilere (kişiler, medya, uygulama dosyaları vb.) yönelik bir bağlantıdır ve bunlar doğrudan dosya yolu üzerinden değil, ContentResolver aracılığıyla okunmalıdır.

content:// URI yapısı ve sağlayıcı ile etkileşim

content:// URI genellikle şu şekildedir: content:////

  • authority — sağlayıcının benzersiz tanımlayıcısı (örneğin, com.android.contacts).
  • path — kaynak veya tablo (örneğin, images).
  • id — isteğe bağlı kayıt tanımlayıcısı.

Verileri almak için üst düzey API'leri kullanın:

  • ContentResolver.query(uri, projection, selection, args, sort) — Cursor döndürür.
  • ContentResolver.openInputStream(uri) — dosya okuma için akış.
  • insert/update/delete — verileri değiştirmek için.
  • getType(uri) — MIME türü.

Dosya okuma örneği (Kotlin):

context.contentResolver.openInputStream(uri)?.use { input ->
    // akışı bir dosyaya kopyalayın veya içeriği okuyun
}

Sağlayıcı bir FileProvider ise (uygulamalar arasında dosya paylaşımı için), URI'yi FileProvider.getUriForFile(context, authority, file) ile oluşturun ve FLAG_GRANT_READ_URI_PERMISSION bayrağıyla Intent aracılığıyla iletin.

content:// bağlantıları neden ortaya çıkar ve bunlar nasıl doğru işlenir

Ortaya çıkma nedenleri:

  • Sistem sağlayıcıları (MediaStore, ContactsContract, Calendar) her zaman content:// kullanır.
  • FileProvider ve SAF (Storage Access Framework), güvenlik amacıyla file:// yerine content:// sağlar.
  • Intent/EXTRA_STREAM aracılığıyla paylaşım yaparken diğer uygulamalar size kendi verilerine ait URI verir.

Doğru işleme yöntemi:

  1. Asla uri.getPath() üzerine güvenmeyin — content:// için bu genellikle yanlıştır. Yol işlemesi file:// için geçerlidir.
  2. Okuma/sorgulama işlemleri için ContentResolver (query/openInputStream) ve Cursor kullanın.
  3. Büyük veri kümelerini yazmak/okumak için arka planda çalıştırın (Coroutine, Loader, WorkManager).
  4. Geçici izin aktarımı için Intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) kullanın ve provider'ı manifest dosyasında doğru şekilde bildirin.

FileProvider için manifest girişi örneği:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="com.yourapp.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

Hata: content:// adresini File API (new File(uri.getPath())) ile açmaya çalışmak NPE veya FileNotFoundException hatasına yol açar. Her zaman ContentResolver kullanın.

Güvenlik, erişim hakları ve performans

  • İzinler: Sağlayıcı READ/WRITE izinleri gerektirebilir veya geçici erişim için grantUriPermission bayraklarını kullanabilir.
  • MIME türleri: getType(uri), verileri okumadan önce formatını anlamaya yardımcı olur.
  • Provider yapılandırması: exported=false, grantUriPermissions=true — FileProvider için güvenli bir yapılandırmadır.
  • Performans: Büyük BLOB verilerini ana iş parçacığında çekmeyin; akış tabanlı okuma ve önbellekleme tercih edin.

Sık yapılan hatalar

  • content:// yolunu getPath() ile ayrıştırmak.
  • URI'yi Intent ile iletirken grantUriPermission bayraklarını göz ardı etmek.
  • Ağır ContentResolver sorgularını UI iş parçacığında çalıştırmak.
  • Dosyalar/MediaStore yerine SQLite'da büyük ikili verileri saklamak.

SSS

  • content:// adresini dosyaya dönüştürebilir miyim? — Dolaylı olarak: ContentResolver aracılığıyla InputStream açın ve uygulamanızın yerel dosyasına kopyalayın.
  • content:// adresine erişirken neden SecurityException alıyorum? — Ya izin yoktur (FLAG_GRANT_READ_URI_PERMISSION aktarılmamıştır) ya da sağlayıcı özel izinler gerektiriyordur.
  • Kendi ContentProvider'ıma ne zaman ihtiyacım var? — Diğer uygulamaların verilerinize güvenli bir şekilde okuma/yazma yapması gerekiyorsa veya tek tip bir erişim arayüzü istiyorsanız (örneğin senkronizasyon için).

Eğer content:// görüyorsanız, bu genellikle bir hata değil, Android'in güvenlik özelliğidir. Doğru uygulama: ContentResolver aracılığıyla çalışmak, paylaşım sırasında geçici izinler vermek ve verileri akış tabanlı işlemek.