web-dev-qa-db-fra.com

Données de métadonnées Android.support.FILE_PROVIDER_PATHS manquantes

J'essaie d'ouvrir le fichier pdf que j'ai téléchargé et enregistré dans un stockage externe. Mais lorsque j'ouvre mon application, il se plante et affiche l'erreur suivante.

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) 

Voici ma tâche async où je télécharge ce fichier pdf en essayant de l’ouvrir.

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

    }

Ce qui suit est 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>

Et provider_paths.xml ayant le code suivant;

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

J'essaie d'exécuter le code ci-dessus dans l'API 19 et l'API 25, mais cela provoque un crash dans les deux périphériques. Je ne suis pas en mesure de savoir où je me trompe.

J'ai référé cette question & aussi ce lien aussi, mais incapable de trouver une solution à mon problème.

6
priyanka kamthe

Dans votre fichier AndroidManifest, vous avez une légère faute de frappe dans les métadonnées:

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

FILE_PROVIDER_PATHS au lieu de FILE_PROVIDE_PATHS.

6
Skeeterdrums

S'il vous plaît, invalidez les caches et redémarrez la fonction dans le studio Android, probablement.

Après cela, reconstruisez et lancez votre application. Dans mon cas, cela a parfaitement fonctionné.

3
Musthafa

On dirait que quelque chose ne va pas. Le compilateur ne trouve pas Android.support.FILE_PROVIDER_PATHS. Il renvoie donc cette erreur, vérifie si tout est correctement défini dans votre fichier Gradle. Si vous modifiez le package de Android.support, cette exception pourrait survenir.

Après la réparation, effectuez un nettoyage, une reconstruction ou un nettoyage et invalidation du cache dans Android Studio.

1
Ben Levi