android开发分享Android5.0及以上写入文件到外置SD卡(DocumentFile)

在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卡)

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/addevelopment/893626.html

(0)
上一篇 2021年10月20日
下一篇 2021年10月20日

精彩推荐