Sobes.tech
Junior

¿Cómo pasar un enlace a un archivo en un Intent?

sobes.tech AI

Respuesta de la IA

Para pasar un enlace a un archivo en un Intent, se utiliza Uri.

  1. Uso de FileProvider (Método recomendado con Android N y superior):
    La forma más segura y recomendada, ya que previene FileUriExposedException en las versiones más recientes de Android.

    • Es necesario definir FileProvider en AndroidManifest.xml y crear un archivo XML con las rutas a los archivos.

    • Obtener Uri usando 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>
      
    • Código de transferencia:

      // Se asume que 'file' es un objeto java.io.File
      Uri fileUri = FileProvider.getUriForFile(
          context,
          context.getPackageName() + ".provider",
          file
      );
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Especifique el MIME type correcto
      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Conceder permiso de lectura
      
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      
  2. Uso de Uri.fromFile() (Obsoleto en Android N):
    Este método no se recomienda usar en las versiones más recientes de Android debido a problemas de seguridad.

    • A partir de Android N, transferir archivos URI a través de Intent provoca FileUriExposedException al interactuar con aplicaciones que no pertenecen a la misma app.

    • Código de transferencia:

      // Se asume que 'file' es un objeto java.io.File
      Uri fileUri = Uri.fromFile(file);
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Especifique el MIME type correcto
      
      // Este código puede provocar FileUriExposedException en Android N+ al interactuar con otras aplicaciones
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      

Tabla resumida:

Método Recomendación (Android N+) Seguridad
FileProvider Alta (previene FileUriExposedException)
Uri.fromFile() Baja (puede causar FileUriExposedException)

Siempre utilice FileProvider para compartir archivos entre aplicaciones en Android N y superior.