Android开发问题:选择相册图片后无法在OnActivityResult中展示的原因及解决方法
从相册选图后无法展示的问题分析与解决办法
嘿,我看了你的代码,发现问题出在GalleryActivity的逻辑上——它只是帮你启动了系统相册,但完全没处理相册返回的结果,也没把选中的图片数据回传给ProfileActivity,这就导致ProfileActivity的onActivityResult根本拿不到正确的Uri,自然没法展示图片啦。
具体原因拆解
- 你在GalleryActivity里用
startActivity(intent)启动系统相册,而不是startActivityForResult,这意味着GalleryActivity不会接收系统相册返回的任何结果。 - 就算系统相册返回了数据,GalleryActivity也没有重写
onActivityResult来捕获这些数据,更没有通过setResult把数据传递给上一级的ProfileActivity。
两种解决办法,选一个适合你的就行
办法一:去掉多余的GalleryActivity(推荐)
其实GalleryActivity在这里完全是个中转环节,没必要单独写一个Activity。直接在ProfileActivity里启动系统相册就好,代码更简洁,还能避免结果传递的问题:
public class ProfileActivity extends AppCompatActivity { private static final int PICK_IMAGE_REQUEST = 3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_profile); Button gallery = findViewById(R.id.gallery); gallery.setOnClickListener(v -> { // 直接启动系统相册选择图片 Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI); startActivityForResult(intent, PICK_IMAGE_REQUEST); }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null) { Uri selectedImage = data.getData(); ImageView imageView = findViewById(R.id.imageView); imageView.setImageURI(selectedImage); } } }
办法二:修复GalleryActivity的逻辑
如果你一定要保留GalleryActivity,那得让它正确处理系统相册的返回结果,并把数据回传给ProfileActivity:
public class GalleryActivity extends AppCompatActivity { private static final int PICK_IMAGE_CODE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 用startActivityForResult启动系统相册,这样才能接收返回结果 Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI); startActivityForResult(intent, PICK_IMAGE_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_IMAGE_CODE && resultCode == RESULT_OK && data != null) { // 把系统相册返回的Uri回传给ProfileActivity setResult(RESULT_OK, data); } else { // 用户取消选择时,返回取消状态 setResult(RESULT_CANCELED); } // 关闭GalleryActivity,回到ProfileActivity finish(); } }
额外提示:适配AndroidX的新写法
如果你的项目用了AndroidX,推荐使用ActivityResultContracts替代已废弃的startActivityForResult,这是官方推荐的新方式:
public class ProfileActivity extends AppCompatActivity { // 注册ActivityResultLauncher private ActivityResultLauncher<Intent> pickImageLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_profile); pickImageLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && result.getData() != null) { Uri selectedImage = result.getData().getData(); ImageView imageView = findViewById(R.id.imageView); imageView.setImageURI(selectedImage); } }); Button gallery = findViewById(R.id.gallery); gallery.setOnClickListener(v -> { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI); pickImageLauncher.launch(intent); }); } }
内容的提问来源于stack exchange,提问作者chen abien
相关产品推荐
相关产品推荐

