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

迁移至registerForActivityResult并使用FileProvider时触发InstantiationException

问题:迁移至registerForActivityResult时应用崩溃,抛出无参构造函数异常

原有代码

private void OpenGallery(){
    Intent galleryIntent = new Intent();
    galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
    galleryIntent.setType("image/*");
    startActivityForResult(galleryIntent, GalleryPick);// 标记为已废弃
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode==GalleryPick  &&  resultCode==RESULT_OK  &&  data!=null)
    {
        ImageUri = data.getData();
        InputProductImage.setImageURI(ImageUri);
    }
}

崩溃异常

exception:java.lang.InstantiationException: java.lang.Class<com.firmvision.waste2wealth.AdminAddNewProductActivity> has no zero argument constructor


解决方案

1. 正确迁移至registerForActivityResult

在Activity中初始化ActivityResultLauncher,替换原有的startActivityForResult调用:

// 全局声明Launcher
private ActivityResultLauncher<Intent> galleryLauncher;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_activity_layout);

    // 初始化相册选择的Launcher
    galleryLauncher = registerForActivityResult(
        new ActivityResultContracts.StartActivityForResult(),
        result -> {
            // 处理返回结果,逻辑和原onActivityResult一致
            if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                Uri imageUri = result.getData().getData();
                InputProductImage.setImageURI(imageUri);
            }
        });
}

// 修改OpenGallery方法
private void OpenGallery(){
    Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
    galleryIntent.setType("image/*");
    galleryLauncher.launch(galleryIntent);
}

2. 修复无参构造函数异常

确保AdminAddNewProductActivity存在公共无参构造函数。如果之前定义了带参数的构造函数,系统默认无参构造会被覆盖,需手动添加:

public class AdminAddNewProductActivity extends AppCompatActivity {
    // 手动添加无参构造函数
    public AdminAddNewProductActivity() {
        // 空实现即可
    }

    // 其他业务代码...
}

原因说明

系统在配置变更(如屏幕旋转)、进程重启等场景下会重新创建Activity,此时必须通过无参构造函数完成实例化。如果Activity没有无参构造,系统无法生成实例,就会抛出InstantiationException。同时registerForActivityResult的回调依赖Activity的正常实例化,因此必须先修复构造函数问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 09:35:27