缺少 android.support.FILE_PROVIDER_PATHS 元数据
Missing android.support.FILE_PROVIDER_PATHS meta-data
我正在尝试打开我下载并保存在外部存储器中的 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 和 API 25 中的代码,但在这两种设备中它都会崩溃。我无法找出哪里出错了。
我也提到了 this question & also this link,但找不到解决我的问题的方法。
似乎设置有误,编译器找不到 android.support.FILE_PROVIDER_PATHS ,因此会抛出此错误,请检查 gradle 文件中的所有设置是否正确,如果您更改android.support 的包可能会出现此异常。
修复后,在 Android studio 中进行清理、重建或清理并使缓存失效。
在您的 AndroidManifest 文件中,您的元数据中有一个轻微的拼写错误:
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS" <-- HERE!!!
android:resource="@xml/provider_paths" />
您需要使用 FILE_PROVIDER_PATHS 而不是 FILE_PROVIDE_PATHS。
请在 android studio 中使缓存无效并重新启动功能,很可能会这样。
之后重建并 运行 您的应用。就我而言,它工作得很好。
这通常是由拼写错误引起的,您可以使用 android:value 而不是 android:resource 在指定 file_paths.xml 文件的元数据标记中。例如,您可能有:
android:value="@xml/file_paths"
而不是
android:resource="@xml/file_paths"
Android:转换值+资源=@xml/file_paths"
我最近遇到了同样的问题。没有其他解决方案对我有用。我从 Android Studio 关闭了项目,然后手动删除了 .gradle 和 .idea 文件,它的效果非常好:)。早些时候我遇到了当局的问题 - 将其指向您与 applicationId 一起使用的文件提供者。希望这对某人有所帮助。
我遇到了这个问题,只需删除所有 .gradle 并构建文件夹,然后重建对我有用的应用程序
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>
之前用的时候没有问题(同机测试),突然出现这个问题,不知道是什么原因is.I查了一些资料,改了后缀,问题就解决了
前一个代码
android:authorities="${applicationId}.provider"
修改后的代码
android:authorities="${applicationId}.fileprovider"
有时您的代码中的一切都很好,但是您切换分支并且旧的构建中间体被重用,这种情况就会发生。对我来说,只需删除 build/intermediates
目录,然后重新构建并 运行 应用程序即可。这几乎等同于(但更快)清理和重建您的项目。
旧 post 但我有同样的问题。
如果您有这样一行:
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>
请注意 区分大小写。
无论如何,这对我来说已经解决了。
我正在尝试打开我下载并保存在外部存储器中的 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 和 API 25 中的代码,但在这两种设备中它都会崩溃。我无法找出哪里出错了。
我也提到了 this question & also this link,但找不到解决我的问题的方法。
似乎设置有误,编译器找不到 android.support.FILE_PROVIDER_PATHS ,因此会抛出此错误,请检查 gradle 文件中的所有设置是否正确,如果您更改android.support 的包可能会出现此异常。
修复后,在 Android studio 中进行清理、重建或清理并使缓存失效。
在您的 AndroidManifest 文件中,您的元数据中有一个轻微的拼写错误:
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS" <-- HERE!!!
android:resource="@xml/provider_paths" />
您需要使用 FILE_PROVIDER_PATHS 而不是 FILE_PROVIDE_PATHS。
请在 android studio 中使缓存无效并重新启动功能,很可能会这样。
之后重建并 运行 您的应用。就我而言,它工作得很好。
这通常是由拼写错误引起的,您可以使用 android:value 而不是 android:resource 在指定 file_paths.xml 文件的元数据标记中。例如,您可能有:
android:value="@xml/file_paths"
而不是
android:resource="@xml/file_paths"
Android:转换值+资源=@xml/file_paths"
我最近遇到了同样的问题。没有其他解决方案对我有用。我从 Android Studio 关闭了项目,然后手动删除了 .gradle 和 .idea 文件,它的效果非常好:)。早些时候我遇到了当局的问题 - 将其指向您与 applicationId 一起使用的文件提供者。希望这对某人有所帮助。
我遇到了这个问题,只需删除所有 .gradle 并构建文件夹,然后重建对我有用的应用程序
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>
之前用的时候没有问题(同机测试),突然出现这个问题,不知道是什么原因is.I查了一些资料,改了后缀,问题就解决了
前一个代码
android:authorities="${applicationId}.provider"
修改后的代码
android:authorities="${applicationId}.fileprovider"
有时您的代码中的一切都很好,但是您切换分支并且旧的构建中间体被重用,这种情况就会发生。对我来说,只需删除 build/intermediates
目录,然后重新构建并 运行 应用程序即可。这几乎等同于(但更快)清理和重建您的项目。
旧 post 但我有同样的问题。
如果您有这样一行:
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>
请注意 区分大小写。
无论如何,这对我来说已经解决了。