Sobes.tech
Junior

Jak předat odkaz na soubor v Intent?

sobes.tech AI

Odpověď od AI

Pro předání odkazu na soubor v Intent se používá Uri.

  1. Použití FileProvider (Doporučený způsob od Android N výše):
    Nejbezpečnější a doporučený způsob, protože zabraňuje FileUriExposedException na nejnovějších verzích Androidu.

    • Je nutné definovat FileProvider v AndroidManifest.xml a vytvořit XML soubor s cestami k souborům.

    • Získat Uri pomocí 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>
      
    • Kód přenosu:

      // Předpokládá se, že 'file' je objekt java.io.File
      Uri fileUri = FileProvider.getUriForFile(
          context,
          context.getPackageName() + ".provider",
          file
      );
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Nastavte správný MIME typ
      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Udělit oprávnění ke čtení
      
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      
  2. Použití Uri.fromFile() (Zastaralé od Android N):
    Tato metoda se nedoporučuje na nejnovějších verzích Androidu kvůli bezpečnostním problémům.

    • Od Android N a výše, předávání souborových URI přes Intent způsobuje FileUriExposedException při interakci s aplikacemi, které nepatří aktuální aplikaci.

    • Kód přenosu:

      // Předpokládá se, že 'file' je objekt java.io.File
      Uri fileUri = Uri.fromFile(file);
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Nastavte správný MIME typ
      
      // Tento kód může vyvolat `FileUriExposedException` na Android N+ při interakci s jinými aplikacemi
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      

Stručná tabulka:

Metoda Doporučeno (Android N+) Bezpečnost
FileProvider Vysoká (zabraňuje FileUriExposedException)
Uri.fromFile() Nízká (může způsobit FileUriExposedException)

Vždy používejte FileProvider pro sdílení souborů mezi aplikacemi na Android N a vyšším.