Sobes.tech
Junior

Ինչպե՞ս փոխանցել ֆայլի հղումը Intent-ում։

sobes.tech AI

Պատասխան AI-ից

Տվյալ ֆայլի հղումը փոխանցելու համար Intent-ում օգտագործվում է Uri:

  1. Օգտագործել FileProvider (Առաջարկվող մեթոդ Android N և բարձր տարբերակների համար):
    Ամենաբարձր անվտանգ և առաջարկվող մեթոդը, քանի որ կանխում է FileUriExposedException-ը վերջին Android տարբերակներում:

    • Պետք է սահմանել FileProviderAndroidManifest.xml-ում և ստեղծել XML ֆայլ ֆայլերի ուղիներով:

    • Ստանալ UriFileProvider.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 և բարձր տարբերակներում։