启动 Android 11 系统的模拟器 , 然后部署该应用 , 文件创建成功 ;
三、完整代码示例
1、MainActivity 核心代码
package kim.hsl.file import android.Manifest import android.content.ContentValues import android.net.Uri import android.os.Bundle import android.os.Environment import android.provider.MediaStore import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import pub.devrel.easypermissions.AfterPermissionGranted import pub.devrel.easypermissions.EasyPermissions import java.io.BufferedOutputStream import java.io.OutputStream class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 动态权限获取 doSomethingWithPermissions() } @AfterPermissionGranted( 100 ) fun doSomethingWithPermissions(){ if(EasyPermissions.hasPermissions(this, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)){ // 分支一 : 如果有上述权限, 执行该操作 Toast.makeText(this, "权限申请通过", Toast.LENGTH_LONG).show() // Android 11 中创建文件 createFile() }else{ // 分支二 : 如果没有上述权限 , 那么申请权限 EasyPermissions.requestPermissions( this, "权限申请原理对话框 : 描述申请权限的原理", 100, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE ) } } /** * 创建文件 * 在 Download 目录下创建 hello.txt */ fun createFile(){ // 操作 external.db 数据库 // 获取 Uri 路径 var uri: Uri = MediaStore.Files.getContentUri("external") // 将要新建的文件的文件索引插入到 external.db 数据库中 // 需要插入到 external.db 数据库 files 表中, 这里就需要设置一些描述信息 var contentValues: ContentValues = ContentValues() // 设置插入 external.db 数据库中的 files 数据表的各个字段的值 // 设置存储路径 , files 数据表中的对应 relative_path 字段在 MediaStore 中以常量形式定义 contentValues.put(MediaStore.Downloads.RELATIVE_PATH, "${Environment.DIRECTORY_DOWNLOADS}/hello") // 设置文件名称 contentValues.put(MediaStore.Downloads.DISPLAY_NAME, "hello.txt") // 设置文件标题, 一般是删除后缀, 可以不设置 contentValues.put(MediaStore.Downloads.TITLE, "hello") // uri 表示操作哪个数据库 , contentValues 表示要插入的数据内容 var insert: Uri = contentResolver.insert(uri, contentValues)!! // 向 Download/hello/hello.txt 文件中插入数据 var os: OutputStream = contentResolver.openOutputStream(insert)!! var bos = BufferedOutputStream(os) bos.write("Hello World".toByteArray()) bos.close() } }
2、build.gradle 构建脚本
引入 pub.devrel:easypermissions:3.0.0 依赖库 ; ( 其它省略 )
dependencies { // 使用 Android X 的应用添加该依赖 implementation 'pub.devrel:easypermissions:3.0.0' }
3、清单文件
配置 SD 卡读写权限 ; ( 其它省略 )
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="kim.hsl.file"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> </manifest>
五、相关文档资料
Android 文件处理参考文档 :
数据和文件存储概览 : https://developer.android.google.cn/training/data-storage
访问应用专属文件 : https://developer.android.google.cn/training/data-storage/app-specific#kotlin
保存到共享的存储空间 : https://developer.android.google.cn/training/data-storage/shared
管理存储设备上的所有文件 : https://developer.android.google.cn/training/data-storage/manage-all-files
分享文件 : https://developer.android.google.cn/training/secure-file-sharing
应用安装位置 : https://developer.android.google.cn/guide/topics/data/install-location
Android 存储用例和最佳做法 : https://developer.android.google.cn/training/data-storage/use-cases
FileProvider : https://developer.android.google.cn/reference/androidx/core/content/FileProvider
博客源码 :
GitHub : https://github.com/han1202012/File
CSDN : https://download.csdn.net/download/han1202012/18832417