Sobes.tech
Junior

Kako preneti link do fajla u Intent?

sobes.tech АИ

Одговор од АИ

Za prenos linka na fajl u Intent koristi se Uri.

  1. Korišćenje FileProvider (Preporučeni način od Android N i više):
    Najsigurniji i preporučeni način, jer sprečava FileUriExposedException na najnovijim verzijama Androida.

    • Potrebno je definisati FileProvider u AndroidManifest.xml i kreirati XML fajl sa putanjama do fajlova.

    • Dobijanje Uri pomoću FileProvider.getUriForFile().

    • 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>
      
    • Kod prenosa:

      // Pretpostavlja se da je 'file' objekat java.io.File
      Uri fileUri = FileProvider.getUriForFile(
          context,
          context.getPackageName() + ".provider",
          file
      );
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Postavi pravi MIME tip
      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Dodeli dozvolu za čitanje
      
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      
  2. Korišćenje Uri.fromFile() (Zastarjelo od Android N):
    Ova metoda se ne preporučuje na najnovijim verzijama Androida zbog sigurnosnih problema.

    • Od Android N nadalje, prenos fajl URI-ja putem Intent izaziva FileUriExposedException pri interakciji sa aplikacijama koje ne pripadaju trenutnoj aplikaciji.

    • Kod prenosa:

      // Pretpostavlja se da je 'file' objekat java.io.File
      Uri fileUri = Uri.fromFile(file);
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Postavi pravi MIME tip
      
      // Ovaj kod može izazvati `FileUriExposedException` na Android N+ pri interakciji sa drugim aplikacijama
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      

Kratka tabela:

Metod Preporučeno (Android N+) Bezbednost
FileProvider Visoka (sprečava FileUriExposedException)
Uri.fromFile() Niska (može izazvati FileUriExposedException)

Uvek koristite FileProvider za razmenu fajlova između aplikacija na Android N i više.