Kotlin跨Activity调用函数触发空指针异常,求解决方案
解决Activity间调用方法引发的NullPointerException问题
你碰到的这个空指针错误,核心原因很明确:你直接用private val createHomeworkActivity = CreateHomeworkActivity()手动new了第二个Activity的实例,但Android的Activity是系统管控的组件,这种方式创建的Activity根本没经过系统的初始化流程,它的Context是null的,所以调用ContextCompat.checkSelfPermission的时候就触发了空指针异常。
下面给你两种靠谱的解决方案:
方案一:通过Intent启动Activity并传递触发标记
这种方式是Android组件交互的标准姿势,我们通过Intent启动第二个Activity,同时告诉它需要执行相机操作:
- 第一个Activity中修改点击事件的代码:
when (v?.id){ R.id.take_a_photo -> { val intent = Intent(this, CreateHomeworkActivity::class.java) // 传递一个布尔值标记,告诉第二个Activity要启动相机 intent.putExtra("TRIGGER_CAMERA", true) startActivity(intent) } }
- 第二个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解耦,建议把这部分代码抽成工具类,这样后续其他地方也能复用:
- 创建一个相机工具类:
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() } } }
- 第一个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) } } }
- 第二个Activity的代码和方案一一样,在
onCreate中接收标记并执行相机操作即可。
最后再提醒一句:Android里的Activity、Service这些组件,绝对不能自己new出来用,必须通过系统提供的方式(比如Intent启动Activity)来创建,否则组件的Context、视图等都不会被正确初始化,各种异常就找上门了。
内容的提问来源于stack exchange,提问作者jithin prvak
相关产品推荐
相关产品推荐

