版本: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下的文件存在与否,以及普通文件存在与否。