Невозможно получить поставщика androidx.core.content.FileProvider ClassNotFoundException при попытке создать плагин Android для Unity - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь создать плагин для Android для unity3d, который просто делится снимком экрана с другим приложением через FileProvider.
Я перенес свой проект в androidx.
Я использовал класс androidx.core.content.FileProvider.
При запуске приложения происходит сбой со следующим Logcat:

2018-12-22 21:46:13.678 14755-14755/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.anascompany.testandroidplugin, PID: 14755
java.lang.RuntimeException: Unable to get provider androidx.core.content.FileProvider: java.lang.ClassNotFoundException: Didn't find class "androidx.core.content.FileProvider" on path: DexPathList[[zip file "/data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/base.apk"],nativeLibraryDirectories=[/data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/lib/x86, /data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/base.apk!/lib/x86, /system/lib]]
    at android.app.ActivityThread.installProvider(ActivityThread.java:6396)
    at android.app.ActivityThread.installContentProviders(ActivityThread.java:5938)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5853)
    at android.app.ActivityThread.access$1100(ActivityThread.java:199)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    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:858)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.core.content.FileProvider" on path: DexPathList[[zip file "/data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/base.apk"],nativeLibraryDirectories=[/data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/lib/x86, /data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/base.apk!/lib/x86, /system/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    at android.app.AppComponentFactory.instantiateProvider(AppComponentFactory.java:121)

Я искал проблему и пытался выполнить следующее:
1. Проблема MultiDex.
Для того, чтобылегко включив MultiDex в свой проект, я изменил минимальный SDK на API 23 Marshmallow 6.0.
Где документация по Android говорит, что для включения MultiDex необходимо добавить multiDexEnabled true в defaultConfig в файле build.gradleдля указанного модуля.
Примечание: в документации сказано, что это единственный шаг, необходимый для включения MultiDex, если минимальный SDK установлен на API 21 или выше.
2. Неправильная проблема с пакетом (полагаю, это проблема).
до androidx мы использовали этот пакет: com.android.support:support-v4 поэтому в соответствии с этой страницей вы должны заменить предыдущуюПакет us: androidx.legacy:legacy-support-v4:1.0.0, а также заменил android.support.v4.content.FileProvider на androidx.core.content.FileProvider.
. Вот мой манифест Android:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.anascompany.unity">
<application>
    <provider
        android:authorities="com.anascompany.unity.fileprovider"
        android:name="androidx.core.content.FileProvider"
        android:grantUriPermissions="true"
        android:exported="false">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/filepaths" />
    </provider>
</application>


, а вот мой файл build.gradle.для моего модуля:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28
    defaultConfig {
    minSdkVersion 23
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    multiDexEnabled true
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 
'proguard-rules.pro'
    }
}
productFlavors {
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'androidx.appcompat:appcompat:1.1.0-alpha01'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
}

task copyPlugin(type: Copy){
    dependsOn assemble
    from ('build/outputs/aar')
    into ('../../Assets/Plugins/Android')
    include (project.name + '-release.aar')
}


Примечание. Целевой SDK для Android и Studio установлен на 28 "Android Pie".
Примечание: мой вопросотличается от этого один , потому что я уже включил в манифест androidx.core.content.FileProvider

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Наконец-то я получил решение, это так просто.Просто скопируйте вручную «support-v4-24.1.1.aar» в папку проекта «Плагин единства».Или другой файл поддержки AAR Android.Поставляется с SDK.В моем случае файл находился в "C: \ AndroidSDK \ extras \ android \ m2repository \ com \ android \ support \ support-v4 \ 24.1.1"

Независимо от версии, но вы должны быть уверены, что "FileProvider "класс находится внутри файла.Вы можете легко распаковать файл aar с помощью winrar и быть уверенным, что класс там.

--- ОБНОВЛЕНО ---

В заключение: inside / yourProjectFolder / Assets / Plugins скопируйте вашUnity-release.aar скомпилированный модуль Android и вручную тоже support-v4-24.1.1.aar (или другой вариант, мой размер около 1 МБ)

Вот мой манифест:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.unity">
<application>
 <provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.example.unity.fileprovider"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/filepaths" />
 </provider>
</application>
</manifest>

А вот и мой модуль build.gradle:

dependencies {
  implementation fileTree(include: ['*.jar'], dir: 'libs')
  implementation 'com.android.support:appcompat-v7:28.0.0'
  testImplementation 'junit:junit:4.12'
  androidTestImplementation 'com.android.support.test:runner:1.0.2'
  androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

Надеюсь, это поможет вам и другим.

0 голосов
/ 09 января 2019

Изменить на

реализация 'androidx.core: core: 1.0.1'

<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_provider_paths" />
</provider>
...