上传图片到Firebase Storage出现GalleryOpenProvider权限拒绝异常怎么办
报错具体含义
这个是小米MIUI系统特有的安全权限异常,触发原因是你的App尝试访问系统图库的内容提供器com.miui.gallery.provider.GalleryOpenProvider时,所持有的临时访问权限已经失效:
你通过系统选图器拿到图库图片的Uri时,系统只会给你的App授予短时、单次的读权限,如果没有即时读取Uri对应的文件内容,直接将原始Uri传给Firebase Storage的putFile方法执行上传操作时,临时权限已经过期,而小米的图库提供器本身不对外开放,就会触发该权限拒绝错误,无法读取图片内容完成上传。
对应处理方案
- 方案1(兼容性最高,推荐):将选中的图片先复制到App私有目录再上传
拿到图库返回的Uri后,立刻通过ContentResolver读取Uri的输入流,将文件写入App自身的缓存目录/文件目录,再用私有目录下的本地文件生成Uri传给Firebase的putFile方法上传,完全规避系统权限限制,适配所有Android厂商系统。 - 方案2:申请Uri持久化访问权限
在选图成功的回调中立刻调用以下代码,申请对该Uri的长期访问权限,后续上传时即可正常访问内容:// 仅针对Android 4.4及以上系统生效 int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); getContentResolver().takePersistableUriPermission(selectedImageUri, takeFlags); - 方案3:改用输入流方式上传
拿到Uri后立刻读取输入流,调用Firebase的putStream方法直接上传流,无需后续再访问原始Uri,避开权限过期问题:InputStream inputStream = getContentResolver().openInputStream(selectedImageUri); storageReference.putStream(inputStream);
内容的提问来源于stack exchange,提问作者Micheal_ Moris
相关产品推荐
相关产品推荐

