文件类型转换

  • 前言
  • 一、创建文件
  • 二、File转Uri
  • 三、Bitmap转File
  • 四、stream转File
  • 五、Uri转File
  • 总结

前言

关于文件转换,网上有很多博客都有过介绍,但都过于陈旧。
因此,根据最近的一个Android项目,整合记录一下关于文件类型转换的相关操作,留已备用。
此处相关代码已在Android9、10、11机型上做过相关测试,关于Android相关权限问题不在此做讨论。


一、创建文件

先写一下文件创建的函数吧,也是方便后来人使用。

 // 创建一个文件, 并在程序退出时自动删除fun createFile(context: Context, type: String): File {val fileName = "FILE_" + DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss").withZone(ZoneOffset.UTC).format(Instant.now())val file = File(context.filesDir, "$fileName.$type")// println(">>\n>>${file.path}    $fileName     $type")// 该行可删去,防止程序退出时自动删除file.deleteOnExit()return file}

二、File转Uri

首先要注意,URI和Uri是两种类型,不过开发Android时显示图片通常用的是Uri

此外,转换Uri也要根据用途范围分为两种转换方式:

  • 该文件仅用于该app(例如展示图片时ImageView所使用的Uri)
val fileUri = file.toUri()
  • 该文件将暴露于该app之外(例如使用Intent时要将文件的Uri传给Extra)
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
val captureImg = createFile(context, "jpg")
// 此处通过FileProvider.getUriForFile 将File类型转换成Uri类型
val imgUri = FileProvider.getUriForFile(context, "top.sanqii.provider", captureImg!!)
intent.putExtra(MediaStore.EXTRA_OUTPUT, imgUri)
startActivityForResult(intent, captureCode)

为什么要分出两种方式呢,因为Android 7.0以上不再允许在app中把 file://Uri 暴露给其他app,而第一种简单转换方式在本地用仍然是可行的,并未暴露给其它app。
否则就会出现android.os.FileUriExposedException错误,这时必须使用第二种通用方法,使用它转换得到的Uri是 content:// Uri 的形式。
但需要注意,使用FileProvider需要做额外的配置,具体请参阅Android开发者文档以及相关链接1、相关链接2。其中部分链接可能需要科学上网。

三、Bitmap转File

 // 存储bitmap到本地文件fun bitmapToFile(context: Context, bitmap: Bitmap, fileType: String = "jpg"): File {val file = createFile(context, fileType)val oStream = file.outputStream()// 压缩文件if (fileType == "png") {bitmap.compress(Bitmap.CompressFormat.PNG, 80, oStream)} else {bitmap.compress(Bitmap.CompressFormat.JPEG, 80, oStream)}oStream.flush()oStream.close()return file}

四、stream转File

    // 数据流保存到本地, 可通过调用其Uri供本地使用fun streamToFile(context: Context, iStream: InputStream, type: String): File {val fileType = type.subSequence(type.lastIndexOf("/") + 1, type.length) as Stringval file = createFile(context, fileType)val oStream = file.outputStream()iStream.copyTo(oStream)oStream.flush()iStream.close()iStream.close()return file}

五、Uri转File

在此指出,Android可以直接通过Uri获取其数据的,而不需要将Uri转换得到相应的文件路径。
开发时只需要创建文件,可以直接将Uri的数据存放到该文件中。

activity?.let { activity ->val file = activity.contentResolver.openInputStream(uri)?.let { stream ->val fType = context.contentResolver.getType(uri) ?: "jpg"// 前面的创建文件的函数,也可以自行创建streamToFile(context, stream, fType)}file?.let { file ->// do something}
}

总结

没什么别的,反正安卓兼容性挺让人头疼的。

Android文件类型转换(已适用于Android11)相关推荐

  1. 安卓手机/Android11系统无法访问android文件夹下的data目录,怎么解决?

    最近买了个IQOO10,因为现在还在上学,所以没买mate50. 本来鸿蒙系统里文件夹管理得好好的,上了安卓系统,就发现这个android文件夹下的data目录是没权限访问的!???? 于是我上网搜索 ...

  2. 如何从 Android 手机恢复已删除或丢失的照片

    当 Android 上的照片被意外删除时,您一定会感到难过,不知道该怎么办,尤其是那些珍贵的照片.实际上,现在您不必太担心,因为您可以利用多种方法来恢复 Android 手机上已删除或丢失的照片.其实 ...

  3. 一文帮你搞懂 Android 文件描述符

    介绍文件描述符的概念以及工作原理,并通过源码了解 Android 中常见的 FD 泄漏. 一.什么是文件描述符? 文件描述符是在 Linux 文件系统的被使用,由于Android基 于Linux 系统 ...

  4. 在 iPhone 和 Android 上恢复已删除的微信消息/聊天的 3 种方法

    微信是一款面向移动用户的免费即时通讯应用程序.它适用于 iOS 和 Android. 好消息是,在微信 经历了如此艰难的运行之后,它仍在我们身边,并将在其新所有者恢复工具的帮助下继续发展. 微信 是一 ...

  5. 如何在 Android上恢复已删除的照片? 3个有效方法请收藏

    有时,我们会错误地删除令人难忘的照片.视频和其他数据.这无疑是一个令人沮丧的情况,但不要担心:我们将修复它并帮助您恢复丢失的文件.在本文中,我们将讨论在一些简单的方法和快速恢复软件的帮助下恢复已删除照 ...

  6. android studio 库工程,Android Studio 添加已有工程方法

    准备工作: 修改 excluded-paths和android.iml,修改内容详见下图.(目的:过滤和优先在sourcefolder查找,若没有再到JAR包中查找) BorqsUI/LINUX/an ...

  7. android 文件传输_使用“发送到”轻松将文件传输到您的Android设备

    android 文件传输 The "Send to" menu has been around since Windows 95; so long a lot of users m ...

  8. Android之共享已安装的apk应用

    http://blog.csdn.net/xanxus46/article/details/8228366 是否遇到过自己手机上有好的应用,但不知道怎么分享给好友的时候呢?作为一名程序员,遇到了这样简 ...

  9. Android 文件读写最全解析

    本文目录 Android文件读写概述 读取raw目录文件 读取assets目录文件 data/data/(包名) 目录文件读写 写数据 读数据 sdcard文件读写 申请动态权限 写数据 读数据 sd ...

最新文章

  1. 人群计数--Switching Convolutional Neural Network for Crowd Counting
  2. 数据库主从和主备部署介绍
  3. python算法的基本原理_kNN算法基本原理与Python代码实践
  4. createtrackbar函数_【3】OpenCV图像处理模块(10)inRange函数实现阈值化,HSV图像分割...
  5. mysql 设置时区_MySQL实战干货 | 如何处理由时区设置引发的 SQL 执行“卡顿”?...
  6. 栈中pop和top的区别是什么呢?用队列实现一个栈,Python语言
  7. vue .prop修饰符
  8. java发牌_Java实现洗牌发牌的方法
  9. 经典案例 | I-SPY2乳腺癌药物临床试验采用RPPA技术建立药物响应相关分子分型
  10. mac airdrop 隔空投送 我可以发现别人,别人发现不了我。搜索不到。
  11. PPP和PDP激活是什么区别
  12. 树莓派3B+安装官方原版系统
  13. 搞定签到码,一切皆可码!!!微信小程序篇
  14. 检测到 Mac 文件格式: 请将源文件转换为 DOS 格式或 UNIX 格式
  15. 【多线程基础】 保证线程安全的总结
  16. 写好代码的注意点(代码整洁之道学习笔记)
  17. 学Java对一个专科生,对一个穷人来说,是一条好的出路吗?
  18. 龙芯的3A5000:中国的最佳拍档?
  19. PHP、Java、Python、C、C++ 这几种编程语言都各有什么特点或优点?
  20. 计算机硬件相关的论文,计算机硬件论文范文

热门文章

  1. 理光文件服务器权限,理光彩色复印机关于部门管理设置教程
  2. oracle11g数据库版本号,Oracle数据库之关于oracle db 11gR2版本号上的參数和scn headroom补丁问题...
  3. MayaAPI官方案例asciiToBinary的修改,实现ma和mb格式互转
  4. Http URL中文编码解码工具类
  5. 京东云高可用业务架构建设 | 京东云技术团队
  6. 《advanced fpga designed》
  7. Zsh与Oh-My-Zsh的安装与设置
  8. 用 Python 分析《斗破苍穹》,分析其究竟是烂片无疑还是沧海遗珠?
  9. 使用蒲公英给iOS应用做内测
  10. 意料之外也是情理之中,我的自由职业之旅