在 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 中 - 找不到类

Spring Data Projection and Error:“在结果元组中找不到别名!确保您的查询定义了别名!”

在android中找不到确切的当前位置

为啥在 Visual Studio 2019 (XAMARIN) 中找不到 Android 库