Sobes.tech
Junior

Come passare un link a un file in un Intent?

sobes.tech AI

Risposta dell'AI

Per passare un collegamento a un file in un Intent, si utilizza Uri.

  1. Utilizzo di FileProvider (Metodo raccomandato con Android N e versioni successive):
    Il metodo più sicuro e raccomandato, in quanto previene FileUriExposedException nelle versioni più recenti di Android.

    • È necessario definire FileProvider nel AndroidManifest.xml e creare un file XML con i percorsi ai file.

    • Ottenere Uri tramite 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>
      
    • Codice di trasferimento:

      // Si assume che 'file' sia un oggetto java.io.File
      Uri fileUri = FileProvider.getUriForFile(
          context,
          context.getPackageName() + ".provider",
          file
      );
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Specificare il MIME type corretto
      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Concedere permesso di lettura
      
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      
  2. Utilizzo di Uri.fromFile() (Obsoleto con Android N):
    Questo metodo non è raccomandato nelle versioni più recenti di Android a causa di problemi di sicurezza.

    • A partire da Android N, il trasferimento di URI di file tramite Intent provoca FileUriExposedException quando si interagisce con applicazioni non appartenenti alla stessa app.

    • Codice di trasferimento:

      // Si assume che 'file' sia un oggetto java.io.File
      Uri fileUri = Uri.fromFile(file);
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Specificare il MIME type corretto
      
      // Questo codice può causare `FileUriExposedException` su Android N+ durante l'interazione con altre applicazioni
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      

Tabella riassuntiva:

Metodo Raccomandazione (Android N+) Sicurezza
FileProvider Alta (previene FileUriExposedException)
Uri.fromFile() Bassa (può causare FileUriExposedException)

Utilizzare sempre FileProvider per condividere file tra applicazioni su Android N e versioni successive.