Sobes.tech
Back to questions
Junior
86
questionbank

Как передать ссылку на файл в Intent?

Sobes Copilot

Get answers in real time

Answer from AI

sobes.tech AI

Для передачи ссылки на файл в Intent используется Uri.

  1. Использование FileProvider (Рекомендуемый способ с Android N и выше):
    Наиболее безопасный и рекомендуемый способ, так как предотвращает FileUriExposedException на последних версиях Android.

    • Необходимо определить FileProvider в AndroidManifest.xml и создать XML-файл с путями к файлам.

    • Получить Uri с помощью 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>
      
    • Transferring code:

      // Предполагается, что 'file' - это объект java.io.File
      Uri fileUri = FileProvider.getUriForFile(
          context,
          context.getPackageName() + ".provider",
          file
      );
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Укажите правильный MIME type
      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Предоставить разрешение на чтение
      
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      
  2. Использование Uri.fromFile() (Deprecated с Android N):
    Этот метод не рекомендуется использовать на последних версиях Android из-за проблем с безопасностью.

    • Начиная с Android N, передача файловых URI через Intent вызывает FileUriExposedException при взаимодействии с приложениями, не принадлежащими текущему приложению.

    • Transferring code:

      // Предполагается, что 'file' - это объект java.io.File
      Uri fileUri = Uri.fromFile(file);
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Укажите правильный MIME type
      
      // Этот код может вызвать FileUriExposedException на Android N+ при взаимодействии с другими приложениями
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      

Краткая таблица:

Метод Рекомендация (Android N+) Безопасность
FileProvider Высокая (предотвращает FileUriExposedException)
Uri.fromFile() Низкая (может вызвать FileUriExposedException)

Всегда используйте FileProvider для обмена файлами между приложениями на Android N и выше.