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

文章目录

    起因是,我想保存一个 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 类型,并将结果打印到控制台上。

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式