You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动