如何通过registerForActivityResult结合Intent.ACTION_PICK从图库选图加载到ImageView
问题原因&修正方案
- launcher变量名不匹配:你在点击事件中调用的launcher实例名是
imgactivity,但实际注册的ActivityResultLauncher实例名为picactivity,二者不一致会导致回调逻辑无法正常触发。 - Uri获取逻辑错误:
Intent.ACTION_PICK选择图片后返回的Intent中,直接调用getData()就能拿到选中图片的Uri,不需要将整个Intent序列化为Uri。
修正后完整代码
1. 全局声明相关变量
// 全局声明launcher,注意变量名统一 private ActivityResultLauncher<Intent> picActivityLauncher; private ImageView pickimage;
2. onCreate中提前初始化逻辑
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.id.your_layout_name); // 提前初始化ImageView,不要在回调里重复执行findViewById pickimage = findViewById(R.id.pickimage); // 注册ActivityResult回调 picActivityLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { // 直接从返回的Intent中获取图片Uri Uri imageUri = result.getData().getData(); pickimage.setImageURI(imageUri); } } ); // 图库选择按钮点击事件 findViewById(R.id.gallery).setOnClickListener(v -> { Intent imgIntent = new Intent(Intent.ACTION_PICK); imgIntent.setType("image/*"); // 使用正确的launcher实例发起请求 picActivityLauncher.launch(imgIntent); }); }
注意事项
- 请提前申请存储权限:Android 13及以上版本需要申请
READ_MEDIA_IMAGES权限,Android 12及以下版本需要申请READ_EXTERNAL_STORAGE权限,否则即使拿到Uri也无法读取图片内容。 - 如果选中的图片尺寸过大,直接调用
setImageURI可能会触发内存溢出,建议先对图片做压缩处理再设置到ImageView。
内容的提问来源于stack exchange,提问作者moorker
相关产品推荐
相关产品推荐

