Android Fragment运行时申请STORAGE权限无弹窗不生效原因排查
问题排查与修复方案
1. 方法调用与参数类型错误
你两段代码都存在调用错误:
- 第一段调用的
requestPermissions如果是Fragment自带的方法,本身只接受2个参数(权限数组、请求码),你多传入了requireActivity()作为第一个参数,不存在匹配的方法签名,代码实际没有执行权限申请逻辑 - 两段代码的第二个参数都传入了单个权限字符串,而权限申请方法要求第二个参数为String[]类型的权限数组,参数类型不匹配导致申请逻辑无法触发
修复后的点击事件代码如下:
binding.button.setOnClickListener { // 直接调用Fragment自身的requestPermissions,传入权限数组+请求码即可 requestPermissions( arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE), 392 ) }
2. API 29(Android 10)专属适配配置
API 29中WRITE_EXTERNAL_STORAGE权限已经被废弃,默认应用只能访问自身专属目录,要访问公共存储目录需要在AndroidManifest.xml的<application>节点添加属性:
android:requestLegacyExternalStorage="true"
如果不加这个配置,哪怕你提交了权限申请,系统也会直接拒绝,不会弹出申请弹窗。
3. 权限回调与场景检查
- 如果你需要在Fragment中接收权限申请结果,不要使用
ActivityCompat.requestPermissions传入Activity实例申请权限,否则回调会触发Activity的onRequestPermissionsResult,不会回传给当前Fragment - 检查设备是否之前已经拒绝过该权限且勾选了「不再询问」,这种情况系统也不会弹出申请框,需要到应用设置页手动开启权限
- 必须在
onRequestPermissionsResult中确认权限已授权后再执行IO操作,否则未授权直接调用IO会直接触发崩溃
内容的提问来源于stack exchange,提问作者Yurowitz
相关产品推荐
相关产品推荐

