我在我的应用中使用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'
}
答案 0 :(得分:4)
如果您已迁移到AndroidX,则必须将AndroidManifest.xml
中的名称更改为androidx.core.content.FileProvider
那是我的情况。
答案 1 :(得分:2)
答案 2 :(得分:2)
仔细阅读Android Multidex文档后,我发现通常会错过一种导致java.lang.NoClassDefFoundError
的配置。如果您已经完成了 65K参考限制 的常规multidex配置,但仍然无法摆脱java.lang.NoClassDefFoundError
,则必须执行以下步骤。
添加以下行(您将为其获取异常的绝对类名称)
android.support.v4.content.FileProvider
按如下所示修改您的build.gradle
android {
buildTypes {
release {
multiDexKeepFile file('multidex-config.txt')
...
}
}
}
注意:您可以通过在defaultConfig
中声明它来添加特定的构建类型或同时添加两者。
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应该帮助您