web-dev-qa-db-fra.com

android.support.v4.content.FileProvider classe introuvable dans Android Kitkat

J'utilise FileProvider dans mon application. Comme d'habitude, j'ai déclaré la balise <Provider> dans le fichier AndroidManifest.xml comme ci-dessous.

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

Lorsque je l'exécute sur un appareil Android doté de la version Lollipop, cela fonctionne correctement. quand je l'essaie sur la version KitKat, il affiche les erreurs suivantes:

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)

J'avais essayé beaucoup de solutions comme ça mais ça ne marche pas pour moi. alors aidez-moi à résoudre ce problème.

dépendances 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'
}
4
Jaydip Kalkani

Après avoir lu attentivement la documentation Android Multidex, j’ai constaté qu’il nous manque généralement une configuration qui provoque Java.lang.NoClassDefFoundError. Si vous avez effectué une configuration multidex standard pour limite de référence de 65 K et que vous ne pouvez toujours pas vous débarrasser de Java.lang.NoClassDefFoundError, vous devez suivre ces étapes.

  1. Créez un fichier appelé multidex-config.txt au niveau de l'application (même répertoire que le fichier build.gradle)
  2. Ajouter la ligne suivante (le nom de classe absolu pour lequel vous obtenez une exception)

    Android.support.v4.content.FileProvider
    
  3. Modifiez votre build.gradle comme suit

    Android {
        buildTypes {
            release {
                multiDexKeepFile file('multidex-config.txt')
                ...
            }
        }
    } 
    

    Remarque: Vous pouvez l'ajouter pour un type de construction spécifique ou les deux en le déclarant dans defaultConfig.

Que se passe-t-il lorsque vous créez une application compatible multidex:

Les outils de construction Android construisent un fichier DEX principal (classes.dex) et prennent en charge les fichiers DEX (classes2.dex, classes3.dex, etc.) selon les besoins. Le système de compilation regroupe ensuite tous les fichiers DEX dans votre APK.

Au moment de l'exécution, les API multidex utilisent un chargeur de classes spécial pour rechercher tous vos fichiers DEX disponibles dans vos méthodes (au lieu de rechercher uniquement dans le fichier classes.dex principal).

Cause d'exception:

Lors de la création de chaque fichier DEX pour une application multidex, les outils de génération prennent des décisions complexes pour déterminer les classes nécessaires dans le fichier DEX principal afin que votre application puisse démarrer avec succès. Si aucune classe requise au démarrage n'est fournie dans le fichier DEX principal, votre application se bloque alors avec l'erreurJava.lang.NoClassDefFoundError.

Cela ne devrait pas arriver pour le code auquel on accède directement à partir du code de votre application car les outils de génération reconnaissent ces chemins de code, mais cela peut se produire lorsque les chemins de code sont moins visibles, par exemple lorsqu'une bibliothèque que vous utilisez possède des dépendances complexes. Par exemple, si le code utilise l'introspection ou l'invocation de méthodes Java à partir de code natif, il est possible que ces classes ne soient pas reconnues comme requises dans le fichier DEX principal.

Donc, si vous recevez Java.lang.NoClassDefFoundError, vous devez alors spécifier manuellement ces classes supplémentaires comme requis dans le fichier DEX primaire en les déclarant avec le multiDexKeepFile (illustré ci-dessus) ou le multiDexKeepProguard ( reportez-vous à la documentation ) propriété dans votre type de construction. Si une classe correspond dans le fichier multiDexKeepFile ou multiDexKeepProguard, cette classe est ajoutée au fichier DEX principal.

Pour une documentation complète sur multidex, consultez https://developer.Android.com/studio/build/multidex

2
Monish Kamble

Supprimez simplement le dossier des intermédiaires.

 Click here for structure

2

J'ai la même question et cette documentation résout mon problème. https://developer.Android.com/studio/build/multidexAndroid multidex

avant Android 5.0, vous devez utiliser les méthodes suivantes pour utiliser Multidex:

Android {
defaultConfig {
    ...
    minSdkVersion 15
    targetSdkVersion 28
    multiDexEnabled true
}
...
}

dependencies {
  compile 'com.Android.support:multidex:1.0.3'
}

puis modifier l'application, sélectionnez l'une des trois méthodes suivantes:

si vous n'implémentez pas l'application:

<?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>

si vous avez une application personnalisée, vous pouvez modifier comme ceci:

public class MyApplication extends MultiDexApplication { ... }

si vous avez remplacé l'application de base, vous pouvez modifier comme ceci:

public class MyApplication extends SomeOtherApplication {
   @Override
   protected void attachBaseContext(Context base) {
      super.attachBaseContext(base);
      MultiDex.install(this);
   }
}

J'espère que cela peut résoudre votre problème.

1
RommiPljus

dans mon projet lorsque "multiDexEnabled" est défini sur false, erreur corrigée . aller au fichier manifeste et ajouter 

Android {

defaultConfig {
    multiDexEnabled false
}}

espérons que cela vous sera utile

1
Maysam R