web-dev-qa-db-fra.com

Impossible de trouver des métadonnées pour le fournisseur autorisé

J'ai intégré le Creative Kit de Snapchat dans mon Android. Après le traitement, je reçois une image du serveur sous la forme d'un tableau d'octets que j'enregistre sur le disque puis envoie le fichier à la Kit créatif de Snapchat comme indiqué ci-dessous.

 private fun downloadImage(
    fileName: String,
    imageByteArray: ByteArray?): Uri? {
    val state = Environment.getExternalStorageState()

    if (Environment.MEDIA_MOUNTED == state) {
        val downloadDir = File(
            Environment.getExternalStorageDirectory(), context?.getString(R.string.app_name)
        )

        if (!downloadDir.isDirectory) {
            downloadDir.mkdirs()
        }

        val file = File(downloadDir, fileName)
        var ostream: FileOutputStream? = null
        try {
            ostream = FileOutputStream(file)
            ostream.write(imageByteArray)
            ostream.flush()
            ostream.close()
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }

    val snapCreativeKitApi = SnapCreative.getApi(context!!)
    val snapMediaFactory = SnapCreative.getMediaFactory(context!!)
    lateinit var snapPhotoFile: SnapPhotoFile
    try {
        snapPhotoFile = snapMediaFactory.getSnapPhotoFromFile(file)
    } catch (e: SnapMediaSizeException) {
        return
    }
    val snapPhotoContent = SnapPhotoContent(snapPhotoFile)
    snapCreativeKitApi.send(snapPhotoContent)
    }
}

J'ai également ajouté provider dans le fichier manifeste comme indiqué ci-dessous:

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

Et dans le provider_paths_app.xml, J'ai essayé tous les chemins possibles en faisant référence à this réponse et aucun d'eux ne fonctionne.

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

Avec le chemin ci-dessus, j'obtiens l'erreur ci-dessous.

Couldn't find meta-data for provider with authority my.package.name.fileprovider

Tout ce que je dois faire est d'envoyer cette image à Snapchat mais je ne peux pas comprendre ce que je fais mal. Toute aide serait appréciée.

14
Mehul Kanzariya
    <provider
        Android:name="androidx.core.content.FileProvider"
        Android:authorities="${applicationId}.fileprovider"
        Android:exported="false"
        Android:grantUriPermissions="true">
        <meta-data
            Android:name="Android.support.FILE_PROVIDER_PATHS"
            Android:resource="@xml/file_paths"></meta-data>
    </provider>

Ceci est ma déclaration de fournisseur, la valeur de $ {applicationId} est "com.limxtop.research", assurez-vous que le nom des autorités est le même que celui des codes ci-dessous.

            // Create the file where the photo should save.
            File file = null;
            try {
                file = createImageFile();
            } catch (IOException e) {
                break;
            }
            // The second parameter is the name of authorities.
            Uri uri = FileProvider.getUriForFile(this,
                    "com.limxtop.research.fileprovider", file);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
                    | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            startActivityForResult(intent, fullSizeRequestCode);

Donc, peut-être que vos codes postés ici ne sont pas complets, vous devriez passer "my.package.name.fileprovider" comme paramètre quelque part.

15
Saint

Écrivez d'abord la balise suivante dans le manifeste sous la balise

 <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>

Ensuite, créez un dossier xml dans res et créez un nom de fichier: fournissez + paths.xml puis copiez collez le code:

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

et maintenant la plupart des erreurs de développeur dans les programmes pour créer un fichier dans le programme, nous allons utiliser:

FileProvider.getUriForFile(Objects.requireNonNull(getApplicationContext()),
                    BuildConfig.APPLICATION_ID + ".provider", file);

J'espère que cela fonctionnera pour vous !!!

12
Pradeep Kumar

Je viens de supprimer le '$' d'Android: autorités = "$ {applicationId} .provider" et cela fonctionne comme un charme maintenant.

1
Manish Joshi

mImageFromCamera = FileProvider.getUriForFile (this, BuildConfig.APPLICATION_ID + ".fileprovider", mImageFile); Android: autorités = "$ {applicationId} .fileprovider"

les autorités doivent être identiques en xml et en code

1
s0l

Remplacez les autorités par un nom unique pour résoudre le problème, comme

Android:authorities="${applicationId}.myUniquefileprovider"

également en Java

0
Vaishakh

Dans mon cas.

J'ai un projet de bibliothèque. Appelons-le: LibApk

Quand je code ceci: applicationId "my.package.name" dans le build.grale (app)

quand build gradle me dit que: Les projets de bibliothèque ne peuvent pas définir applicationId. applicationId est défini sur 'com.darcy.apkupdate' dans la configuration par défaut.

Donc, je supprime applicationId "my.package.name".

Ensuite, build.gradle ressemble à ceci: enter image description here

Mais j'ai oublié de mettre à jour le fichier AndroidManifest.xml qui utilise $ {applicationId}

enter image description here

C'est le problème!!!

J'ai donc changé la variable en constante. Le résultat ressemble à l'image ci-dessous: enter image description here

Après ça, c'est wokr pour moi!

J'espère que cela vous aidera ...

0
anKotliner