web-dev-qa-db-fra.com

Déni de permission lors du partage de fichier avec FileProvider

J'essaie de partager le fichier avec FileProvider. J'ai vérifié que ce fichier est partagé correctement avec des applications telles que Gmail, Google Drive, etc. Même si l'exception suivante est lancée:

2019-08-28 11:43:03.169 12573-12595/com.example.name E/DatabaseUtils: Writing exception to parcel
    Java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.example.name.provider/external_files/Android/data/com.example.name/files/allergy_report.pdf from pid=6005, uid=1000 requires the provider be exported, or grantUriPermission()
        at Android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.Java:729)
        at Android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.Java:602)
        at Android.content.ContentProvider$Transport.query(ContentProvider.Java:231)
        at Android.content.ContentProviderNative.onTransact(ContentProviderNative.Java:104)
        at Android.os.Binder.execTransactInternal(Binder.Java:1021)
        at Android.os.Binder.execTransact(Binder.Java:994)

fournisseur:

<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/file_provider_paths" />
</provider>

fichier_provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <external-path name="external_files" path="." />
</paths>

Partage d'une intention

Intent intentShareFile = new Intent(Intent.ACTION_SEND);
        File fileWithinMyDir = new File(targetPdf);

        if(fileWithinMyDir.exists()) {
            intentShareFile.setType("application/pdf");
            Uri uri = FileProvider.getUriForFile(getActivity(), BuildConfig.APPLICATION_ID + ".provider", fileWithinMyDir);
            intentShareFile.putExtra(Intent.EXTRA_STREAM, uri);
            intentShareFile.putExtra(Intent.EXTRA_SUBJECT,
                    "Sharing File...");
            intentShareFile.putExtra(Intent.EXTRA_TEXT, "Sharing File...");
            intentShareFile.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            startActivity(Intent.createChooser(intentShareFile, "Share File"));
        }

Espérons que vous pourrez souligner mon erreur pourquoi ces exceptions sont levées quand il semble que des applications soient accordées correctement et partager des œuvres telles que cela devrait être.

Edit :

J'ai trouvé que le problème réside en ligne:

startActivity(Intent.createChooser(intentShareFile, "Share File"));

Quand je l'ai changé simplement pour

startActivity(intentShareFile);

Cependant, il affiche un peu de disposition différente pour la sélection d'une application. Mais je ne peux toujours pas comprendre pourquoi le sélecteur original ne fonctionne pas.

16
Paweł Bęza

Cela a fonctionné pour moi.

    Intent sharableIntent = new Intent();
    sharableIntent.setAction(Intent.ACTION_SEND);
    sharableIntent.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION );

    Uri imageUri = Uri.parse(ImgLoc);
    File imageFile = new File(String.valueOf(imageUri));
    Uri UriImage = FileProvider.getUriForFile(context, Author, imageFile);

    sharableIntent.setType("image/*");
    sharableIntent.putExtra(Intent.EXTRA_STREAM, UriImage);
    sharableIntent.putExtra(Intent.EXTRA_TITLE, title);
    sharableIntent.putExtra(Intent.EXTRA_TEXT, body);

    Intent chooser = Intent.createChooser(sharableIntent, "Chooser Title");
    chooser.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
    context.startActivity(chooser);

Createchooser Intention.createcherooser (): Construit une nouvelle intention Action_chooser qui enveloppe l'intention cible donnée, fournissant également un titre. Si l'intention cible a spécifié flag_grant_read_uri_permission ou flag_gant_write_uri_permission, ces indicateurs seront également définis dans l'intention de choix retourné, avec son ensemble ClipData correctement: soit une réflexion directe de GetClipData () si elle est non nulle, ou une nouvelle ClipData construite à partir de getdata ()

0
MOHO LEARNIN G