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
相关产品推荐
相关产品推荐

