关于Android读写权限申请失败,无法使用的问题

问题描述

在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到手机上运行会发现读写权限是可用的

在这里插入图片描述

在最新版的Android Studio(通常指Android Studio 4.x及以上版本),应用程序在需要访问用户设备上的某些敏感数据或者功能时,会采用Android 6.0(API级别23)及以后引入的运行时权限机制。当你尝试访问如相机、存储、位置等权限时,系统不再像以前那样直接授予应用,而是会在第一次请求时询问用户。 在AndroidManifest.xml文件,你需要声明相应的<uses-permission>标签来获取权限,例如: ```xml <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 其他权限声明 --> <activity ...> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service ...> <!-- 如果你的服务需要特定权限 --> <permission android:name="your.package.permission.ACCESS_LOCATION" /> <uses-permission android:name="your.package.permission.ACCESS_LOCATION" /> </service> ``` 在实际的代码,你可以使用`ContextCompat.checkSelfPermission()`检查权限是否已授予,并通过` ActivityCompat.requestPermissions()`发起权限请求,比如: ```java if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION); } ``` 请求完成后,记得处理用户的响应,例如在`onRequestPermissionsResult()`回调处理结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值