Sobes.tech
Junior

Intentте файлга шилтемени кантип өткөрүү керек?

sobes.tech AI

AIден жооп

Файлга шилтеме өткөрүү үчүн Intent ичинде колдонулган Uri болуп саналат.

  1. FileProvider колдонуу (Android N жана андан жогору үчүн сунушталган ыкма):
    Бул эң коопсуз жана сунушталган ыкма, анткени ал акыркы Android версияларында FileUriExposedException алдын алат.

    • AndroidManifest.xml файлында FileProvider аныктоо жана файлдарга жолдорду камтыган XML файлын түзүү керек.

    • FileProvider.getUriForFile() аркылуу Uri алуу.

    • 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 жана андан кийинки версияларда, Intent аркылуу файл URI'ларын өткөрүү FileUriExposedException пайда кылат башка колдонмолор менен иштешкенде.

    • Коду өткөрүү:

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

Кыскача таблица:

Метод Туура (Android N+) Коопсуздук
FileProvider Жогорку (FileUriExposedException алдын алат)
Uri.fromFile() Төмөн (FileUriExposedException пайда кылышы мүмкүн)

Ар дайым FileProvider колдонуп, файлдарды Android N жана андан кийинки версияларда бөлүшүңүз.