1、文件选择器,相当于易语言的选择器一样,还比较方便

    val current = LocalContext.current
    var text=""
    val galleryLauncher =rememberLauncherForActivityResult(
        contract = ActivityResultContracts.GetContent()
    ) { it ->
        it?.let { it1 ->
            context.contentResolver.openInputStream(it1)?.use { inputStream ->
                BufferedReader(InputStreamReader(inputStream)).use { reader ->
                    //读取单行进行添加
//                    val lines = reader.readLines()
//                    text = lines.joinToString("\n")
//                   读取多行进行添加
                    text = reader.readText()
                }
            }
        }
  1. rememberLauncherForActivityResult: 这是一个Composable函数,它用于在Compose中记住一个ActivityResultLauncher,这样它就可以在重组时保持状态。ActivityResultLauncher是一个对象,它允许您启动一个Activity并处理返回的结果。

  2. contract = ActivityResultContracts.GetContent(): 这指定了ActivityResultContract,它定义了启动Activity的Intent以及如何解释Activity的结果。ActivityResultContracts.GetContent()是一个预定义的Contract,用于从用户选择的内容提供者中获取数据。它通常会启动一个文件选择器,允许用户选择一个文件。

  3. @Composable
    public fun <I, O> rememberLauncherForActivityResult(
        contract: ActivityResultContract<I, O>,
        onResult: (O) -> Unit
    ):

    从源代码中看到rememberLauncherForActivityResult返回的结果是一个lamba函数,所以可以用大括号括起来

  4. 允许用户选择一个文件,所以可以这只文件的选择类型

  5.                 val intent = Intent(Intent.ACTION_GET_CONTENT).apply {
                        type = "text/plain"
                    }
                    galleryLauncher.launch("text/plain")
    //                galleryLauncher.launch("image/*")

  6. context.contentResolver.openInputStream(it): 这段代码使用ContentResolver来打开与Uri关联的InputStreamContentResolver是一个用于访问内容提供者提供的数据的系统服务。openInputStream方法获取Uri并返回一个可以读取数据的InputStream

  7. ?.useuse函数是一个Kotlin标准库中的扩展函数,它用于自动管理资源。它会确保在代码块执行完毕后,InputStream被正确关闭,以避免资源泄漏。

  8. BufferedReader(InputStreamReader(inputStream)): 这创建了一个BufferedReader,它从InputStream中读取文本数据。InputStreamReader是一个将字节流转换为字符流的桥梁,它使用指定的字符集来解码字节。

  9. BufferedReader(InputStreamReader(inputStream)).use: 这又是一个use函数的调用,用于自动关闭BufferedReader

  10. val lines = reader.readLines()readLinesBufferedReader的一个方法,它读取所有行并将其作为列表返回。

  11. 相当于contentResolver是四大组件之一,可以调用起系统内部的相关内容进行
    在进行之前要添加相应的权限
    
        <!--读取本地图片权限-->
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
            android:maxSdkVersion="32" />

3、相当于打开文件选择器,然后通过文件选择器获取相应的文件,最后对相应的文件进行读取,保存

2、常见的MIME类型

互联网媒体类型,也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。MIME(Multipurpose Internet Mail Extensions)类型是一种标准,用于标识在网络中传输的文件类型。MIME类型通常由两部分组成:类型和子类型。以下是一些常见的MIME类型:

例如:Content-Type: text/html;charset:utf-8;

text/html  :HTML格式
text/plain :纯文本格式      
text/xml   :XML格式
image/gif  :gif图片格式    
image/jpeg :jpg图片格式 
image/png  :png图片格式
application/xhtml+xml :XHTML格式
application/xml       :XML数据格式
application/atom+xml  :Atom XML聚合格式    
application/json      :JSON数据格式
application/pdf       :pdf格式  
application/msword    :Word文档格式
application/octet-stream :二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded:表单提交时的默认类型,form表单数据被编码为key=value格式发送到服务器(表单默认的提交数据的格式)
一、文本类型
text/plain: 纯文本文件
text/html: HTML文件
text/css: CSS文件
text/javascript: JavaScript文件(也常用application/javascript)
二、图片类型
image/jpeg: JPEG图片
image/png: PNG图片
image/gif: GIF图片
image/svg+xml: SVG图片
三、音频类型
audio/mpeg: MP3音频文件
audio/ogg: Ogg音频文件
audio/x-wav: WAV音频文件
四、视频类型
video/mp4: MP4视频文件
video/quicktime: MOV视频文件
video/x-ms-wmv: WMV视频文件
video/x-flv: FLV视频文件
五、应用程序类型
application/octet-stream: 任意的二进制数据
application/pdf: PDF文件
application/zip: ZIP文件
application/msword: Word文档(旧格式,也用application/vnd.openxmlformats-officedocument.wordprocessingml.document)
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet: Excel文档(XML格式,也用application/vnd.ms-excel)
application/vnd.openxmlformats-officedocument.presentationml.presentation: PowerPoint文档(XML格式,也用application/vnd.ms-powerpoint)
application/json: JSON数据
六、多部分和消息类型
multipart/mixed: 用于混合内容的邮件消息
multipart/alternative: 用于提供同一内容的不同格式的邮件消息
multipart/related: 用于关联邮件消息中的不同部分,如内嵌图片
七、其他类型
message/rfc822: 用于电子邮件消息
image/vnd.microsoft.icon: ICO图片
application/xhtml+xml: XHTML文件
这些只是一小部分MIME类型。实际上,MIME类型非常丰富,可以覆盖几乎所有的文件类型。如果需要查找特定文件类型的MIME类型,可以在IANA(Internet Assigned Numbers Authority)的官方网站上找到官方注册的MIME类型列表。

3、获取选中文件的相关信息 cursor

    val galleryLauncher =rememberLauncherForActivityResult(
        contract = ActivityResultContracts.GetContent()
    ) { it ->
        it?.let { it1 ->
            val cursor = context.contentResolver.query(it, null, null, null, null)
            cursor?.use {
                if (cursor.moveToFirst()) {

                    // 获取文件名的列索引
                    val fileNameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
                    // 获取文件名
                    fileName = cursor.getString(fileNameIndex)

                    //获取文件的大小
                    val fileSize = cursor.getColumnIndex(OpenableColumns.SIZE)
                    val fileSize2 = cursor.getString(fileSize)

                    //获取文件的类型
                    val fileType = context.contentResolver.getType(it1)


                }
            }

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐