Sobes.tech
Junior

Jak przekazać link do pliku w Intent?

sobes.tech AI

Odpowiedź od AI

Aby przekazać odnośnik do pliku w Intent, używa się Uri.

  1. Użycie FileProvider (Zalecany sposób od Android N wzwyż):
    Najbezpieczniejszy i zalecany sposób, ponieważ zapobiega FileUriExposedException w nowszych wersjach Androida.

    • Należy zdefiniować FileProvider w AndroidManifest.xml i utworzyć plik XML z ścieżkami do plików.

    • Uzyskać Uri za 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>
      
    • Kod transferu:

      // Zakłada się, że 'file' jest obiektem java.io.File
      Uri fileUri = FileProvider.getUriForFile(
          context,
          context.getPackageName() + ".provider",
          file
      );
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Podaj właściwy MIME type
      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Przyznaj uprawnienie do odczytu
      
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      
  2. Użycie Uri.fromFile() (Przestarzałe od Android N):
    Metoda ta nie jest zalecana w nowszych wersjach Androida ze względu na problemy z bezpieczeństwem.

    • Od Android N, przekazywanie URI plików przez Intent powoduje FileUriExposedException podczas interakcji z aplikacjami spoza tej samej aplikacji.

    • Kod transferu:

      // Zakłada się, że 'file' jest obiektem java.io.File
      Uri fileUri = Uri.fromFile(file);
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Podaj właściwy MIME type
      
      // Ten kod może wywołać `FileUriExposedException` na Android N+ podczas interakcji z innymi aplikacjami
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      

Podsumowanie:

Metoda Rekomendacja (Android N+) Bezpieczeństwo
FileProvider Wysoka (zapobiega FileUriExposedException)
Uri.fromFile() Niska (może wywołać FileUriExposedException)

Zawsze używaj FileProvider do wymiany plików między aplikacjami na Android N i wyższych.