Missing android.support.FILE_PROVIDER_PATHS meta-data

41.5k Views Asked by At

I am trying to open the pdf file which I downloaded & saved in external storage. But When I open my app its gets crashed and showing following error;

08-31 00:58:31.304 1807-1807/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: medimanage.corporate.mobile, PID: 1807
    java.lang.RuntimeException: Unable to get provider android.support.v4.content.FileProvider: java.lang.IllegalArgumentException: Missing android.support.FILE_PROVIDER_PATHS meta-data
    at android.app.ActivityThread.installProvider(ActivityThread.java:5856)
    at android.app.ActivityThread.installContentProviders(ActivityThread.java:5445)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5384)
    at android.app.ActivityThread.-wrap2(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1545)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
      Caused by: java.lang.IllegalArgumentException: Missing android.support.FILE_PROVIDER_PATHS meta-data
    at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:586)
    at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:557)
    at android.support.v4.content.FileProvider.attachInfo(FileProvider.java:375)
    at android.app.ActivityThread.installProvider(ActivityThread.java:5853)
    at android.app.ActivityThread.installContentProviders(ActivityThread.java:5445) 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5384) 
    at android.app.ActivityThread.-wrap2(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1545) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6119) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

Following is my async task where I download that pdf file & trying to open it.

package myPackageName.common.postData;    
public class DownloadFileFromURL extends AsyncTask<String, String, String> {

        private ProgressDialog Dialog;
        private Context mContext;
        private String folder_main; //= "TermCondition";
        private String fileName;//= "termCondition.pdf";
        String urlString;

        public DownloadFileFromURL(Context mContext, String folderName) {
            this.mContext = mContext;
            this.folder_main = folderName;
            Dialog = new ProgressDialog(this.mContext);
        }

        @Override
        protected String doInBackground(String... f_url) {
            try {
                urlString = f_url[0];
                URL url = new URL(f_url[0]);
                File folder = new File(Environment.getExternalStorageDirectory(), this.folder_main);
                if (folder.exists()) {
                    folder.mkdirs();
                } 
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.connect();
                InputStream inputStream = urlConnection.getInputStream();
                FileOutputStream fileOutputStream = new FileOutputStream(Environment.getExternalStorageDirectory() + "/" + "default.pdf");
                int totalSize = urlConnection.getContentLength();
                byte[] buffer = new byte[AccessibilityNodeInfoCompat.ACTION_DISMISS];
                while (true) {
                    int bufferLength = inputStream.read(buffer);
                    if (bufferLength <= 0) {
                        break;
                    }
                    fileOutputStream.write(buffer, 0, bufferLength);
                }
                fileOutputStream.close();
            } catch (FileNotFoundException e) {
                FileLog.e(mContext.getClass().getName(), e);
            } catch (MalformedURLException e2) {
                FileLog.e(mContext.getClass().getName(), e2);
            } catch (IOException e3) {
                FileLog.e(mContext.getClass().getName(), e3);
            }
            return null;
        }

        public void showPdf() {
            try {

                File file = new File(Environment.getExternalStorageDirectory() + "/" + "default.pdf");

                try {
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        Uri contentUri = FileProvider.getUriForFile(mContext, "medimanage.corporate.mobile.fileprovider", file);
                        intent.setDataAndType(contentUri, "application/pdf");
                    } else {
                        intent.setDataAndType(Uri.fromFile(file), "application/pdf");
                    }
                    mContext.startActivity(intent);
                } catch (ActivityNotFoundException anfe) {
                    Toast.makeText(mContext, "No activity found to open this attachment.", Toast.LENGTH_LONG).show();
                }

            } catch (Exception e) {
                FileLog.e(mContext.getClass().getName(), e);
            }
        }

        @Override
        protected void onPreExecute() {
            Dialog.setMessage("Downloading...");
            Dialog.setCancelable(false);
            Dialog.setCanceledOnTouchOutside(false);
            Dialog.show();
        }

        @Override
        protected void onPostExecute(String s) {
            this.Dialog.dismiss();
            showPdf();
            super.onPostExecute(s);
        }

    }

Following is AndroidManifest.xml

<application
...>
  <provider
      android:name="android.support.v4.content.FileProvider"
      android:authorities="myPackageName.fileprovider"
      android:exported="false"
      android:grantUriPermissions="true">
          <meta-data
             android:name="android.support.FILE_PROVIDE_PATHS"
             android:resource="@xml/provider_paths" />
  </provider>
</application>

And provider_paths.xml having following code;

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path path="Android/data/" name="files_root" />
    <external-path path="." name="external_storage_root" />
</paths>

I am trying to run above code in API 19 & API 25, but in both devices its gets crash. I am not able to find out where I am going wrong.

I have referred this question & also this link too but not able to find a solution to my issue.

11

There are 11 best solutions below

1
Skeeterdrums On BEST ANSWER

In your AndroidManifest file, you have a slight typo in the metadata:

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

You need to use FILE_PROVIDER_PATHS instead of FILE_PROVIDE_PATHS.

0
Ben Levi On

Seems like something is set wrong, The compiler doesn't find android.support.FILE_PROVIDER_PATHS , thus, it throws this error, check if everything is set correctly in your gradle file, if you change the package of the android.support this exception might arise.

After fixing, do a clean, rebuild, or clean and invalidate cache in Android studio.

0
Musthafa On

Please do invalidate caches and restart function in android studio, most probably that will do.

After that rebuild and run your app. In my case it worked perfectly fine.

0
krishnakeshan On

this is often caused by a typo, where you might use android:value instead of android:resource in the meta-data tag specifying the file_paths.xml file. For example you might have:

android:value="@xml/file_paths"

instead of

android:resource="@xml/file_paths"
1
Master Ahlong On

Android: Convert value + resource=@xml/file_paths"

0
pramod_m On

I recently faced the same issue. and no other solution worked for me. I closed the project from Android Studio and then manually deleted the .gradle and .idea files and it worked like a charm :) . And earlier i had an issue with the authorities - point it to the fileprovider you use with your applicationId . Hope this helps someone.

1
farid On

I had this problem,just delete all .gradle and and build folder and then rebuild app worked for me

0
Rahul Khatri On

Provider in AndroidManifest.xml, if you using AndroidX library.

  <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.yourdomain.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
0
jiawei.guo On

There was no problem when using before (same test machine), but suddenly this problem appeared, I do not know what the reason is.I looked up some references, changed the suffix, and the problem was solved

Previous code

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

The modified code

android:authorities="${applicationId}.fileprovider"
0
Michał Klimczak On

Sometimes everything with your code is just fine, but you switch branches and the old build intermediates are reused and this happens. For me, just removing the build/intermediates dir, and then building and running the app again worked. This is almost equivalent (but faster) to cleaning and rebuilding your project.

0
AndroidDev On

Old post but I had the same issue.

If you have a line that looks something like this:

FileProvider.getUriForFile(activity,"${BuildConfig.APPLICATION_ID}.fileProvider", tmpFile)

Just make sure that the fileProvider string matches exactly what is declared in your manifest:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileProvider" //<--MATCH THIS!!
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>
</provider>

And note that is is case sensitive.

That solved it for me, anyway.