如何在Android中从相册加载图像的代码工作

3

我有从画廊加载图像的代码,但我真的不明白它是如何工作的。下面是代码。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { //Browse Gallery is requested
            
            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };

            Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();

            loadImage(picturePath);         //load picture according the path
            image_View.setImageBitmap(pic); //Show the selected picture
        }
    }   

Uri selectedImage = data.getData(); 

从意图中获取选定图像的URI

String[] filePathColumn = { MediaStore.Images.Media.DATA };

MediaStore.Images.Media.DATA是一个常量。我不理解为什么不使用String而是使用String[]。

Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);

我不理解这行代码。

cursor.moveToFirst();

移动到画廊中的第一张图片。

int columnIndex = cursor.getColumnIndex(filePathColumn[0]);

无论我选择哪张图片,这个问题总是返回0。
String picturePath = cursor.getString(columnIndex);

由于columnIndex始终为0,那么它如何为不同的图片获取不同的路径呢?

有人能帮我检查我的解释是否正确并解释我不理解的那一行吗?谢谢。

2个回答

5

1-

Uri selectedImage = data.getData();

这是一个语句,你需要通过之前使用的 startActivityForResult 方法调用的另一个意图来读取传递的数据。在这种情况下,可能会打开一个意图并让用户选择一张图片,然后将图像的 URI 返回给您,您可以使用 getData 来读取它。

2-

String[] filePathColumn = { MediaStore.Images.Media.DATA };

当您想要通过ContentResolver从内容提供者读取内容时,需要指定要从数据库中读取哪些列,并且您需要传递的参数应该是一个字符串数组(无论它有一个还是多个列,您仍然需要传递一个数组)。 MediaStore.Images.Media 是一个包含常量的数据库合同,您需要使用这些常量来与内容提供者进行通信。
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);

游标用于从内容提供者读取数据。如果您熟悉其他编程语言,它类似于从数据库中读取行,并且结果存储在游标中。当您传递URI时,无需指定要读取哪个数据库,ContentResolver将为您找到它(这是使用内容提供者的优点)。
cursor.moveToFirst();

当你从数据库中读取所需的行(在这种情况下,可能只选择了一张图像),你需要将游标移动到指向返回结果的第一条记录(行)。
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);

你需要知道需要访问哪一列来读取你想要的数据(在这种情况下是文件路径名)。所以你询问光标文件路径名的列索引是多少,它将返回给你列索引。当然,在这种情况下,它始终为0,因为你只要求内容提供者返回一个列(文件路径名),所以除此之外就没有其他数据可以显示了。
String picturePath = cursor.getString(columnIndex);

最后,这个语句要求光标获取位于索引(在本例中为索引0)处的文件路径名,因此最终你就有了文件路径。请注意,使用此方法每次只能读取一张图片的数据。


0

游标将查询结果记录存储在行中,并授予许多方法来访问和迭代记录。此外,int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 是您始终获取索引为0的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接