Content Provider nedir ve neden content:// bağlantıları ortaya çıkar
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:
- Asla uri.getPath() üzerine güvenmeyin — content:// için bu genellikle yanlıştır. Yol işlemesi file:// için geçerlidir.
- Okuma/sorgulama işlemleri için ContentResolver (query/openInputStream) ve Cursor kullanın.
- Büyük veri kümelerini yazmak/okumak için arka planda çalıştırın (Coroutine, Loader, WorkManager).
- 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.