Android5.0及以上写入文件到外置SD卡(DocumentFile)
程序员文章站
2022-03-03 22:01:43
在Android4.4之后对外置SD卡的访问不可以像对内置存储一样进行操作,想要操作外置SD卡需要进行额外的鉴权操作。此处所涉及的代码只适用于Android5.0(21)及以后的版本minSdkVersion 21思路:一、直接使用相应的意图申请对外部存储的访问ACTION_OPEN_DOCUMENT / ACTION_GET_CONTENT:访问单个文件EXTRA_ALLOW_MULTIPLE:文件多选ACTION_CREATE_DOCUMENT:保存单文件ACTION_OPEN_DO...
在Android4.4之后对外置SD卡的访问不可以像对内置存储一样进行操作,想要操作外置SD卡需要进行额外的鉴权操作。
此处所涉及的代码只适用于Android5.0(21)及以后的版本
minSdkVersion 21
思路:
一、直接使用相应的意图申请对外部存储的访问
-
ACTION_OPEN_DOCUMENT
/ACTION_GET_CONTENT
:访问单个文件 -
EXTRA_ALLOW_MULTIPLE
:文件多选 -
ACTION_CREATE_DOCUMENT
:保存单文件 -
ACTION_OPEN_DOCUMENT_TREE
:访问整个目录
二、Android7.0(24)以后使用StorageManager
进行操作
方法二的效率要高于方法一
两种方式都会在onActivityResult
中返回相同的Uri,之后便是对Uri进行相关的操作
示例
获取到外部存储路径的Uri,再进行文件操作:
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 法二
StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
List<StorageVolume> storageVolumes = sm.getStorageVolumes();
for (StorageVolume storageVolume : storageVolumes) {
try {
// 使用反射获取根目录路径
Class<? extends StorageVolume> aClass = storageVolume.getClass();
Method getPath = aClass.getMethod("getPath");
getPath.setAccessible(true);
String path = (String) getPath.invoke(storageVolume);
if (此处判断是当前存储是外部存储 或者 是自己需要访问的外部存储) {
// 进行访问授权申请
Intent intent = storageVolume.createAccessIntent(null);
startActivityForResult(intent, REQUEST_CODE_REMOVABLE_STORAGE_SELECT_FOR_OUTPUT);
break;
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
// 进行异常处理
// showShortToast(e.getMessage());
}
}
} else { // 法一
// Android版本小于7并大于等于5.0
// 调用系统提供的目录选择器进行目录选择
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQUEST_CODE_REMOVABLE_STORAGE_SELECT_FOR_OUTPUT);
}
// ...其他业务代码
@Override
publicvoid onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
Uri uri = data.getData();
// 使用DocumentFile进行文件操作
DocumentFile documentFile = DocumentFile.fromTreeUri(context, uri);
String outputFilename = new Date().getTime() + ".xlsx";
DocumentFile newFile = documentFile.createFile("application/xlsx", outputFilename);
// 获得输出流
OutputStream excelOutputStream = context.getContentResolver().openOutputStream(newFile.getUri());
// 进行输出操作(写文件)
doDataOutput(outputFilename, excelOutputStream);
} catch (FileNotFoundException e) {
// 进行异常处理
// showShortToast(e.getMessage());
}
}
更多DocumentFile的操作请看参考
参考
本文地址:https://blog.csdn.net/djzhao627/article/details/108140377
上一篇: nginx网站安全漏洞修复