android 系统上关联文件类型与编辑器,用 kotlin 自动实现

更新日期: 2023-05-06 阅读次数: 902 字数: 573 分类: Android

起因是,我想保存一个 golang 代码源文件到 Android 手机上,方便在等车的时候继续阅读代码。但是我发现 Android 系统上居然没有一个类似纯文本编辑器的 app,小米系统内置的阅读器排版混乱,且无法编辑,默认诱导去下载 WPS。所以我想实现一个简单的纯文本编辑器,方便打开各类源码文件。

以下是 ChatGPT 给出的提示,暂未测试,存档一下。

文件类型与编辑器关联

在 Kotlin 中,可以使用以下代码来关联文件类型和编辑器:

val mimeType = "application/pdf" //要关联的文件类型
val packageName = "com.adobe.reader" //要使用的编辑器的包名

//创建一个Intent对象,用于打开指定文件类型的操作
val intent = Intent(Intent.ACTION_VIEW)
intent.type = mimeType

//通过包名指定要使用的编辑器
val pm = context.packageManager
val packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES)
if (packageInfo != null) {
    val componentName = packageInfo.activities[0].componentName
    intent.setClassName(componentName.packageName, componentName.className)
}

//注册关联文件类型和编辑器的操作
val resolver = context.contentResolver
resolver.update(
    MediaStore.Files.getContentUri("external"),
    ContentValues().apply {
        put(MediaStore.Files.FileColumns.MIME_TYPE, mimeType)
        put(MediaStore.Files.FileColumns.IS_PENDING, 1)
        putNull(MediaStore.Files.FileColumns.DISPLAY_NAME)
    },
    "${MediaStore.Files.FileColumns.MIME_TYPE}=?",
    arrayOf(mimeType)
)

//打开系统的文件选择器,让用户选择要关联的文件
val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == RESULT_OK) {
        //获取用户选择的文件的URI
        val uri = result.data?.data
        if (uri != null) {
            resolver.openFileDescriptor(uri, "w", null)?.use {
                FileOutputStream(it.fileDescriptor).use { outputStream ->
                    outputStream.write(ByteArray(0))
                }
            }

            //将文件与编辑器关联起来
            val values = ContentValues().apply {
                put(MediaStore.Files.FileColumns.IS_PENDING, 0)
            }
            resolver.update(uri, values, null, null)
        }
    }
}

//启动系统的文件选择器
launcher.launch(intent)

以上代码会首先创建一个 Intent 对象,并将其类型设置为要关联的文件类型。接着会使用包名指定要使用的编辑器,并通过内容提供程序 API 将文件与编辑器关联起来。

最后,代码会打开系统的文件选择器,让用户选择要关联的文件。当用户选择了文件后,代码会将文件与编辑器关联起来。

golang 代码文件的 mimeType 是什么

Golang 代码文件的 MIME 类型是 text/x-go。在 HTTP 协议中,MIME 类型用于指示要传输的数据类型,以便接收方可以正确地处理该数据。对于 Golang 代码文件来说,由于它们是纯文本文件,因此其 MIME 类型为 text,而 x-go 表示它们是 Golang 代码文件。

在 Go 语言中,我们可以使用标准库 net/http 中的 DetectContentType 函数来检测文件的 MIME 类型。例如:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    // 读取文件内容
    fileContent, err := ioutil.ReadFile("main.go")
    if err != nil {
        panic(err)
    }

    // 检测 MIME 类型
    mimeType := http.DetectContentType(fileContent)
    fmt.Println(mimeType) // 输出: text/x-go
}

以上代码会读取当前目录下的 main.go 文件,并使用 http.DetectContentType 函数检测其 MIME 类型,并将结果打印到控制台上。

tags: idea

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式