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


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

    获取存储权限

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

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

    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();
                    }
                }
            });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    它的import内容是:

    import com.hjq.permissions.OnPermissionCallback;
    import com.hjq.permissions.Permission;
    import com.hjq.permissions.XXPermissions;
    import com.hjq.permissions.PermissionFragment;
    
    • 1
    • 2
    • 3
    • 4

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

    • settings.gradle 文件中加入
    dependencyResolutionManagement {
        repositories {
            // JitPack 远程仓库:https://jitpack.io
            maven { url 'https://jitpack.io' }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 配置完远程仓库后,在项目 app 模块下的 build.gradle 文件中加入远程依赖
    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'
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 再添加android:requestLegacyExternalStorage="true" 属性:当项目的 targetSdkVersion >= 29 时,需要在清单文件中注册 android:requestLegacyExternalStorage="true" 属性,否则框架会抛出异常,如果不加会导致一个问题,明明已经获取到存储权限,但是无法在 Android 10 的设备上面正常读写外部存储上的文件。

    创建、存储文件

    首先是需要知道应该保存到哪里,
    查路径的API参考文章Android 保存文件路径方法

    然后是需要创建目录和文件,并存储。
    存储的过程参考文章保存File文件到本地

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

      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);
      }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    需要引入的头文件:

    import java.io.File;
    import java.io.PrintWriter;
    import android.os.Environment;
    
    • 1
    • 2
    • 3

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

  • 相关阅读:
    【前端实例教程】使用 HTML CSS 和 JavaScript 创建自定义搜索+下拉选择框菜单
    Clickhouse的基本sql语句
    二阶段面试题——JavaScript
    Java教程:一文详解函数式编程
    干货 | 携程鸿蒙应用开发实践
    图像运算和图像增强九
    MIT6.830-lab6-Rollback and Recovery(数据库的日志回滚和恢复)
    java包以及权限修饰符
    Servlet入门
    【数据结构与算法】杨辉三角,相同字符的截取以及扑克牌
  • 原文地址:https://blog.csdn.net/qq_46106285/article/details/136557340