Sobes.tech
Junior

Bir Intent'te dosya bağlantısı nasıl iletilir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Bir Intent içinde dosya bağlantısı iletmek için Uri kullanılır.

  1. FileProvider kullanımı (Android N ve üzeri için önerilen yöntem):
    En güvenli ve önerilen yöntemdir, çünkü Android'in en son sürümlerinde FileUriExposedException'ı önler.

    • AndroidManifest.xml içinde FileProvider tanımlanmalı ve dosyalara erişim yollarını içeren bir XML dosyası oluşturulmalıdır.

    • FileProvider.getUriForFile() kullanılarak Uri alınmalıdır.

    • AndroidManifest.xml:

      <application>
          <provider
              android:name="androidx.core.content.FileProvider"
              android:authorities="${applicationId}.provider"
              android:exported="false"
              android:grantUriPermissions="true">
              <meta-data
                  android:name="android.support.FILE_PROVIDER_PATHS"
                  android:resource="@xml/provider_paths"/>
          </provider>
      </application>
      
    • res/xml/provider_paths.xml:

      <paths>
          <external-path name="external_files" path="."/>
      </paths>
      
    • Transfer kodu:

      // 'file' nesnesinin java.io.File olduğu varsayılır
      Uri fileUri = FileProvider.getUriForFile(
          context,
          context.getPackageName() + ".provider",
          file
      );
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Doğru MIME türünü belirtin
      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Okuma izni ver
      
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      
  2. Uri.fromFile() kullanımı (Android N ile Deprecated):
    Bu yöntem, güvenlik sorunları nedeniyle Android N ve sonrası sürümlerde önerilmez.

    • Android N'den itibaren, Intent aracılığıyla dosya URI'larının aktarılması, diğer uygulamalarla etkileşimde FileUriExposedException hatasına neden olur.

    • Transfer kodu:

      // 'file' nesnesinin java.io.File olduğu varsayılır
      Uri fileUri = Uri.fromFile(file);
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Doğru MIME türünü belirtin
      
      // Bu kod, Android N+ sürümlerinde diğer uygulamalarla etkileşimde `FileUriExposedException` hatası oluşturabilir
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      

Kısaca tablo:

Yöntem Tavsiye (Android N+) Güvenlik
FileProvider Yüksek (FileUriExposedException'ı önler)
Uri.fromFile() Düşük (FileUriExposedException oluşturabilir)

Her zaman Android N ve üzeri uygulamalar arasında dosya paylaşımı için FileProvider kullanın.