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

时间:2018-08-01 01:42:25

标签: android parcelable onactivityresult

我是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");

第一:“数据”密钥从何而来?

第二:为什么使用Parcelable,为什么不使用HasExtra("data")

第三步::将位图和URI一起使用的目的是什么?我知道要获取其位置的URI,但是如果有的话,它是位图。 URI的重要性如何,反之亦然

第四次: getParcelableExtra()getParcelable()

有什么区别?

第五:我什么时候打onActivityResult

1 个答案:

答案 0 :(得分:1)

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

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

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();
   }
}
  

首先:“数据”密钥从何而来?

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

  

第二:为什么使用Parcelable,为什么不使用HasExtra(“ data”)

Parcelable是android将对象从一个进程序列化到另一个进程的方式。基本上,当您调用意图并想要传递一些数据对象时,该对象必须实现Parcelebale接口。因此,在意图对象上,您可以检查意图是否具有带有对象键名并使用intent.hasExtra("keyname")的其他对象方法。当您想从Intent中检索Parcelable对象时,可以简单地在Intent上使用getParcelableExtra("keyname"),也可以使用getExtra()获得该Intent的所有其他功能,它返回一个包,然后在该包上调用getParcelable("keyname")获取相同的Parcelable对象

  

第三:将位图和URI一起使用的目的是什么?我知道URI可以获取其位置,但是如果有位图,.URI的重要性是什么,反之亦然

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

  

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

每当您开始一项活动(基本上使用startActivityForResult(intent))并期望从中获得一些结果时,即:调用gallery并且您希望Gallery活动返回一张图片,则必须实现onActivityResult方法因此android可以调用它并为您提供请求的结果(如果有的话)

希望有帮助 快乐的编码