欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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的操作请看参考

参考

Android对于外置TF卡的读写操作(读写外置SD卡)

本文地址:https://blog.csdn.net/djzhao627/article/details/108140377

相关标签: Android