Sobes.tech
Junior

Comment transmettre un lien vers un fichier dans un Intent?

sobes.tech IA

Réponse de l'IA

Pour transmettre un lien vers un fichier dans un Intent, utilisez Uri.

  1. Utilisation de FileProvider (Méthode recommandée avec Android N et supérieur):
    La méthode la plus sûre et recommandée, car elle empêche FileUriExposedException sur les versions récentes d'Android.

    • Il est nécessaire de définir FileProvider dans AndroidManifest.xml et de créer un fichier XML avec les chemins vers les fichiers.

    • Obtenir Uri avec 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>
      
    • Code de transfert:

      // Supposons que 'file' est un objet java.io.File
      Uri fileUri = FileProvider.getUriForFile(
          context,
          context.getPackageName() + ".provider",
          file
      );
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Spécifiez le bon type MIME
      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Accorder la permission de lecture
      
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      
  2. Utilisation de Uri.fromFile() (Obsolète en Android N):
    Cette méthode n'est pas recommandée pour les versions récentes d'Android en raison de problèmes de sécurité.

    • À partir d'Android N, le transfert d'URI de fichiers via Intent provoque FileUriExposedException lors de l'interaction avec des applications non appartenant à la même application.

    • Code de transfert:

      // Supposons que 'file' est un objet java.io.File
      Uri fileUri = Uri.fromFile(file);
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Spécifiez le bon type MIME
      
      // Ce code peut provoquer une `FileUriExposedException` sur Android N+ lors de l'interaction avec d'autres applications
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      

Tableau résumé:

Méthode Recommandation (Android N+) Sécurité
FileProvider Élevée (empêche FileUriExposedException)
Uri.fromFile() Faible (peut provoquer FileUriExposedException)

Utilisez toujours FileProvider pour partager des fichiers entre applications sur Android N et supérieur.