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

Kotlin跨Activity调用函数触发空指针异常,求解决方案

解决Activity间调用方法引发的NullPointerException问题

你碰到的这个空指针错误,核心原因很明确:你直接用private val createHomeworkActivity = CreateHomeworkActivity()手动new了第二个Activity的实例,但Android的Activity是系统管控的组件,这种方式创建的Activity根本没经过系统的初始化流程,它的Context是null的,所以调用ContextCompat.checkSelfPermission的时候就触发了空指针异常。

下面给你两种靠谱的解决方案:

方案一:通过Intent启动Activity并传递触发标记

这种方式是Android组件交互的标准姿势,我们通过Intent启动第二个Activity,同时告诉它需要执行相机操作:

  1. 第一个Activity中修改点击事件的代码:
when (v?.id){
    R.id.take_a_photo -> {
        val intent = Intent(this, CreateHomeworkActivity::class.java)
        // 传递一个布尔值标记,告诉第二个Activity要启动相机
        intent.putExtra("TRIGGER_CAMERA", true)
        startActivity(intent)
    }
}
  1. 第二个Activity中,在生命周期方法里接收标记并执行相机逻辑:
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.your_create_homework_layout)
    
    // 先初始化你的ImageView视图(必须在setContentView之后)
    iv_multi_image_layout = findViewById(R.id.iv_multi_image_layout)
    
    // 检查Intent里的标记,如果为true就调用相机方法
    if (intent.getBooleanExtra("TRIGGER_CAMERA", false)) {
        tapOnCamera()
    }
}

fun tapOnCamera(){
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED || 
        ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE), RC_PERM_PICK_IMAGE)
    } else {
        openCamera()
        iv_multi_image_layout.visibility = View.VISIBLE
    }
}

方案二:把相机逻辑抽成独立工具类(更解耦)

如果相机相关的权限检查逻辑可以和Activity解耦,建议把这部分代码抽成工具类,这样后续其他地方也能复用:

  1. 创建一个相机工具类:
object CameraPermissionHelper {
    // 定义请求码,和你原来的RC_PERM_PICK_IMAGE保持一致
    const val RC_PERM_PICK_IMAGE = 1001

    fun checkPermissionsAndProceed(context: Context, onGranted: () -> Unit) {
        val hasCameraPerm = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED
        val hasStoragePerm = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED

        if (!hasCameraPerm || !hasStoragePerm) {
            if (context is Activity) {
                ActivityCompat.requestPermissions(
                    context,
                    arrayOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE),
                    RC_PERM_PICK_IMAGE
                )
            }
        } else {
            onGranted.invoke()
        }
    }
}
  1. 第一个Activity中调用工具类,权限通过后再启动第二个Activity:
when (v?.id){
    R.id.take_a_photo -> {
        CameraPermissionHelper.checkPermissionsAndProceed(this) {
            // 权限通过,启动第二个Activity并传递相机触发标记
            val intent = Intent(this, CreateHomeworkActivity::class.java)
            intent.putExtra("TRIGGER_CAMERA", true)
            startActivity(intent)
        }
    }
}
  1. 第二个Activity的代码和方案一一样,在onCreate中接收标记并执行相机操作即可。

最后再提醒一句:Android里的Activity、Service这些组件,绝对不能自己new出来用,必须通过系统提供的方式(比如Intent启动Activity)来创建,否则组件的Context、视图等都不会被正确初始化,各种异常就找上门了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:37:36