Android'de Intent.ACTION_VIEW'in Pratik Kullanımı
Android'deki Intent.ACTION_VIEW, aktarılan URI'ye göre bir URL'yi, dosyayı veya deep link'i açar; sistem şemaya veya MIME türüne göre uygun uygulamayı seçer. Aşağıda Kotlin ile hazırlanmış kısa, çalışan örnekler ve gerekli manifest ayarları yer almaktadır.
Hızlı Başlangıç — Genel Şema ve URL Açma
URI ile bir Intent oluşturun ve çökmeyi önlemek için her zaman resolveActivity() kontrolü yapın.
val uri = Uri.parse("https://example.com")
val intent = Intent(Intent.ACTION_VIEW, uri)
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
} else {
Toast.makeText(this, "Bağlantıyı açacak uygulama yok", Toast.LENGTH_SHORT).show()
}
Belirli bir tarayıcıda (örneğin Chrome) zorunlu olarak açmak isterseniz:
intent.setPackage("com.android.chrome")
startActivity(intent)
Flag ekleme:
- Activity olmayan bir bağlamdan başlatmak için FLAG_ACTIVITY_NEW_TASK.
- Güvenli arka plan başlatma için task stack davranışını dikkate alarak flag'leri dikkatlice kombinleyin.
startActivity çağrısından önce intent.resolveActivity() kontrolü yapmak, ActivityNotFoundException hatasından kaçınmanın basit bir yoludur.
Yerel Dosyaları Açma: FileProvider (Android 7+)
Android 7+ sürümlerinde FileProvider kullanmanız ve geçici okuma izinleri vermeniz gerekir.
- Manifest — Provider kaydı:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
- res/xml/file_paths.xml:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
- PDF açma (örnek):
val file = File(context.getExternalFilesDir(null), "document.pdf")
val uri = FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", file)
val intent = Intent(Intent.ACTION_VIEW).apply {
setDataAndType(uri, "application/pdf")
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
} else {
// fallback: mesaj göster veya tarayıcıda aç
Toast.makeText(context, "PDF Viewer yükleyin", Toast.LENGTH_SHORT).show()
}
FLAG_GRANT_READ_URI_PERMISSION olmadan, başka bir uygulamadan content:// URI'ye erişirken Permission Denial hatası alırsınız.
Deep Link: intent-filter ve Koddan Başlatma
myapp://product şemasını işlemek için aktiviteye intent-filter ekleyin:
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="myapp" android:host="product" />
</intent-filter>
Koddan deep link başlatma:
val deepLink = "myapp://product?id=123"
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(deepLink))
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
}
Aktivitede parametreleri okuma:
val uri = intent?.data
val productId = uri?.getQueryParameter("id") // "123"
Kullanım Senaryolarının Karşılaştırılması
Kullanım Senaryolarının Karşılaştırılması
| Senaryo | URI | MIME | Zorunlu Flag'ler |
|---|---|---|---|
| Web sayfası açma | https://example.com | — (tarayıcı belirler) | yok |
| Yerel PDF açma | content://.../file.pdf | application/pdf | FLAGGRANTREADURIPERMISSION |
| Deep link | myapp://product?id=123 | — (şemaya göre) | yok |
MIME türü, kullanıcıya hangi uygulamanın önerileceğini belirler.
Sık Yapılan Hatalar
- resolveActivity() kontrolü yapılmaması → ActivityNotFoundException.
- FileProvider kullanılmaması → Android 7+'ta SecurityException.
- FLAG_GRANT_READ_URI_PERMISSION unutulması → Permission Denial.
- Harici dosyalar için FileProvider yerine Uri.fromFile(...) kullanılması — modern sürümlerde çalışmaz.
SSS
-
Intent'i servisten nasıl açabilirim?
FLAG_ACTIVITY_NEW_TASK kullanın ve servis bağlamını empleyin: intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK). -
Dosyayı doğrudan file:// URI ile açabilir miyim?
Android 7+ sürümlerinde uygulamalar arası paylaşım için file:// yasaktır — FileProvider kullanın. -
Kullanıcının farklı bir uygulama seçtiğini nasıl yakalayabilirim?
Yeni API'lerde startActivityForResult dış bir uygulamadan sonuç seçimi sağlamaz; bunun yerine chooser sunmak tercih edilir:
Intent.createChooser(intent, "Şununla aç") -
FileProvider güvenliğini nasıl sağlayabilirim?
Provider'ı exported yapmayın, file_paths.xml içinde yolları kısıtlayın ve izinleri yalnızca FLAG_GRANT_READ_URI_PERMISSION ile verin.
Bu içerik, Intent.ACTION_VIEW kullanımındaki temel kalıpları kapsar: kısa çalışan örnekler, manifest ayarları ve sık karşılaşılan tuzaklar. Gerçek cihazlarda ve farklı Android sürümlerinde test edin.