Android应用读取文件触发SecurityException问题求助
检查Uri权限持久化:通过文件选择器获取的Uri默认仅具有临时访问权限,若App后台被回收后再执行文件操作,会丢失权限。需在获取Uri后调用
getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)持久化权限,尤其适配Android 10+的分区存储机制。分区存储适配验证:Android 10+分区存储下,
WRITE_EXTERNAL_STORAGE权限的作用被限制,针对三星设备的自定义媒体提供者(如com.samsung.android.providers.media),需确认文件访问方式是否合规。对于SD卡文件(如崩溃日志中的content://media/4756-1ac1/file/4632),Android 11+对可移除存储的访问有更严格限制,需确保使用符合规范的API访问。三星设备特殊权限管控排查:三星Android 12/13可能存在额外隐私管控,比如用户将App的“文件和媒体”权限设置为“仅限使用期间允许”,或开启了安全模式导致系统媒体提供者无法访问文件。可在App中添加权限状态检查,当权限不足时引导用户重新授权;同时建议受影响用户检查应用权限设置。
替换废弃的AsyncTask:AsyncTask已在Android 11+标记为废弃,若在Fragment/Activity生命周期结束后执行,易导致上下文失效或权限丢失。建议改用Coroutines或WorkManager处理文件复制操作,确保操作在有效生命周期内执行,且上下文稳定。
添加Uri合法性校验与异常捕获:在调用
openInputStream前,先通过getContentResolver().getType(sourceFileUri)检查Uri有效性;同时捕获SecurityException,记录详细日志(如Uri类型、文件来源、当前权限状态),并给用户友好提示,避免崩溃。针对不同媒体提供者的适配测试:崩溃涉及下载提供者、三星媒体提供者、外部存储提供者等不同来源的Uri,需分别测试这些场景(下载目录文件、系统媒体库文件、SD卡文件),验证不同来源Uri的访问逻辑是否统一合规。
内容的提问来源于stack exchange,提问作者Wonton

