在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