ClassNotFoundException:在androidx迁移后没有找到类"android.support.v4.content.FileProvider"

Pet*_*uin 23 java android android-studio androidx

我正在尝试迁移到androidx.我在Android Studio中使用了迁移工具.当我这样做时,我运行我的应用程序时得到以下堆栈跟踪.

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.peerke.outdoorpuzzlegame.debug, PID: 10901
    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.peerke.outdoorpuzzlegame.debug-IBtFsngoLqc-cQb_hOO5wQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.peerke.outdoorpuzzlegame.debug-IBtFsngoLqc-cQb_hOO5wQ==/lib/x86, /system/lib]]
        at android.app.ActivityThread.installProvider(ActivityThread.java:6376)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5932)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5847)
        at android.app.ActivityThread.access$1000(ActivityThread.java:198)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1637)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6649)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.content.FileProvider" on path: DexPathList[[zip file "/data/app/com.peerke.outdoorpuzzlegame.debug-IBtFsngoLqc-cQb_hOO5wQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.peerke.outdoorpuzzlegame.debug-IBtFsngoLqc-cQb_hOO5wQ==/lib/x86, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:125)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at android.app.AppComponentFactory.instantiateProvider(AppComponentFactory.java:121)
        at androidx.core.app.CoreComponentFactory.instantiateProvider(CoreComponentFactory.java:62)
        at android.app.ActivityThread.installProvider(ActivityThread.java:6360)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5932) 
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5847) 
        at android.app.ActivityThread.access$1000(ActivityThread.java:198) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1637) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6649) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826) 
Run Code Online (Sandbox Code Playgroud)

例外是正确的.android.support.v4.content.FileProvider在我的应用程序中不存在.但androidx.core.content.FileProvider包含在我的应用程序中.最大的问题是它为什么要加载旧版本的FileProvider?

Yos*_*aya 69

感谢@CommonsWare

更多解释:

怎么做,找到android.support.v4.FileProvider你<provider>的AndroidManifest.xml.

将其更改为 androidx.core.content.FileProvider

  • 您可以在这里找到androidx迁移的完整列表:https://developer.android.com/jetpack/androidx/migrate (2认同)
  • 这是一个完整的“复制粘贴”答案。 (2认同)

Com*_*are 32

为什么要加载旧版本的FileProvider?

根据堆栈跟踪,您可能仍在<provider>清单中的元素中使用旧包名称.

  • 你救了我的一天! (2认同)

Att*_*lah 22

在manifiedt.xml文件中,只需更改此内容

<provider
        android:name="android.support.v4.content.FileProvider"
      .....
</provider>
Run Code Online (Sandbox Code Playgroud)

到这个

<provider
    android:name="androidx.core.content.FileProvider"
    ......
</provider>
Run Code Online (Sandbox Code Playgroud)

或简单地

  • 转到重构(Studio->菜单->重构)
  • 点击迁移到AndroidX。它正在工作
  • 它正在工作。