如何在onActivityResult方法中获取图库图片的ByteArray?
如何在onActivityResult中获取所选图库图片的ByteArray?
嘿,我来帮你搞定这个问题!你已经写了打开图库的点击事件,接下来只需要在onActivityResult里做这几步就能拿到图片的ByteArray了:
- 首先,先定义一个请求码(比如
private static final int PICK_IMAGE_REQUEST = 1;),用来在onActivityResult里识别这个图库选择的请求。 - 重写
onActivityResult方法,先判断请求码和结果码是否符合预期,再处理选中的图片Uri:
private static final int PICK_IMAGE_REQUEST = 1; // 补充完整你的Add Image按钮点击事件 addImageButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, PICK_IMAGE_REQUEST); } }); // 重写onActivityResult方法处理返回结果 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); // 校验请求是否成功、请求码匹配且返回数据不为空 if (resultCode == RESULT_OK && requestCode == PICK_IMAGE_REQUEST && data != null) { Uri selectedImageUri = data.getData(); if (selectedImageUri != null) { try { // 通过ContentResolver获取图片输入流 InputStream inputStream = getContentResolver().openInputStream(selectedImageUri); // 将输入流转换为ByteArray byte[] imageByteArray = convertInputStreamToByteArray(inputStream); // 拿到ByteArray后,你可以存入数据库,也可以直接用来展示图片 if (imageByteArray != null) { Bitmap bitmap = BitmapFactory.decodeByteArray(imageByteArray, 0, imageByteArray.length); yourImageView.setImageBitmap(bitmap); } } catch (IOException e) { e.printStackTrace(); // 这里可以加个Toast提示用户图片读取失败 } } } } // 工具方法:把InputStream转换成ByteArray private byte[] convertInputStreamToByteArray(InputStream inputStream) throws IOException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { byteArrayOutputStream.write(buffer, 0, length); } // 记得关闭流资源 inputStream.close(); byteArrayOutputStream.close(); return byteArrayOutputStream.toByteArray(); }
关键点说明:
- 用
getContentResolver()是因为图库图片通过Uri标识,需要通过ContentResolver才能访问到对应的文件内容; - 一定要处理IO异常:比如图片被删除、权限不足等情况都可能导致读取失败,try-catch能避免App崩溃;
- Android 10及以上版本用
ACTION_PICK的方式不需要额外申请存储权限,系统会自动适配。
内容的提问来源于stack exchange,提问作者ShashankAC
相关产品推荐
相关产品推荐

