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 ва бештар истифода баред.