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

相关推荐
爱写代码的山山2 小时前
虚幻UE5手机安卓Android Studio开发设置2025
android·ue5·虚幻
dal118网工任子仪3 小时前
94,【2】buuctf web [安洵杯 2019]easy_serialize_php
android·前端·php
Kevin Coding6 小时前
Flutter使用Flavor实现切换环境和多渠道打包
android·flutter·ios
yashunan6 小时前
Web_php_unserialize
android·前端·php
taopi20248 小时前
android java系统弹窗的基础模板
android·java·开发语言
志尊宝8 小时前
深入探索 Android 技术:从基础到前沿
android
字节全栈_BjO9 小时前
mysql死锁排查_mysql 死锁问题排查
android·数据库·mysql
恋猫de小郭1 天前
Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年
android·ide·android studio
aaaweiaaaaaa1 天前
php的使用及 phpstorm环境部署
android·web安全·网络安全·php·storm
工程师老罗1 天前
Android记事本App设计开发项目实战教程2025最新版Android Studio
android