缺少android.support.FILE_PROVIDER_PATHS元数据

时间:2017-08-31 05:22:27

标签: android android-file android-fileprovider

我正在尝试打开我下载的pdf文件&保存在外部存储器中。但是当我打开我的应用程序时,它会崩溃并显示以下错误;

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) 

以下是我的异步任务,我下载该pdf文件&试图打开它。

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

    }

以下是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>

并且provider_paths.xml具有以下代码;

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

我正在尝试在API 19&amp; API 25,但在两个设备中它都会崩溃。我无法找出我出错的地方。

我已提到this question&amp;也是this link,但无法找到我的问题的解决方案。

11 个答案:

答案 0 :(得分:6)

在AndroidManifest文件中,元数据中有一个小错误:

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

FILE_PROVIDER_PATHS而不是FILE_PROVIDE_PATHS。

答案 1 :(得分:3)

请在android studio中使缓存和重启功能无效,很可能会这样做。

重建并运行您的应用程序之后。在我的情况下,它工作得很好。

答案 2 :(得分:1)

似乎设置错误,编译器找不到android.support.FILE_PROVIDER_PATHS,因此,它会抛出此错误,检查gradle文件中是否所有设置都正确,如果更改android.support的包可能会出现此异常。

修复后,在Android工作室中执行清理,重建或清理并使缓存无效。

答案 3 :(得分:1)

使用之前(同一台测试机)时没有问题,但是突然出现了这个问题,我不知道是什么原因。我查阅了一些参考资料,更改了后缀,问题得以解决

先前的代码

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

修改后的代码

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

答案 4 :(得分:0)

Android:转换值+ resource = @ xml / file_paths“

答案 5 :(得分:0)

我最近遇到了同样的问题。没有其他解决方案对我有用。我从Android Studio关闭了该项目,然后手动删除了.gradle和.idea文件,它的工作原理很像::。之前,我在权限方面遇到了问题-将其指向您与applicationId一起使用的fileprovider。希望这对某人有帮助。

答案 6 :(得分:0)

AndroidManifest.xml中的提供程序,如果您使用的是AndroidX库。

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

答案 7 :(得分:0)

有时候,您的代码中的所有内容都很好,但是您切换了分支,并且旧的构建中间件被重用,并且会发生这种情况。对我来说,只需删除build/intermediates目录,然后再次构建并运行该应用程序即可。这几乎与清理和重建项目等效(但更快)。

答案 8 :(得分:0)

旧帖子,但我遇到了同样的问题。

如果你有一行看起来像这样:

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

只需确保 fileProvider 字符串完全匹配您的清单中声明的​​内容:

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

请注意区分大小写

无论如何,这为我解决了问题。

答案 9 :(得分:-1)

这通常是由错字引起的,您可以在指定 file_paths的元数据标记中使用 android:value 而不是 android:resource 。 xml 文件。例如,您可能有:

android:value="@xml/file_paths"

代替

android:resource="@xml/file_paths"

答案 10 :(得分:-1)

我遇到了这个问题,只需删除所有.gradle并构建文件夹,然后重新构建适用于我的应用程序