Sobes.tech
Junior

Kaip perduoti nuorodą į failą Intent?

sobes.tech AI

Atsakymas iš AI

Failo nuorodos perdavimui Intent naudojamas Uri.

  1. Naudojant FileProvider (Rekomenduojamas būdas nuo Android N ir aukščiau):
    Saugiausias ir rekomenduojamas būdas, nes jis užkerta kelią FileUriExposedException naujausiose Android versijose.

    • Reikia apibrėžti FileProvider AndroidManifest.xml faile ir sukurti XML failą su failų keliais.

    • Gauti Uri naudojant 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>
      
    • Perdavimo kodas:

      // Laikoma, kad 'file' yra java.io.File objektas
      Uri fileUri = FileProvider.getUriForFile(
          context,
          context.getPackageName() + ".provider",
          file
      );
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Nustatykite tinkamą MIME tipą
      intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Suteikti leidimą skaityti
      
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      
  2. Naudojant Uri.fromFile() (Pasenęs nuo Android N):
    Šis metodas nerekomenduojamas naujausiose Android versijose dėl saugumo problemų.

    • Nuo Android N ir aukščiau, failų URI perdavimas per Intent sukelia FileUriExposedException sąveikaujant su kitomis programomis.

    • Perdavimo kodas:

      // Laikoma, kad 'file' yra java.io.File objektas
      Uri fileUri = Uri.fromFile(file);
      
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(fileUri, "application/pdf"); // Nustatykite tinkamą MIME tipą
      
      // Šis kodas gali sukelti `FileUriExposedException` Android N+ versijose
      if (intent.resolveActivity(context.getPackageManager()) != null) {
          context.startActivity(intent);
      }
      

Trumpa lentelė:

Metodas Rekomenduojama (Android N+) Saugumas
FileProvider Aukštas (užkerta kelią FileUriExposedException)
Uri.fromFile() Žemas (gali sukelti FileUriExposedException)

Visada naudokite FileProvider failų dalijimuisi tarp programų Android N ir aukštesnėse versijose.