【Android 文件管理】分区存储 ( MediaStore 文件操作 )(二)

简介: 【Android 文件管理】分区存储 ( MediaStore 文件操作 )(二)

启动 Android 11 系统的模拟器 , 然后部署该应用 , 文件创建成功 ;

image.png







三、完整代码示例




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


目录
相关文章
|
22天前
|
安全 Android开发
Android 预置可卸载分区接收不到任何广播问题分析和解决
Android 预置可卸载分区接收不到任何广播问题分析和解决
31 0
|
7天前
|
Shell Android开发
MT8385 Android AB分区系统升级(命令模式)
MT8385 Android AB分区系统升级(命令模式)
12 0
|
7天前
|
Java Android开发
Android OTG U盘无法显示在系统文件管理的修改
Android OTG U盘无法显示在系统文件管理的修改
6 0
|
7天前
|
Java API Android开发
Android系统升级A/B分区OTA升级应用层调用UpdateEngine代码
Android系统升级A/B分区OTA升级应用层调用UpdateEngine代码
18 0
|
8天前
|
存储 缓存 Linux
Android 系统的分区
Android 系统的分区
14 1
|
21天前
|
存储 Linux Android开发
Android存储分区与Rockchip平台的分区命名及U-Boot配置
Android存储分区与Rockchip平台的分区命名及U-Boot配置
14 0
|
21天前
|
存储 缓存 安全
Android系统 应用存储路径与权限
Android系统 应用存储路径与权限
16 0
Android系统 应用存储路径与权限
|
22天前
|
存储 缓存 安全
Rockchip系列之RK3568 Android设备固件和分区信息
Rockchip系列之RK3568 Android设备固件和分区信息
24 0
|
1月前
|
存储 数据库 Android开发
Android实现手机内存存储功能
Android实现手机内存存储功能
27 2
|
2月前
|
存储 Android开发 C++
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
51 3