android - 这些代码如何从 Android Gallery 加载图像

标签 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
        }
    }   
Uri selectedImage = data.getData(); 

从intent中获取选中图片的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,那怎么才能对不同的图片获取不同的路径呢?

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

最佳答案

1-

Uri selectedImage = data.getData();

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

2-

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

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

3-

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

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

4-

cursor.moveToFirst();

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

5-

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

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

6-

String picturePath = cursor.getString(columnIndex);

最后,此语句要求游标获取位于索引(在本例中为索引 0)的 文件路径名,因此最后您将获得文件路径。注意该方法一次只能读取一张图片数据

关于android - 这些代码如何从 Android Gallery 加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36466483/

相关文章:

java - 如何从android中的游标检索数据?

java - 当我搜索数据时,我的应用程序被迫停止。我该如何解决这个问题?

Android viewpager 动画

html - 当窗口变小时保持图像比例相同

image - Bootstrap 响应 img 但更改图像高度和宽度

css - 将图像裁剪为大屏幕上的条纹

java - Cursor.moveToNext 错误

java - 在智能手机上播放通过蓝牙从 SensorTile 接收的音频 (STEVAL-STLKT01V1)

android - 我该如何着手制作这个布局?遇到这么多麻烦

android - 使用 React Native 检测设备何时开机