Android文件类型转换(适用于Android10等)

Android文件类型转换(适用于Android10等),第1张

概述文件类型转换前言一、创建文件二、File转Uri三、Bitmap转File四、stream转File五、Uri转File总结前言关于文件转换,网上有很多博客都有过介绍,但都过于陈旧。因此,根据最近的一个Android项目,整合记录一下关于文件类型转换的相关 *** 作,留已备用。此处相关代码已在Android

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


前言

关于文件转换,网上有很多博客都有过介绍,但都过于陈旧。
因此,根据最近的一个AndroID项目,整合记录一下关于文件类型转换的相关 *** 作,留已备用。
此处相关代码已在AndroID9、10机型上做过相关测试。
在此注意,关于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 String        val 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文件类型转换(适用于Android10等)全部内容,希望文章能够帮你解决Android文件类型转换(适用于Android10等)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1020894.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存