【代码】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下的文件存在与否,以及普通文件存在与否

相关推荐
_一条咸鱼_11 分钟前
Android Runtime链接(Linking)阶段准备工作(27)
android·面试·android jetpack
aqi001 小时前
FFmpeg开发笔记(六十四)使用国产的RedPlayer播放器观看网络视频
android·ffmpeg·音视频·直播·流媒体
雨白1 小时前
扩展函数和运算符重载
android
casual_clover3 小时前
Android Studio 解决首次安装时下载 Gradle 慢问题
android·ide·android studio
天天爱吃肉82183 小时前
新能源汽车热管理核心技术解析:冬季续航提升40%的行业方案
android·python·嵌入式硬件·汽车
快乐觉主吖4 小时前
Unity的日志管理类
android·unity·游戏引擎
明月看潮生4 小时前
青少年编程与数学 01-011 系统软件简介 06 Android操作系统
android·青少年编程·操作系统·系统软件·编程与数学
snetlogon204 小时前
JDK17 Http Request 异步处理 源码刨析
android·网络协议·http
消失的旧时光-19435 小时前
Android USB 通信开发
android·java
吃汉堡吃到饱5 小时前
【Android】浅析View.post()
android