代码如何从 Android 画廊加载图像

Sam*_*Tew 3 android image android-cursor

我有用于从图库加载图像的代码,但我真的不明白它是如何工作的。这是代码。

    @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
    }
}
Run Code Online (Sandbox Code Playgroud)

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,那么不同的图片如何得到不同的路径呢?

谁能帮我检查我的解释是否正确并解释我不明白的行?谢谢。

Poo*_*oya 5

1-

Uri selectedImage = data.getData();
Run Code Online (Sandbox Code Playgroud)

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

2-

String[] filePathColumn = { MediaStore.Images.Media.DATA };
Run Code Online (Sandbox Code Playgroud)

当您希望游标从 Content Provider (via ContentResolver)读取某些内容时,您需要指定您需要从数据库中读取哪些列,并且您需要传递的参数应该是一个 String 数组(无论它有一个还是多个列,您仍然需要传递一个数组)。MediaStore.Images.Media是一个数据库合同,其中包含您需要用来与内容提供者交谈的常量

3-

Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
Run Code Online (Sandbox Code Playgroud)

游标用于从内容提供者读取数据。如果您熟悉其他编程语言,这就像从数据库中读取行并将结果存储在 Cursors 中。当您传递 URI 时,您不需要指定要读取的数据库,ContentResolver会为您找到(这是使用内容提供程序的优势)

4-

cursor.moveToFirst();
Run Code Online (Sandbox Code Playgroud)

当您从数据库中读取所需的行时(在这种情况下,您可能只选择了一个图像),您需要将光标移动到返回结果的第一个条目(行)

5-

int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
Run Code Online (Sandbox Code Playgroud)

您需要知道需要访问哪一列才能读取所需的数据(在本例中为文件路径名)。所以你问游标的列索引是什么file pathname,它会返回列索引。当然,在这种情况下,它将始终为 0,因为您只要求内容提供者返回一列 ( file pathname),因此除此之外不会显示更多数据

6-

String picturePath = cursor.getString(columnIndex);
Run Code Online (Sandbox Code Playgroud)

最后,此语句要求光标获取file pathname位于索引处(在本例中为 index 0),因此最后您将获得文件路径。请注意,使用此方法一次只能读取一个图片数据