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 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 და ზევით ვერსიებში.