Android'de content:// URI ile dosya nasıl açılır ve bulunur
Content:// URI, doğrudan dosya yolu yerine content://com.android... biçimindeki güvenli bir bağlantıdır. Böyle bir dosyayı cihazda açmak için content-URI ile çalışabilen bir uygulama kullanın (görüntüleyici, "Paylaş" → Kaydet). Gerçek yolu öğrenmek için ContentResolver üzerinden veya ADB (content query) kullanarak meta verileri sorgulayın, ardından gerekirse indirmek için adb pull komutunu kullanın.
Bilinmeyen SMS'lerden veya şüpheli sohbetlerden gelen content:// bağlantılarını asla açmayın; bunlar kimlik avı saldırısının parçası olabilir veya kötü amaçlı uygulamalara yönlendirebilir.
content:// URI nedir ve neden gereklidir
Android, doğrudan yolları (/storage/...) gizler ve bunun yerine content:// URI sunar (örneğin content://com.android.providers.media.documents/document/image%3A123). Bu işlem, içerik sağlayıcıları (ContentProvider / FileProvider) aracılığıyla şu amaçlarla yapılır:
- dosya sisteminin iç yapısını ifşa etmemek;
- uygulamalar arasında hak kontrolüyle geçici erişim sağlamak;
- uygulamanın özel dosyalarına doğrudan erişimi engellemek.
FileProvider, bir dosyayı content:// bağlantısına dönüştüren ve gerekli erişim bayraklarıyla (FLAG_GRANT_READ_URI_PERMISSION) Intent aracılığıyla başka bir uygulamaya ileten standart bir bileşendir.
content:// bağlantısı nasıl açılır — kullanıcılar için hızlı adımlar
- URI'yi mesajdan/günlükten/uygulamadan kopyalayın.
- URI ile çalışabilen bir uygulama açın: dosya yöneticisi, galeri veya yerel şemaları destekleyen herhangi bir tarayıcı. URI'yi adres çubuğuna yapıştırın veya "Paylaş" → uygun uygulamayı kullanın.
- Açma işlemi kaydetme amacıyla gerekiyorsa, uygulamada "Kaydet" veya "Paylaş" → "İndirmelere Kaydet" seçeneğini belirleyin.
- Açılamıyorsa: uygulama izinlerini (Dosyalar ve medya) kontrol edin ve URI kaynağının gerçekten geçici okuma izni verdiğinden emin olun.
Geliştirici haklarına sahip bir cihazda: ADB terminalini açın ve aşağıdaki adımları uygulayın (yolu almak için aşağıdaki bölüme bakın).
Geliştiriciler için: ContentResolver.openInputStream(uri), InputStream döndürür; gerçek yolu hesaplamaya çalışmadan dosyayı okumak için kullanışlıdır.
Dosyanın gerçek yolunu bulma (birkaç çalışan yöntem)
- Dosya yöneticisi uygulaması aracılığıyla (root olmadan)
- Sağlayıcılarla çalışmayı destekleyen gelişmiş bir yönetici yükleyin. URI'deki son / işaretinden sonraki id kısmını girin. Bazen dosyayı DCIM, Download veya Android/data/
klasörlerinde bulabilirsiniz.
- ADB aracılığıyla (en doğru yöntem)
- Sağlayıcı meta verilerini alın: adb shell content query --uri "content://com.android.providers.media.documents/document/image%3A123" Çıktıda _display_name ve _data alanlarını arayın; _data, dosya sistemindeki gerçek yolu içerebilir.
- _data mevcutsa, dosyayı indirin: adb pull /storage/emulated/0/Path/To/File.jpg
- Programatik olarak (kendi uygulamanızda)
- Kotlin örneği: val input = contentResolver.openInputStream(uri) // akışı doğrudan oku Veya imleç üzerinden yolu alın: val cursor = contentResolver.query(uri, arrayOf("_data", "_display_name"), null, null, null) cursor?.use { if (it.moveToFirst()) { val idx = it.getColumnIndex("_data") val path = if (idx != -1) it.getString(idx) else null } }
- URI başka bir uygulamadan geliyorsa ve yol erişilemiyorsa
- Kaynak uygulamadan dosyayı "Paylaş" yoluyla göndermesini veya dışa aktarmasını isteyin; geçici URI'lar genellikle birkaç dakika yaşar ve yalnızca doğrudan aktarım için geçerlidir.
Popüler sağlayıcılar ve dosyanın nerede aranacağı
Popüler content:// sağlayıcıları ve tipik depolama konumları
| Sağlayıcı | Dosya türü | Nerede aranır |
|---|---|---|
| com.android.providers.media.documents | Fotoğraf/video | DCIM/Camera, Pictures, Movies |
| com.android.externalstorage.documents | Her türlü dosya | /storage/emulated/0/Download, Documents |
| com.android.providers.contacts | Kişiler | Kişiler uygulaması üzerinden .vcf olarak dışa aktar |
| com.google.android.apps.photos.content | Google Fotoğraflar önbelleği/bulut | Android/data/com.google.android.apps.photos/cache |
Sık karşılaşılan hatalar
- "Erişim reddedildi" — Scoped Storage ve izinleri kontrol edin; Android 11'den itibaren harici belleğe erişim kısıtlıdır.
- Yanlış beklentiler: content:// mutlaka gerçek bir _data içermek zorunda değildir; bazı sağlayıcılar verileri yalnızca veritabanında/bulutta saklar.
- URI süresi doldu — geçici izinlerin sınırlı bir süresi vardır (dakikalar). Yeniden oluşturun.
- iOS'ta content:// açmaya çalışmak — şema desteklenmez.
SSS
-
adb pull ile doğrudan content:// kullanılabilir mi?
Hayır: adb pull dosya yollarıyla çalışır. Önce adb shell content query veya programatik olarak yolu alın, ardından adb pull kullanın. -
_data boşsa ne yapılmalı?
Verileri ContentResolver.openInputStream(uri) üzerinden okuyun veya kaynaktan dosyanın dışa aktarılmasını isteyin. -
content:// bağlantısını paylaşmak güvenli midir?
Evet, FileProvider kullanılıyorsa ve gerekli izin bayrakları aktarılıyorsa; erişim kontrollü ve geçici olacaktır.
Belirli bir uygulamadan gelen somut bir content:// URI'niz varsa; sağlayıcıyı (com.xxx...) ve örnek URI'yi belirtin, böylece dosyayı almak için kesin komut verebiliriz.