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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:25:14