web-dev-qa-db-ja.com

android.support.v4.content.FileProviderクラスがAndroid Kitkatに見つかりません

アプリで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>

Android Lollipopバージョンを持つデバイスで正常に動作します。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'
}
10
Jaydip Kalkani

AndroidXに移行した場合は、AndroidManifest.xmlの名前をandroidx.core.content.FileProviderに変更する必要があります

それが私の場合のクラッシュでした。

18
peresisUser

同じ質問がありますが、このドキュメントは私の問題を解決します。 https://developer.Android.com/studio/build/multidexAndroid multidex

before Android 5.0、次の方法でmultidexを使用する必要があります。

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

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

次に、アプリケーションを変更し、次の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
RommiPljus

Android Multidexのドキュメントをよく読んだ後、一般的に見逃している構成がJava.lang.NoClassDefFoundErrorの原因であることがわかりました。65Kの参照制限で、まだ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は特別なクラスローダーを使用して、メインのclasses.dexファイルでのみ検索するのではなく、使用可能なすべてのDEXファイルでメソッドを検索します。

例外の原因:

Multidexアプリ用の各DEXファイルをビルドする場合、ビルドツールは複雑な意思決定を実行して、アプリが正常に起動できるように、プライマリDEXファイルで必要なクラスを決定します。 起動時に必要なクラスがプライマリDEXファイルで提供されていない場合、アプリはerror Java.lang.NoClassDefFoundErrorでクラッシュします。

これは、ビルドツールがこれらのコードパスを認識するため、アプリコードから直接アクセスされるコードでは発生しませんが、使用するライブラリに複雑な依存関係がある場合など、コードパスが見えにくい場合に発生する可能性があります。たとえば、コードがイントロスペクションまたはネイティブコードからのJavaメソッドの呼び出しを使用する場合、これらのクラスはプライマリDEXファイルで必要と認識されない場合があります。

したがって、Java.lang.NoClassDefFoundErrorを受け取った場合は、 multiDexKeepFile (上記を参照)または multiDexKeepProguard ドキュメントを参照 )ビルドタイプのプロパティ。 multiDexKeepFileまたはmultiDexKeepProguardファイルのいずれかでクラスが一致した場合、そのクラスはプライマリDEXファイルに追加されます。

Multidexの完全なドキュメントについては、 https://developer.Android.com/studio/build/multidex を参照してください

2
Monish Kamble

プロジェクトで「multiDexEnabled」をfalseに設定すると、エラーが修正されました。マニフェストに移動して追加

Android {

defaultConfig {
    multiDexEnabled false
}}

これがお役に立てば幸いです

2
Maysam R

中間フォルダーを削除するだけです。

Click here for structure

AndroidManifest.xmlをクリックして、「テキスト」と「マージされたマニフェスト」が表示されるファイルページの下部を見てから、「マージされたマニフェスト」をクリックします-> "「Android.support.v4.content.FileProvider」を検索して「androidx.core.content.FileProvider」

それ、それ、正確な解決策。

0
ozan

次のコードは私のために機能します(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>
0
xscoder