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
相关产品推荐
相关产品推荐

