在 android Kitkat 中找不到 android.support.v4.content.FileProvider 类
Posted
技术标签:
【中文标题】在 android Kitkat 中找不到 android.support.v4.content.FileProvider 类【英文标题】:android.support.v4.content.FileProvider class not found in android Kitkat 【发布时间】:2018-06-01 22:58:52 【问题描述】:我在我的应用程序中使用FileProvider
。像往常一样,我在androidManifest.xml
文件中声明了<Provider>
标记,如下所示。
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.jk.android.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
当我在具有lollipop
版本的android 设备上运行它时,它运行良好。当我在kitkat
版本上尝试它时,它显示以下错误:
FATAL EXCEPTION: main
Process: com.jk.android.perfectphotoeditor2018, PID: 24992
java.lang.RuntimeException: Unable to get provider android.support.v4.content.FileProvider: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.content.FileProvider" on path: DexPathList[[zip file "/data/app/com.jk.android.perfectphotoeditor2018-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.jk.android.perfectphotoeditor2018-2, /system/lib]]
at android.app.ActivityThread.installProvider(ActivityThread.java:5071)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4648)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4588)
at android.app.ActivityThread.access$1500(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1290)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:932)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:748)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.content.FileProvider" on path: DexPathList[[zip file "/data/app/com.jk.android.perfectphotoeditor2018-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.jk.android.perfectphotoeditor2018-2, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
at android.app.ActivityThread.installProvider(ActivityThread.java:5056)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4648)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4588)
at android.app.ActivityThread.access$1500(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1290)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:932)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:748)
at dalvik.system.NativeStart.main(Native Method)
我尝试了许多解决方案,例如this,但它对我不起作用。所以,帮我解决这个问题。
build.gradle 依赖项:
dependencies
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2',
exclude group: 'com.android.support', module: 'support-annotations'
)
configurations.all
resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
testCompile 'junit:junit:4.12'
/* Add the CSDK framework dependencies (Make sure these version numbers are correct) */
// compile 'com.aviary.android.feather.sdk:aviary-sdk:3.6.3'
compile 'com.android.support:appcompat-v7:25.4.0'
compile 'com.adobe.creativesdk.foundation:auth:0.9.1251'
compile 'com.adobe.creativesdk:image:4.8.4'
compile 'com.localytics.android:library:4.0.1'
compile 'com.android.support:design:25.4.0'
compile 'com.android.support:multidex:1.0.2'
compile 'com.android.support:support-v4:25.4.0'
compile 'com.intuit.sdp:sdp-android:1.0.4'
compile 'com.github.bumptech.glide:glide:4.3.1'
compile 'com.google.android.gms:play-services-ads:9.4.0'
implementation 'com.android.support:support-v4:25.4.0'
【问题讨论】:
发布您的 build.gradle 文件(仅限dependencies
部分)——还有什么是完整的堆栈跟踪?
签出我使用过的依赖项的编辑问题@pskink
"当我在 kitkat 版本上尝试它时,它显示 ClassnotfoundException 。" -- 请编辑您的问题并发布整个 Java 堆栈跟踪。
再次结帐...我编辑了你说的问题@CommonsWare
您是否启用了multidex
?如果是这样,您可能需要采取一些措施来确保 FileProvider
在主 DEX 文件中。
【参考方案1】:
如果您已迁移到 AndroidX,则必须将 AndroidManifest.xml
中的名称更改为 androidx.core.content.FileProvider
这就是我的崩溃。
【讨论】:
【参考方案2】:我有同样的问题,这个文档解决了我的问题。 https://developer.android.com/studio/build/multidexandroid multidex
在android 5.0之前,你必须使用以下方式进行multidex:
android
defaultConfig
...
minSdkVersion 15
targetSdkVersion 28
multiDexEnabled true
...
dependencies
compile 'com.android.support:multidex:1.0.3'
然后修改应用,选择以下三种方式之一:
如果您不实施应用程序:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:name="android.support.multidex.MultiDexApplication" >
...
</application>
</manifest>
如果你有自定义应用,你可以这样修改:
public class MyApplication extends MultiDexApplication ...
如果你有替换基础应用,你可以这样修改:
public class MyApplication extends SomeOtherApplication
@Override
protected void attachBaseContext(Context base)
super.attachBaseContext(base);
MultiDex.install(this);
希望这能解决你的问题。
【讨论】:
【参考方案3】:以下代码适用于我(我已迁移到 AndroidX):
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="$applicationId.provider"
android:exported="false"
android:grantUriPermissions="true"
tools:ignore="WrongManifestParent">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
【讨论】:
【参考方案4】:在我的项目中,当设置“multiDexEnabled”为 false 时,错误已修复。 转到清单并添加
android
defaultConfig
multiDexEnabled false
希望对你有帮助
【讨论】:
你也可以删除它。 multiDexEnabled true 对我来说是必需的,任何其他解决方案【参考方案5】:只需删除中间文件夹即可。
【讨论】:
【参考方案6】:在仔细阅读了 Android Multidex 文档后,我发现有一个配置我们通常会错过导致java.lang.NoClassDefFoundError
。如果您已经为 65K 引用限制 进行了常规的 multidex 配置,但仍然无法摆脱 java.lang.NoClassDefFoundError
,那么您必须按照以下步骤操作。
-
在应用级别(与 build.gradle 文件相同的目录)创建一个名为 multidex-config.txt 的文件
添加以下行(您获得异常的绝对类名)
android.support.v4.content.FileProvider
如下修改你的 build.gradle
android
buildTypes
release
multiDexKeepFile file('multidex-config.txt')
...
注意:您可以通过在defaultConfig
中声明来为特定的构建类型添加它或两者兼而有之。
当您构建启用了 multidex 的应用程序时会发生什么:
Android 构建工具会根据需要构建一个主 DEX 文件 (classes.dex) 和支持 DEX 文件(classes2.dex、classes3.dex 等)。然后构建系统将所有 DEX 文件打包到您的 APK 中。
在运行时,multidex API 使用特殊的类加载器来搜索所有可用的 DEX 文件以查找您的方法(而不是仅在主 classes.dex 文件中搜索)。
异常原因:
在为 multidex 应用程序构建每个 DEX 文件时,构建工具会执行复杂的决策,以确定主 DEX 文件中需要哪些类,以便您的应用程序能够成功启动。 如果主 DEX 文件中未提供启动期间所需的任何类,则您的应用会崩溃并显示错误
java.lang.NoClassDefFoundError
。
对于直接从您的应用代码访问的代码不应发生这种情况,因为构建工具会识别这些代码路径,但是当代码路径不太明显时(例如您使用的库具有复杂的依赖项)时可能会发生这种情况。例如,如果代码使用自省或从本机代码调用 Java 方法,则这些类可能不会被识别为主 DEX 文件中的要求。
因此,如果您收到java.lang.NoClassDefFoundError
,那么您必须在主 DEX 文件中手动指定这些附加类,方法是使用 multiDexKeepFile(如上所示)或 multiDexKeepProguard (refer documentation) 构建类型中的属性。如果一个类在 multiDexKeepFile 或 multiDexKeepProguard 文件中匹配,则该类被添加到主 DEX 文件中。
有关 multidex 的完整文档,请参阅 https://developer.android.com/studio/build/multidex
【讨论】:
这并不能解决我的问题。仔细看看这个答案/在multidex docs上要求的例外是java.lang.ClassNotFoundException
vs. java.lang.NoClassDefFoundError
。
@martn_st 你能发布堆栈跟踪吗?【参考方案7】:
点击 AndroidManifest.xml 查看文件页面底部,您会看到“Text”和“Merged Manifes”,然后点击“Merged Manifest” -> 搜索“android.support.v4.content.FileProvider”然后用“androidx.core.content.FileProvider”改变它
就是这样,精确的解决方案。
【讨论】:
【参考方案8】:改变
<provider android:name="android.support.v4.content.FileProvider"
到
<provider android:name="androidx.core.content.FileProvider"
经过测试并为我工作
【讨论】:
【参考方案9】:FileProvider 是在 Android API Level 22 中引入的,即 Lollipop,这就是为什么在 Lollipop 设备上进行测试时不会遇到 ClassNotFoundException 的原因。 Android Kitkat 没有 FileProvider 类,因此您面临异常。如果您正在寻找访问文件 this post 应该可以帮助您
【讨论】:
FileProvider
来自支持库。它已添加到库的版本 22.1.0
中的支持库中。它至少可以回溯到 Android 4.0.3。以上是关于在 android Kitkat 中找不到 android.support.v4.content.FileProvider 类的主要内容,如果未能解决你的问题,请参考以下文章
错误:在包“android”中找不到属性“requestLegacyExternalStorage”和“preserveLegacyExternalStorage”的资源标识符
为啥 Json 对象顺序在 android KITKAT 及以下版本中混淆?
4.4 kitkat 中的 NoClassDefFoundError 但不在 5.0 Lollipop 中 - 找不到类