Sobes.tech
Junior

Как да предадете връзка към файл в Intent?

sobes.tech AI

Отговор от 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>
      
    • Код за прехвърляне:

      // Предполага се, че '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 тип
      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Предоставяне на разрешение за четене
      
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      
  2. Използване на Uri.fromFile() (Застарял от Android N):
    Този метод не се препоръчва в последните версии на Android поради проблеми с безопасността.

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

    • Код за прехвърляне:

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

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

Метод Препоръчително (Android N+) Безопасност
FileProvider Висока (предотвратява FileUriExposedException)
Uri.fromFile() Ниска (може да предизвика FileUriExposedException)

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