【代码】Android|获取存储权限并创建、存储文件

版本:Android 11及以上,gradle 7.0以上,Android SDK > 29

获取存储权限

获取存储权限参考:Android 11 外部存储权限适配指南及方案,这篇文章直接翻到最下面,用XXPermissions框架。它漏了这个框架的使用方式,使用方式参考https://github.com/getActivity/XXPermissions

在任意能够执行的地方添加以下代码:

bash 复制代码
XXPermissions.with(this)
        // 不适配 Android 11 可以这样写
        //.permission(Permission.Group.STORAGE)
        // 适配 Android 11 需要这样写,这里无需再写 Permission.Group.STORAGE
        .permission(Permission.MANAGE_EXTERNAL_STORAGE)
        .request(new OnPermissionCallback() {

            @Override
            public void onGranted(List<String> permissions, boolean all) {
                if (all) {
                    Toast.makeText(MainActivity.this, "获取存储权限成功", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onDenied(List<String> permissions, boolean never) {
                if (never) {
                    Toast.makeText(MainActivity.this, "永久获取存储权限失败", Toast.LENGTH_SHORT).show();
                    // 如果是被永久拒绝就跳转到应用权限系统设置页面
                    XXPermissions.startPermissionActivity(MainActivity.this, permissions);
                } else {
                    Toast.makeText(MainActivity.this, "获取存储权限失败", Toast.LENGTH_SHORT).show();
                }
            }
        });

它的import内容是:

java 复制代码
import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import com.hjq.permissions.PermissionFragment;

然后根据github的README的"集成步骤",引入库:

  • settings.gradle 文件中加入
groovy 复制代码
dependencyResolutionManagement {
    repositories {
        // JitPack 远程仓库:https://jitpack.io
        maven { url 'https://jitpack.io' }
    }
}
  • 配置完远程仓库后,在项目 app 模块下的 build.gradle 文件中加入远程依赖
groovy 复制代码
android {
    // 支持 JDK 1.8 及以上
    compileOptions {
        targetCompatibility JavaVersion.VERSION_1_8
        sourceCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    // 权限请求框架:https://github.com/getActivity/XXPermissions
    implementation 'com.github.getActivity:XXPermissions:18.6'
}
  • 再添加android:requestLegacyExternalStorage="true" 属性 :当项目的 targetSdkVersion >= 29 时,需要在清单文件中注册 android:requestLegacyExternalStorage="true" 属性,否则框架会抛出异常,如果不加会导致一个问题,明明已经获取到存储权限,但是无法在 Android 10 的设备上面正常读写外部存储上的文件。

创建、存储文件

首先是需要知道应该保存到哪里,

查路径的API参考文章Android 保存文件路径方法
然后是需要创建目录和文件,并存储。

存储的过程参考文章保存File文件到本地

例如存储到外部路径的代码:

java 复制代码
  String createDir(String dirName) {
  // 在sd卡根目录创建一个文件夹
    String absolutePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + dirName;
    File dir = new File(absolutePath);
    if (!dir.exists()) {
      dir.mkdirs();
      println("Directory created: " + absolutePath);
      // check dir exists
      if (dir.exists()) {
        println("Directory exists: " + absolutePath);
      }
      return absolutePath;
    }
    println("Directory already exists: " + absolutePath);
    return absolutePath;
  }

  void saveIndex(String dirpath, int bgIndex){
    // save index
    PrintWriter indexOutput = createWriter(dirpath + File.separator + indexName);
    indexOutput.print(bgIndex);
    indexOutput.flush();
    indexOutput.close();
    println("saveIndex: " + bgIndex);
  }

  void func(){
  // 功能示例
    String dirpath = createDir("drawings");
    saveIndex(dirpath, 1);
  }

需要引入的头文件:

java 复制代码
import java.io.File;
import java.io.PrintWriter;
import android.os.Environment;

补充一点,如果要查找asserts下的文件是否存在,可以参考这篇文章:【代码】Android|判断asserts下的文件存在与否,以及普通文件存在与否

相关推荐
xiaoshiquan12063 分钟前
as强制过滤指定依赖版本库,解决该依赖不同版本冲突
android
2501_929157682 小时前
Switch 20.5.0系统最新PSP模拟器懒人包
android·游戏·ios·pdf
用户093 小时前
Kotlin Flow的6个必知高阶技巧
android·面试·kotlin
用户093 小时前
Flutter插件与包的本质差异
android·flutter·面试
用户094 小时前
Jetpack Compose静态与动态CompositionLocal深度解析
android·面试·kotlin
聆风吟º6 小时前
【Spring Boot 报错已解决】别让端口配置卡壳!Spring Boot “Binding to target failed” 报错解决思路
android·java·spring boot
非专业程序员Ping14 小时前
HarfBuzz概览
android·ios·swift·font
Jeled15 小时前
「高级 Android 架构师成长路线」的第 1 阶段 —— 强化体系与架构思维(Clean Architecture 实战)
android·kotlin·android studio·1024程序员节
明道源码17 小时前
Kotlin 控制流、函数、Lambda、高阶函数
android·开发语言·kotlin
消失的旧时光-194319 小时前
Kotlin × Gson:为什么遍历 JsonObject 要用 entrySet()
android·kotlin·数据处理·1024程序员节