Sobes.tech
Junior

Como passar um link para um arquivo no Intent?

sobes.tech IA

Resposta da IA

Para passar um link para um ficheiro numa Intent, utiliza-se Uri.

  1. Utilização de FileProvider (Método recomendado com Android N e superior):
    A forma mais segura e recomendada, pois previne FileUriExposedException nas versões mais recentes do Android.

    • É necessário definir FileProvider no AndroidManifest.xml e criar um ficheiro XML com os caminhos para os ficheiros.

    • Obter 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 transferência:

      // Assume-se que 'file' é um 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 o MIME type correto
      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Conceder permissão de leitura
      
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      
  2. Utilização de Uri.fromFile() (Obsoleto no Android N):
    Este método não é recomendado usar nas versões mais recentes do Android devido a problemas de segurança.

    • A partir do Android N, transferir URIs de ficheiros via Intent provoca FileUriExposedException ao interagir com aplicações que não pertencem à mesma aplicação.

    • Código de transferência:

      // Assume-se que 'file' é um objeto java.io.File
      Uri fileUri = Uri.fromFile(file);
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Especifique o MIME type correto
      
      // Este código pode provocar `FileUriExposedException` no Android N+ ao interagir com outras aplicações
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      

Tabela resumida:

Método Recomendação (Android N+) Segurança
FileProvider Alta (previne FileUriExposedException)
Uri.fromFile() Baixa (pode causar FileUriExposedException)

Sempre utilize FileProvider para troca de ficheiros entre aplicações no Android N e superior.