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

相关推荐
幻雨様4 小时前
UE5多人MOBA+GAS 45、制作冲刺技能
android·ue5
Jerry说前后端5 小时前
Android 数据可视化开发:从技术选型到性能优化
android·信息可视化·性能优化
Meteors.6 小时前
Android约束布局(ConstraintLayout)常用属性
android
alexhilton7 小时前
玩转Shader之学会如何变形画布
android·kotlin·android jetpack
whysqwhw11 小时前
安卓图片性能优化技巧
android
风往哪边走11 小时前
自定义底部筛选弹框
android
Yyyy48212 小时前
MyCAT基础概念
android
Android轮子哥12 小时前
尝试解决 Android 适配最后一公里
android
雨白13 小时前
OkHttp 源码解析:enqueue 非同步流程与 Dispatcher 调度
android
风往哪边走14 小时前
自定义仿日历组件弹框
android