Android从系统图库加载图片至ImageView失败问题排查
解决Android图片选择后无法显示在ImageView的问题
咱们来排查下你代码里的几个关键问题,这些就是导致图片无法正常显示的核心原因:
1. onActivityResult里的判断逻辑错误
你在onActivityResult里写错了判断条件:
if(requestCode == RESULT_OK){
这里应该用resultCode而非requestCode来判断是否成功获取图片,正确的判断逻辑是:
if(resultCode == RESULT_OK){
原来的写法会导致永远无法进入图片加载分支——因为requestCode是你定义的IMAGEM_ID,不可能等于系统的RESULT_OK常量。
2. 权限请求的权限字符串错误
在申请读取外部存储权限时,你用了带引号的字符串:
ActivityCompat.requestPermissions(this, new String[] {"android.Manifest.permission.READ_EXTERNAL_STORAGE"}, PERMISSAO_REQUEST );
正确的做法是直接使用系统提供的权限常量,不需要加引号:
ActivityCompat.requestPermissions(this, new String[] {android.Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSAO_REQUEST );
加引号的字符串系统无法识别为合法权限,会导致权限请求无效——即使用户点击同意,你的App也无法真正获得读取存储的权限。
3. Android 10+的Scoped Storage适配问题
你用MediaStore.Images.Media.DATA获取图片路径的方式在Android 10(API 29)及以上版本已被废弃,受Scoped Storage限制,这种方式可能拿不到正确的文件路径。推荐直接通过ContentResolver打开输入流加载Bitmap,兼容性更好:
修正后的onActivityResult代码:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent intent){ if(requestCode == IMAGEM_ID){ if(resultCode == RESULT_OK && intent != null){ Uri imagem_selecionada = intent.getData(); try { // 直接通过ContentResolver加载Bitmap,适配Scoped Storage Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imagem_selecionada)); pegarImagemImageViewImgem.setImageBitmap(bitmap); } catch (IOException e) { e.printStackTrace(); } } } }
额外小建议
- 在
onRequestPermissionsResult回调里,可以添加用户拒绝权限后的提示逻辑,告知用户拒绝权限将无法使用图片选择功能; - 加载Bitmap时建议做适当压缩(比如用
BitmapFactory.Options设置inSampleSize),避免大图片导致内存溢出。
把这些修改完成后再测试,应该就能正常显示选择的图片了!
内容的提问来源于stack exchange,提问作者AlbhedJupiter
相关产品推荐
相关产品推荐

