Sobes.tech
Junior

Wie überträgt man einen Link zu einer Datei in einem Intent?

sobes.tech KI

Antwort von AI

Um eine Datei-URL in einem Intent zu übergeben, wird Uri verwendet.

  1. Verwendung von FileProvider (Empfohlene Methode ab Android N):
    Die sicherste und empfohlene Methode, da sie FileUriExposedException in den neueren Android-Versionen verhindert.

    • Es ist notwendig, FileProvider in AndroidManifest.xml zu definieren und eine XML-Datei mit den Pfaden zu den Dateien zu erstellen.

    • Uri mit FileProvider.getUriForFile() erhalten.

    • 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>
      
    • Übertragungscode:

      // Es wird angenommen, dass 'file' ein java.io.File-Objekt ist
      Uri fileUri = FileProvider.getUriForFile(
          context,
          context.getPackageName() + ".provider",
          file
      );
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Geben Sie den richtigen MIME-Typ an
      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Leseberechtigung gewähren
      
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      
  2. Verwendung von Uri.fromFile() (Veraltet ab Android N):
    Diese Methode wird auf den neueren Android-Versionen nicht empfohlen, da sie Sicherheitsprobleme verursacht.

    • Ab Android N führt das Übertragen von Date-URIs über Intent zu FileUriExposedException, wenn mit Anwendungen interagiert wird, die nicht zur aktuellen Anwendung gehören.

    • Übertragungscode:

      // Es wird angenommen, dass 'file' ein java.io.File-Objekt ist
      Uri fileUri = Uri.fromFile(file);
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Geben Sie den richtigen MIME-Typ an
      
      // Dieser Code kann bei Interaktion mit anderen Anwendungen eine `FileUriExposedException` auslösen
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      

Kurzfassung:

Methode Empfehlung (Android N+) Sicherheit
FileProvider Hoch (verhindert FileUriExposedException)
Uri.fromFile() Niedrig (kann FileUriExposedException verursachen)

Verwenden Sie immer FileProvider für den Austausch von Dateien zwischen Anwendungen auf Android N und höher.