You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 13设备SAF调用OPEN_DOCUMENT_TREE报错,如何处理?

解决Android 13设备上ACTION_OPEN_DOCUMENT_TREE的ActivityNotFoundException

问题原因

虽然Android 13原生系统默认支持SAF的文件夹选择意图,但部分定制ROM(比如三星部分机型的系统)可能移除或禁用了默认文件管理器组件,导致系统中没有能响应ACTION_OPEN_DOCUMENT_TREE的Activity,从而触发该异常。

解决方案

1. 提前检查意图是否可被处理

在调用activityResultLauncher.launch(intent)之前,必须先检查系统中是否存在能处理该意图的Activity,避免直接抛出崩溃异常。

2. 给用户友好提示并引导解决

如果检测到无可用处理Activity,弹窗告知用户情况,并建议安装支持SAF的文件管理器应用(如Google文件、Solid Explorer等)。

3. 修改后的代码示例

fun selectFolderSaf(
    activity: Activity,
    coroutineScope: CoroutineScope,
    activityResultLauncher: ActivityResultLauncher<Intent>,
) {
    val intent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        val storageManager =
            activity.getSystemService(Context.STORAGE_SERVICE) as StorageManager
        storageManager.primaryStorageVolume.createOpenDocumentTreeIntent()
    } else {
        Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
    }

    with(intent) {
        putExtra("android.content.extra.SHOW_ADVANCED", true)
        putExtra("android.content.extra.FANCY", true)
        putExtra("android.content.extra.SHOW_FILESIZE", true)
    }

    // 关键:检查是否有Activity能处理该意图
    if (intent.resolveActivity(activity.packageManager) != null) {
        coroutineScope.launch {
            activityResultLauncher.launch(intent)
        }
    } else {
        // 无可用处理Activity时的提示逻辑
        AlertDialog.Builder(activity)
            .setTitle("无法选择文件夹")
            .setMessage("当前设备没有支持文件夹选择的文件管理器,请安装一款支持SAF的文件浏览器应用(如Google文件、Solid Explorer)后重试。")
            .setPositiveButton("知道了") { dialog, _ -> dialog.dismiss() }
            .show()
    }
}

关于建议用户安装文件浏览器的可行性

完全可以建议用户安装支持SAF的文件管理器应用,这是解决此类问题的有效方案。需要注意明确告知用户需安装**支持SAF(存储访问框架)**的应用,普通文件管理器可能不支持该意图调用。

内容的提问来源于stack exchange,提问作者user25

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:16:06