如何从 android 中的图库中检索图片?

How to retrieve a picture from gallery in android?

我是 android 的新手,我正在研究如何从图库中检索图片,但我对以下代码几乎没有疑问:

static final int REQUEST_IMAGE_GET = 1;

public void selectImage() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, REQUEST_IMAGE_GET);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) {
        Bitmap thumbnail = data.getParcelable("data");
        Uri fullPhotoUri = data.getData();
        // Do work with photo saved at fullPhotoUri
        ...
    }
}

这一行:Bitmap thumbnail = data.getParcelable("data");

第一:"data"密钥从何而来?

其二:为什么要用Parcelable,为什么不用HasExtra("data")

第三:位图和URI放在一起有什么用?我理解 URI 来获取它的位置,但如果我有它的位图。 URI 的重要性是什么,反之亦然

四:getParcelableExtra()getParcelable()有什么区别

第五:我什么时候打电话给onActivityResult

所以这里有很多问题!!!

我知道让用户从图库中选择图像的最简单 Intent 是:

public static final int GALLERY_REQUEST = 1001;

Intent galleryIntent = new Intent(
                    Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent , GALLERY_REQUEST );

然后可以这样获取用户选择的图片Uri:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
   if(requestCode == GALLERY_REQUEST && data != null && data.getData() != null){
       //this is the uri of the image use it to load the image 
       Uri imageUri = intent.getData();
   }
}

First: where did "data" key come from?

intent.getData() 是 android 提供的密钥,用于使用已选择的内容(图像、音乐和...)

Second: why using Parcelable ,why not using HasExtra("data")

Parcelable 是 android 将对象从一个进程序列化到另一个进程的方式。基本上,当你调用一个意图并想传递一些数据对象时,该对象必须在一个意图对象上实现 Parcelebale interface.so 你可以检查意图是否有一个带有对象键名的额外对象并使用 intent.hasExtra("keyname") 方法。当你想从 Intent 中检索 Parcelable 对象时,你可以简单地在意图上使用 getParcelableExtra("keyname") 或者你可以使用 getExtra() 获得该意图的所有额外内容,其中 return 是一个包,然后在bundle 你可以调用 getParcelable("keyname") 来获得相同的 Parcelable 对象

Third: what is the purpose of having a bitmap and a URI together? i understand the URI to get its location,but if i have it's bitmap ..whats the importance of the URI and vice versa

android 不会只给你一个 Uri 位图。您将决定如何处理该 Uri,从中加载位图或创建文件。

Fifth: when do i call onActivityResult?

当你启动一个 activity(基本上使用 startActivityForResult(intent))并期望从中得到一些结果时,即:调用画廊并且你想要画廊 activity 到 return你是一张图片,你必须实现 onActivityResult 方法以便 android 可以调用它并为你提供请求的结果(如果有的话)

希望对您有所帮助 快乐编码