【问题标题】:android.support.v4.content.FileProvider class not found in android Kitkat在 android Kitkat 中找不到 android.support.v4.content.FileProvider 类
【发布时间】: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 文件中。

标签: android android-camera classnotfoundexception android-fileprovider


【解决方案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,那么您必须按照以下步骤操作。

          1. 在应用级别(与 build.gradle 文件相同的目录)创建一个名为 multidex-config.txt 的文件
          2. 添加以下行(您获得异常的绝对类名)

            android.support.v4.content.FileProvider
            
          3. 如下修改你的 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。
              猜你喜欢
              • 1970-01-01
              • 2018-11-10
              • 2014-10-07
              • 1970-01-01
              • 2021-11-16
              • 2012-04-29
              • 2017-02-08
              • 2013-05-14
              • 1970-01-01
              相关资源
              最近更新 更多