Android:如何将文件保存到设备共享目录而非应用私有目录?
实现将数据写入设备共享文件夹的方案
没问题,我帮你把代码改成写入设备共享文件夹的版本~因为Android不同版本的存储机制有差异,我分两种情况给你讲,这样兼容性更好:
一、Android 9及以下(API ≤28)
这个版本可以直接操作外部存储,但需要先申请WRITE_EXTERNAL_STORAGE权限:
1. 配置权限
在AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
2. 动态申请权限+写入代码
// 先检查是否已获取权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 动态申请权限 ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 1001) return } // 获取设备共享的Download文件夹路径(你也可以换成其他共享目录,比如DIRECTORY_DOCUMENTS) val downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) val targetFile = File(downloadDir, "FILENAME") // 写入数据(用use函数自动关闭流,避免资源泄漏) val data = byteArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) FileOutputStream(targetFile).use { outputStream -> outputStream.write(data) }
二、Android 10及以上(API ≥29)
从Android 10开始引入了Scoped Storage,不能直接操作外部文件路径,推荐用MediaStore来写入共享文件夹:
写入代码
val data = byteArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) // 配置文件信息:文件名、类型、存储目录 val contentValues = ContentValues().apply { put(MediaStore.Files.FileColumns.DISPLAY_NAME, "FILENAME") put(MediaStore.Files.FileColumns.MIME_TYPE, "application/octet-stream") // 二进制文件用这个MIME类型,可根据你的文件调整 put(MediaStore.Files.FileColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS) // 存到Download共享文件夹 } // 通过ContentResolver插入并写入文件 val uri = contentResolver.insert(MediaStore.Files.getContentUri("external"), contentValues) uri?.let { contentResolver.openOutputStream(it).use { outputStream -> outputStream?.write(data) } }
注意事项
- Android 13及以上,如果你的文件属于特定媒体类型(比如图片、视频),可能需要申请对应的权限(如
READ_MEDIA_IMAGES),但写入通用二进制文件到Download目录时,通常不需要额外权限。 - 尽量避免使用
MANAGE_EXTERNAL_STORAGE权限,这个权限需要用户手动授权且审核严格,MediaStore是官方推荐的合规方案。 - 用
use函数包裹流操作,能自动帮你关闭流,防止内存泄漏。
内容的提问来源于stack exchange,提问作者MaxAstin




