Couldn't find meta-data for provider with authority

Viewed 100509

I have integrated Snapchat's Creative Kit in my Android app. After processing, I receive an image from the server in the form of Byte Array which I am saving to the disk and then sending the file to the Snapchat's Creative Kit as shown below.

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

I have also added provider in the manifest file as shown below:

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

And in the provider_paths_app.xml, I have tried all the possible paths by referring this answer and none of them works.

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

With the above path, I am getting the below error.

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

All I have to do is send this image to Snapchat but I am unable to figure out what I am doing wrong. Any help will be appreciated.

16 Answers

First, write the following tag in manifest under the <application> tag

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

Then create a xml folder in res and create a file named: provider_paths.xml and then copy paste the 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>

And now here's where most developers make mistakes: in your script, create your File with:

FileProvider.getUriForFile(Objects.requireNonNull(getApplicationContext()),
                    BuildConfig.APPLICATION_ID + ".provider", file);
    <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>

This is my provider declaration, the value of ${applicationId} is "com.limxtop.research", make sure that the name of authorities is the same with that of the codes below.

            // 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);

So, maybe your codes post here is not complete, there you should pass "my.package.name.fileprovider" as parameter some where.

In my case.

I have a library project .Let's call it :LibApk

When I code this : applicationId "my.package.name" in the build.grale(app)

when build gradle tell me that : Library projects cannot set applicationId.

applicationId is set to 'com.darcy.apkupdate' in default config.

So ,I delete applicationId "my.package.name" .

Then ,build.gradle look like this : enter image description here

But I forgot update the AndroidManifest.xml file which use ${applicationId}

enter image description here

This is the problem!!!

So I changed the variable to constant .The result looks like below picture: enter image description here

After This ,It's wokr for me!

Hope this is help you...

The problem here is, you use the class name .provider for authorities in manifest and use .fileprovider class name in java code.

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



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

Just rename fileprovider to provider

If the build's suffix is different, it makes sense to make a change like this.

FileProvider.getUriForFile(mContext.get(), BuildConfig.APPLICATION_ID + ".fileprovider", file)

In My Case;

Manifest File:

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

Code:

import androidx.multidex.BuildConfig // NOT DO THIS!!!

val uri = FileProvider.getUriForFile(this,
            BuildConfig.APPLICATION_ID+ ".provider", _tempFile)

Exception:

java.lang.IllegalArgumentException: Couldn't find meta-data for provider with authority androidx.multidex.provider

Do not use androidx.multidex.BuildConfig, Because this values are not the values of our application:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package androidx.multidex;

public final class BuildConfig {
    public static final boolean DEBUG = false;
    public static final String APPLICATION_ID = "androidx.multidex";
    public static final String BUILD_TYPE = "release";
    public static final String FLAVOR = "";
    public static final int VERSION_CODE = -1;
    public static final String VERSION_NAME = "";

    public BuildConfig() {
    }
}

{applicationId} == com.companyName.application append ".provider"

which will be == com.example.test.provider

in xml authorities:com.example.test.provider

in activity Uri mPath = FileProvider.getUriForFile(this, "com.example.example.provider", imageFile);

FileProvider.getUriForFile(this, "{yourPAckageName}.fileprovider",
                                file);

to

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

I spent a day finding a solution. This part is very important. That saved my day.

mImageFromCamera = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".fileprovider", mImageFile); android:authorities="${applicationId}.fileprovider"

authorities must be same in xml and in code

First you use

File(getExternalFilesDir(null),context?.getString(R.string.app_name));


instead of

Environment.getExternalStorageDirectory(), context?.getString(R.string.app_name) // this is deprecated in API29


then use this

Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);

For more help: File Provider Description

You can replace your BuildConfig import class file name:

import androidx.multidex.BuildConfig;

with:

import com.yourAppName.BuildConfig;

This is Because of this authority name difference

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

 here Look     
      
      <pre>android:authorities="${applicationId}.provider" </pre>
           

Here the authority name is you packagename.provider (com.example.app.provider)

        val uri: Uri? = FileProvider.getUriForFile(
        this.contexts,
        BuildConfig.APPLICATION_ID + ".provider",
        file
    )

whenever we copy paste the code the authority may be change from one source to another. in stackoverflow some devs put in manifest ${applicationId}.provider" and in uri they put (.fileprovider) FileProvider.getUriForFile( this.contexts, BuildConfig.APPLICATION_ID + ".fileprovider", file ) this is the problem now authority is different that is showing in log

what solved my problem is :

replace your paths app file by this : take a look at files root, i determined the path with my app package name, change the pkg name to yours.

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

and also in your provider use your package name instead of ${applicationId}

same as me here

<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.my.newproject4.provider"
android:exported="false"
android:grantUriPermissions="true">

<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>

this is what worked with me the only solution and way after long time of trying and searching just this was the problem

maybe it helps someone i hope for you a good luck

Change the authorities to a unique name to solve the issue like

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

also in java code

I just removed the '$' from android:authorities="${applicationId}.provider" and it works like a charm now.

Its fileprovider and not provider

android:authorities="${applicationId}.fileprovider"
Related