Xamarin访问Android外部公共下载文件夹问题(替代弃用API)
解决Android 12+访问公共Download文件夹的问题
针对你遇到的Android 12+无法访问公共Download目录下非自身应用存储文件的问题,以下是两种可行的解决方案:
方案一:通过MediaStore API查询公共Download目录
Android 10及以上推荐使用MediaStore API访问公共存储空间的文件,该方式可以获取到Download目录下所有符合条件的文件(包括电脑添加的同名文件)。
示例代码(Kotlin):
// 定义需要查询的字段 val projection = arrayOf( MediaStore.Downloads._ID, MediaStore.Downloads.DISPLAY_NAME ) // 按文件名筛选 val selection = "${MediaStore.Downloads.DISPLAY_NAME} = ?" val selectionArgs = arrayOf("你的文件名.txt") // 查询Download目录 contentResolver.query( MediaStore.Downloads.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs, null )?.use { cursor -> if (cursor.moveToFirst()) { // 获取文件的Content URI val fileId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Downloads._ID)) val fileUri = ContentUris.withAppendedId(MediaStore.Downloads.EXTERNAL_CONTENT_URI, fileId) // 通过Content URI读取文件内容 contentResolver.openInputStream(fileUri)?.use { inputStream -> // 处理文件输入流,比如读取文本内容 val content = inputStream.bufferedReader().readText() // 后续业务逻辑 } } }
说明:Android 10+不再推荐直接使用DATA字段获取文件路径,通过Content URI操作文件是合规方式。
方案二:使用存储访问框架(SAF)让用户选择文件
如果需要访问特定文件,可调用SAF唤起系统文件选择器,让用户手动选择目标文件,该方式不受分区存储的范围限制。
示例代码(Kotlin):
// 注册文件选择回调 val openDocumentLauncher = registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri -> uri?.let { // 获取文件权限持久化(可选,避免重启后失去访问权限) contentResolver.takePersistableUriPermission( uri, Intent.FLAG_GRANT_READ_URI_PERMISSION ) // 通过URI读取文件内容 contentResolver.openInputStream(uri)?.use { inputStream -> val content = inputStream.bufferedReader().readText() // 后续业务逻辑 } } } // 启动文件选择器,指定初始目录为Download val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "text/plain" // 指定文件类型为文本 putExtra(DocumentsContract.EXTRA_INITIAL_URI, MediaStore.Downloads.EXTERNAL_CONTENT_URI) } openDocumentLauncher.launch(intent)
关键注意点
- Android 12+默认启用分区存储,应用无法直接通过路径访问公共Download目录下的非自身存储文件,必须通过MediaStore或SAF操作。
- Android 13及以上,访问公共Download目录的非媒体文件无需申请
READ_EXTERNAL_STORAGE权限,直接查询MediaStore即可。
内容的提问来源于stack exchange,提问作者Simone Colombo
相关产品推荐
相关产品推荐

