You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin:应用被选中打开文件时如何获取文件内容?

实现Android应用打开.json文件的完整步骤

1. 配置Manifest,让应用能被文件选择器识别

首先要在你用来处理文件打开的Activity的<activity>标签里添加intent-filter,告诉系统你的应用支持打开.json格式的文件:

<activity
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        
        <!-- 匹配.json文件的MIME类型 -->
        <data
            android:mimeType="application/json"
            android:scheme="content" />
        <data
            android:mimeType="application/json"
            android:scheme="file" />
    </intent-filter>
</activity>

这里同时指定content和file两种scheme,覆盖了Android不同版本下的文件Uri类型(目前主流场景用content Uri)。

2. 在Kotlin代码中接收并读取文件

当用户在文件选择器中选中你的应用后,系统会启动配置了上述intent-filter的Activity,并通过Intent传递文件的Uri。你需要在Activity中获取这个Uri并读取内容:

在Activity中处理Intent

可以在onCreate或者onNewIntent(如果Activity是单实例模式)中处理请求:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        handleFileIntent(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        intent?.let { handleFileIntent(it) }
    }

    private fun handleFileIntent(intent: Intent) {
        // 确认是打开文件的请求
        if (Intent.ACTION_VIEW == intent.action) {
            val fileUri = intent.data ?: return
            
            // 读取文件内容
            try {
                contentResolver.openInputStream(fileUri)?.use { inputStream ->
                    val fileContent = inputStream.bufferedReader().readText()
                    // 拿到json字符串后,可进行解析处理
                    processJsonContent(fileContent)
                }
            } catch (e: IOException) {
                e.printStackTrace()
                Toast.makeText(this, "读取文件失败", Toast.LENGTH_SHORT).show()
            }
        }
    }

    private fun processJsonContent(jsonStr: String) {
        // 这里写你的json解析逻辑,比如用Gson、Moshi等库
        // 示例:
        // val gson = Gson()
        // val data = gson.fromJson(jsonStr, YourDataModel::class.java)
    }
}

关键说明

  • Uri安全读取:Android 10及以上采用分区存储,不能直接通过文件路径访问其他应用的文件,必须通过ContentResolver配合Uri读取,这种方式无需额外申请READ_EXTERNAL_STORAGE权限(文件选择器打开的场景下)。
  • 异常处理:必须捕获IOException,因为可能存在文件不存在、无读取权限等情况。
  • 多实例兼容:如果你的Activity设置了singleTop或singleTask的启动模式,一定要在onNewIntent中重新处理Intent,避免遗漏后续的文件打开请求。

内容的提问来源于stack exchange,提问作者Ryan Tshovu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:06:00