Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Missing android.support.FILE_PROVIDER_PATHS meta-data

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.

like image 957
priyanka kamthe Avatar asked Aug 31 '17 05:08

priyanka kamthe


5 Answers

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.

like image 158
Skeeterdrums Avatar answered Nov 15 '22 06:11

Skeeterdrums


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"
like image 20
jiawei.guo Avatar answered Sep 21 '22 12:09

jiawei.guo


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.

like image 5
Musthafa Avatar answered Nov 15 '22 06:11

Musthafa


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.

like image 4
Ben Levi Avatar answered Nov 15 '22 07:11

Ben Levi


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>
like image 3
Rahul Khatri Avatar answered Nov 15 '22 06:11

Rahul Khatri