Android10 分区存储的适配规则
目录
- 存储权限
- 内部存储 外部存储
- 适配
存储权限
Android Q 仍然使用 READ_EXTRNAL_STORAGE 和 WRITE_EXTRNAL_STORAGE 作为存储相关运行时权限 但现在即使
获取了这些权限,访问外部存储也受到了限制,只能访问自身目录下的文件和公共体内的文件
内部存储 外部存储
内部存储
外部存储
备注
适配
- 获取外部存储 文件夹
// 如果当前目录下没有 fileDirName 文件夹会自动创建 val file:File = context.getExternalFileDir("fileDirName") // fileDirName 文件夹名称 // /storage/emulated/0/Android/data/packageName/files/fileDirName
- 创建外部存储 文件
val appFileDirName = applicationContext.getExternalFilesDir("fileDirName")?.absolutePath val newFile = File(appFileDirName, "temp.txt") val fileWriter = FileWriter(newFile) fileWriter.write("test information") fileWriter.flush() fileWriter.close()
- 创建外部存储公共目录下的文件路径
/** * @param fileName 文件名称 * @param relativePath 包含某个媒体下的子路径 */ fun insertFileIntroMediaStore( context: Context, fileName: String, relativePath: String ): Uri? { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { return null } val contentResolver = context.contentResolver val values = ContentValues() values.put(MediaStore.Downloads.DISPLAY_NAME, fileName) values.put(MediaStore.Downloads.MIME_TYPE, "text/plain") values.put(MediaStore.Downloads.RELATIVE_PATH, relativePath) //验证存储空间的可用性 //由于外部存储空间位于用户可能能够移除的物理卷上,因此在尝试从外部存储空间读取应用专 //属数据或将应用专属数据写入外部存储空间之前,请验证该卷是否可访问。 //您可以通过调用 Environment.getExternalStorageState() 查询该卷的状态。如果返回的状态为 MEDIA_MOUNTED,那么您就可以在外部存储空间中读取和写入应用专属文件。如果返回的状态为 MEDIA_MOUNTED_READ_ONLY,您只能读取这些文件。 val externalStorageState = Environment.getExternalStorageState() return if (externalStorageState.equals(Environment.MEDIA_MOUNTED)) { contentResolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values) } else { contentResolver.insert(MediaStore.Downloads.INTERNAL_CONTENT_URI, values) } } /** * @param context 上下文 * @param insertUri 存储Uri * @param inputStream 文件输出流 */ fun saveFile(context: Context, insertUri: Uri?, inputStream: InputStream?) { insertUri ?: return inputStream ?: return val resolver = context.contentResolver val out = resolver.openOutputStream(insertUri) var read: Int val buffer = ByteArray(1024) while (inputStream.read(buffer).also { read = it } != -1) { out?.write(buffer) } inputStream.close() out?.flush() out?.close() } /** * @param context 上下文 * @param insertUri 存储Uri * @param sourceFile 资源文件 */ fun saveFile(context: Context, insertUri: Uri?, sourceFile: File?) { insertUri ?: return sourceFile ?: return val inputStream = FileInputStream(sourceFile) val resolver = context.contentResolver val out = resolver.openOutputStream(insertUri) var read: Int val buffer = ByteArray(1024) while (inputStream.read(buffer).also { read = it } != -1) { out?.write(buffer) } inputStream.close() out?.flush() out?.close() }
- 读取外部存储 公共目录文件
/** * 获取文件输出流 by uri * @param context 上下文 * @param uri 文件路径 */ fun getInputStreamByUri(context: Context, uri: Uri?): InputStream? { uri ?: return null val openFileDescriptor = context.contentResolver.openFileDescriptor(uri, "r") return FileInputStream(openFileDescriptor?.fileDescriptor) }
以上就是Android10 分区存储的使用总结的详细内容,更多关于Android10 分区存储的使用的资料请关注海外IDC网其它相关文章!
【文章出处:cc防御 转载请说明出处】