Android小米设备使用FileProvider分享Zip日志文件时出现权限拒绝问题求助
各位同行们好,最近做项目遇到个奇怪的权限问题,折腾好久没搞定,想请教下大家:
我的Android应用会按日期生成日志文件(比如20.06.2024.txt),还做了个功能能把这些日志打包成Zip文件,然后通过应用分享或者直接用邮件发送。测试了6台不同品牌的设备,其他设备都能正常把Zip附件加到邮件里,唯独一台Xiaomi设备不行,查看日志发现报错:
Writing exception to parcel
java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.own.vpn.provider/files/logs/VPN_logs.zip from pid=6231, uid=1000 requires the provider to be exported , or grantUriPermission()
我在Manifest里定义的FileProvider代码如下(部分内容截断了):
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:ignore="LockedOrientationA...
有没有大佬遇到过小米设备上这种FileProvider的权限问题?应该怎么解决这个权限拒绝的错误呢?
我自己尝试过的思路(供参考):
- 确认了FileProvider的
android:exported是设为false的,知道不能改成true,那样有安全风险; - 已经给Intent加了
Intent.FLAG_GRANT_READ_URI_PERMISSION标记,但还是不行;
可能的解决方向:
显式给目标应用授权Uri权限:小米的系统邮件应用可能需要更明确的授权,除了给Intent加标记,还可以显式调用
grantUriPermission指定应用包名,比如:Uri zipUri = FileProvider.getUriForFile(context, "com.own.vpn.provider", zipFile); Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.setType("application/zip"); emailIntent.putExtra(Intent.EXTRA_STREAM, zipUri); // 添加全局读取权限标记 emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 显式给小米自带邮件应用授权(包名可能是com.android.email或者com.miui.email,需要确认) context.grantUriPermission("com.miui.email", zipUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); // 用Chooser启动,避免直接指定应用的问题 context.startActivity(Intent.createChooser(emailIntent, "分享日志"));检查FileProvider的路径配置:确保
res/xml/file_paths.xml里的路径和生成Zip文件的实际路径一致,比如如果日志存在files/logs/目录下,file_paths.xml应该配置:<paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="logs" path="logs/"/> </paths>适配小米系统的权限机制:有些小米设备的隐私保护设置可能会限制应用间的文件访问,可以引导用户检查应用的“文件管理”权限是否开启,或者在代码中动态申请相关权限(虽然FileProvider不需要
WRITE_EXTERNAL_STORAGE,但有些系统可能需要)。
备注:内容来源于stack exchange,提问作者Sunbey13

