Android'de Intent.ACTION_VIEW'in Pratik Kullanımı

Kerem Aydın·10 Temmuz 2026·⏱2 dk

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.

  1. 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>
  1. res/xml/file_paths.xml:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>
  1. 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.

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ı

SenaryoURIMIMEZorunlu Flag'ler
Web sayfası açmahttps://example.com— (tarayıcı belirler)yok
Yerel PDF açmacontent://.../file.pdfapplication/pdfFLAGGRANTREADURIPERMISSION
Deep linkmyapp://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.