如何在 ImageView 中显示图库中的图像?
Posted
技术标签:
【中文标题】如何在 ImageView 中显示图库中的图像?【英文标题】:How to display an image from the Gallery in an ImageView? 【发布时间】:2020-12-16 06:29:54 【问题描述】:我创建了一个按钮,让用户可以在“用相机拍照”和“从图库中选择图片”之间进行选择。
当照片被拍摄/选择后,我将它显示在下一个活动的 ImageView 中,我通过传递创建的文件的 URI 来存储拍摄/选择的照片。
当用户用他的相机拍照时,它按预期工作,但是当他从图库中选择一张图片时,尽管两个意图(拍照和选择一张图片)的编码相同,但下一个活动中不会显示任何图像。
我的问题:为什么只有从图库中挑选的图像才显示在下一个活动中?或者我应该如何继续展示它?
打算打开相机(工作正常):
private void openCameraToTakePictureIntent()
Log.d(TAG, "Method for Intent Camera started");
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null)
// Create the File where the photo should go
File photoFile = null;
try
photoFile = createImageFile();
catch (IOException ex)
// Error occurred while creating the File
if (photoFile != null)
Uri photoURI = FileProvider.getUriForFile(this,
"com.emergence.pantherapp.fileprovider", photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
打算访问图库并选择图像:
private void openGalleryIntent()
Log.d(TAG, "Method for Intent Gallery started");
Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
if (galleryIntent.resolveActivity(getPackageManager()) != null)
File photoFile = null;
try
photoFile = createImageFile();
catch (IOException ex)
// Error occurred while creating the File
if (photoFile != null)
Uri photoURI = FileProvider.getUriForFile(this,
"com.emergence.pantherapp.fileprovider", photoFile);
galleryIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(galleryIntent, PICK_IMAGE);
然后是onActivityResult:(currentPhotoPath是为存储图片而创建的文件的绝对路径)
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && requestCode == 1)
Log.d(TAG, currentPhotoPath);
Intent intent = new Intent(this, ModifyPictureActivity.class);
intent.putExtra("USER_IMAGE", currentPhotoPath);
startActivity(intent);
else if (resultCode == Activity.RESULT_OK && requestCode == 2)
Log.d(TAG, currentPhotoPath);
Intent intent = new Intent(this, ModifyPictureActivity.class);
intent.putExtra("USER_IMAGE", currentPhotoPath);
startActivity(intent);
以下是图像在以下活动中的显示方式:
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_modify_picture);
Intent intent = getIntent();
String imageUri = intent.getStringExtra("USER_IMAGE");
if (imageUri != null)
Log.d(TAG, imageUri);
else
Log.d(TAG, "imageUri was null");
image = findViewById(R.id.picture);
image.setImageURI(Uri.parse(imageUri));
我确保清单中有 READ_EXTERNAL_STORAGE,并且 xml 布局的高度和宽度仅设置为“match_parent”,但如果相关,我可以添加它们。
【问题讨论】:
ACTION_PICK
不使用EXTRA_OUTPUT
。见the documentation 和the documentation。
@CommonsWare 谢谢。您知道如何从我之前创建的文件中的 ACTION_PICK 返回的 URI 中复制所选图像吗?
使用ContentResolver
和openInputStream()
在Uri
标识的内容上获取InputStream
。使用FileOutputStream
在File
标识的内容上获取OutputStream
。然后,将字节从InputStream
复制到OutputStream
。
我不知道如何将此标记为有效答案。效果很好,谢谢。
【参考方案1】:
很少有Intent
操作使用EXTRA_OUTPUT
。大多数情况下,这是ACTION_IMAGE_CAPTURE
的事情。
更典型的是,Intent
用于获取一条内容(ACTION_PICK
、ACTION_GET_CONTENT
、ACTION_OPEN_DOCUMENT
、ACTION_CREATE_DOCUMENT
、ACTION_OPEN_DOCUMENT_TREE
等)返回一个Uri from the content supplier in the
Intentdelivered to
onActivityResult (). Given your implementation, that would be
data.getData()to get that
Uri`.
然后,您可以使用ContentResolver
和openInputStream()
在Uri
标识的内容上获取InputStream
。例如,在您的情况下,您可以使用 InputStream
将字节复制到 FileOutputStream
以制作您自己的内容本地副本。
注意you only have short-term access to the content identified by the Uri
。
【讨论】:
以上是关于如何在 ImageView 中显示图库中的图像?的主要内容,如果未能解决你的问题,请参考以下文章
如何将图像连接到另一个 ViewController 并在 ImageView 中显示它?