在android Kitkat中找不到android.support.v4.content.FileProvider类

时间:2017-12-19 13:31:31

标签: android android-camera classnotfoundexception android-fileprovider

我在我的应用中使用FileProvider。像往常一样,我在<Provider>文件中声明AndroidManifest.xml标记,如下所示。

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

9 个答案:

答案 0 :(得分:4)

如果您已迁移到AndroidX,则必须将AndroidManifest.xml中的名称更改为androidx.core.content.FileProvider

那是我的情况。

答案 1 :(得分:2)

只需删除中间体文件夹。

Click here for structure

答案 2 :(得分:2)

仔细阅读Android Multidex文档后,我发现通常会错过一种导致java.lang.NoClassDefFoundError的配置。如果您已经完成了 65K参考限制 的常规multidex配置,但仍然无法摆脱java.lang.NoClassDefFoundError,则必须执行以下步骤。

  1. 在应用程序级别创建一个名为 multidex-config.txt 的文件(与build.gradle文件相同的目录)
  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文件中的方法(而不是仅在main classes.dex文件中搜索)。

异常原因:

  

为multidex应用程序构建每个DEX文件时,构建工具执行复杂的决策,以确定主DEX文件中需要哪些类,以便您的应用程序可以成功启动。 如果主DEX文件中未提供启动过程中所需的任何类,则您的应用会崩溃并显示错误 java.lang.NoClassDefFoundError

对于直接从您的应用程序代码访问的代码,这种情况不应该发生,因为构建工具可以识别这些代码路径,但是当代码路径不那么可见时(例如,当您使用的库具有复杂的依赖性时),就可能发生这种情况。例如,如果代码使用自省代码对Java方法的自省或调用,则在主DEX文件中可能无法按需识别这些类。

因此,如果您收到java.lang.NoClassDefFoundError,则必须通过使用 multiDexKeepFile (如上所示)或声明它们,在主DEX文件中手动指定这些其他类。您的构建类型中的multiDexKeepProguard refer documentation)属性。如果在multiDexKeepFile或multiDexKeepProguard文件中匹配了某个类,则将该类添加到主DEX文件中。

有关multidex的完整文档,请参考https://developer.android.com/studio/build/multidex

答案 3 :(得分:1)

在我的项目中设置“multiDexEnabled”false时,错误已修复。 去清单并添加

android {

defaultConfig {
    multiDexEnabled false
}}

希望这有用

答案 4 :(得分:1)

我有同样的问题,本文档解决了我的问题。 https://developer.android.com/studio/build/multidex android multidex

在android 5.0之前,您必须使用以下方法进行多义性操作:

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

希望这可以解决您的问题。

答案 5 :(得分:0)

单击“ AndroidManifest.xml”,在文件页面底部看到“文本”和“合并的清单”,然后单击“合并的清单”->搜索“ android.support.v4.content.FileProvider”,然后使用“ androidx.core.content.FileProvider”对其进行更改

就这样,确切的解决方法。

答案 6 :(得分:0)

以下代码对我有用(我已迁移到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>

答案 7 :(得分:0)

改变

<provider android:name="android.support.v4.content.FileProvider"

<provider android:name="androidx.core.content.FileProvider"

经过测试并适合我

答案 8 :(得分:-2)

FileProvider是在Android API Level 22(Lollipop)中引入的,这就是为什么在Lollipop设备上测试时没有遇到ClassNotFoundException的原因。 Android Kitkat没有FileProvider类,因此您将面临异常。如果您要访问文件this post应该帮助您