我正在尝试为unity3d构建一个Android插件,该插件只需通过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 documentation说要包括MultiDex,您需要在buildConfig.gradle文件中为指定模块的defaultConfig中添加multiDexEnabled true
。
注意:文档说,如果最低SDK设置为API 21或更高版本,这是包括MultiDex所需的唯一步骤。
2.错误的包装问题(我想是问题所在)。
在androidx之前,我们使用了以下软件包:com.android.support:support-v4
,因此根据此page,您应该将之前的软件包替换为: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”。
注意:我的问题与此one不同,因为我已经包含在清单androidx.core.content.FileProvider
答案 0 :(得分:2)
最后,我得到了解决方案,它是如此的简单。只需将“ support-v4-24.1.1.aar”手动复制到插件unity项目文件夹中即可。或其他支持Aar的android文件。它随SDK一起提供。 就我而言,该文件位于“ C:\ AndroidSDK \ extras \ android \ m2repository \ com \ android \ support \ support-v4 \ 24.1.1”
无论版本如何,但您都应确保“ FileProvider”类位于文件内部。您可以使用winrar简单地解压缩aar文件,并确保该类在其中。
---更新---
总而言之:在/ yourProjectFolder / Assets / Plugins内部复制您的unity-release.aar编译的android模块,并手动复制support-v4-24.1.1.aar(或其他版本,我的大小接近1MB)< / p>
这是我的清单:
<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'
}
希望它对您和其他人有帮助。
答案 1 :(得分:1)
更改为
实现'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>