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

相关推荐
ace望世界5 小时前
android的Parcelable
android
顾林海5 小时前
Android编译插桩之AspectJ:让代码像特工一样悄悄干活
android·面试·性能优化
叽哥5 小时前
Flutter Riverpod上手指南
android·flutter·ios
循环不息优化不止5 小时前
安卓开发设计模式全解析
android
诺诺Okami5 小时前
Android Framework-WMS-层级结构树
android
alexhilton16 小时前
面向开发者的系统设计:像建筑师一样思考
android·kotlin·android jetpack
CYRUS_STUDIO1 天前
用 Frida 控制 Android 线程:kill 命令、挂起与恢复全解析
android·linux·逆向
CYRUS_STUDIO1 天前
Frida 实战:Android JNI 数组 (jobjectArray) 操作全流程解析
android·逆向
用户091 天前
Gradle Cache Entries 深度探索
android·java·kotlin
循环不息优化不止1 天前
安卓 View 绘制机制深度解析
android