问题描述
在Android原生项目静态注册读写权限并实现动态获取权限,然后导出aar文件到Unity项目中进行build Android APK.
Apk打包完成后在Android手机中测试,发现获取不到手机读写权限,手机权限设置也并没有包含读写权限选项.
静态注册:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
权限设置界面:
解决方案
问题在与Unity BuildApk时最终生成的清单文件(AndroidManifest)下,读写权限的申请发生了改变
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
多了android:maxSdkVersion="18"的限制
它表示这项权限只在API Level 18)及以下的系统中需要使用。对API Level18以上的系统中不需要使用这项权限。
出现该问题的原因是Unity在Gradle模式下Build APK
Unity在Build的过程中会将项目内所有的jar,aar包的清单文件也就是AndroidManifest合并起来,这个过程中会产生合并冲突.
合并冲突,是指多个Manifest文件中含有同一属性但值不同时,默认合并规则解决不了从而导致的冲突。
当冲突发生时,高优先级的Manifest属性值会覆盖低优先级属性值。
所以我们只要使Unity 在buildApk时生成的最终清单文件没有android:maxSdkVersion="18"的限制问题就解决了.
Unity使用主的Android清单在Unity安装目录下(优先级最高)
我们需要重写主Android Manifest
虽然Unity可以给你生成一个正确的Android Manifest,但有些情况下你可能想直接使用你想要的内容。
所以我们在Assets/Plugins/Android目录下生成我们想要的AndroidManifest.Xml这将覆盖Unity创建的默认的清单。(如果你的Assets/Plugins/Android目录下有自己准备好的AndroidManifest.Xml则无需该操作)
然后添加读写权限(有读写权限则参考下面代码修改)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion" />
或
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="replace"/>
然后就可以重新BuildApk了
查看最终合并的清单文件:项目地址/Temp/gradleOut/build/intermediates/merged_manifests/debug/processDebugManifest/merged/AndroidManifest.xml
确定没有android:maxSdkVersion=“18” 的限制后,发送Apk到手机上运行会发现读写权限是可用的