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

Kotlin Android文件选择器按钮点击崩溃问题求助

问题分析与解决方案

核心崩溃原因

你手动实例化了FileLoading这个Activity类(val fileLoader = FileLoading()),这是Android开发的大忌——Activity的实例必须由系统创建和管理,手动new出来的Activity没有经过系统初始化,内部上下文等核心对象都是null,调用startActivityForResult时必然触发空指针异常。

正确实现方式(基于Jetpack Compose)

不需要单独创建Activity类,也不用修改MainActivity的父类(ComponentActivity完全够用),直接用AndroidX提供的Activity Result API来实现文件选择,这是当前推荐的现代写法,替代过时的startActivityForResult。

修改后的完整代码

class MainActivity : ComponentActivity() {    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyProjectTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    MyApp()
                }
            }
        }
    }
}

@Composable
fun MyApp() {
    // 注册文件选择的Activity Result回调
    val pickFileLauncher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.GetContent()
    ) { uri: Uri? ->
        uri?.let { selectedUri ->
            // 这里处理选中的CSV文件URI,比如读取文件内容
            val inputStream = LocalContext.current.contentResolver.openInputStream(selectedUri)
            // 后续添加CSV解析逻辑...
        }
    }

    Column(
        modifier = Modifier.fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.Center
    ) {
        Button(onClick = {
            // 启动文件选择器,指定CSV类型更精准,兼容文本文件可改用"text/plain"
            pickFileLauncher.launch("text/csv")
        }) {
            Text(stringResource(R.string.load_button), fontSize = 24.sp)
        }
    }
}

关键说明

  • rememberLauncherForActivityResult是Compose中专门处理Activity结果的API,自动和Composable生命周期绑定,无需手动写onActivityResult。
  • 指定MIME类型为text/csv可精准筛选CSV文件,若需兼容所有文本文件,保留text/plain即可。
  • 选中文件后得到的是Uri,通过ContentResolver读取文件内容是Android 10+的推荐方式,避免直接操作文件路径的权限问题。

额外提示

不需要使用ActivityMainBinding,当前写法完全适配Compose开发场景。如果需要解析CSV内容,可使用OpenCSV等第三方库简化开发,或自行实现基础解析逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 02:06:05