代码如何从图库加载图像 Android
How the codes work for loading image from Gallery Android
我有从图库加载图片的代码,但我真的不明白它是如何工作的。这是代码。
@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,那怎么才能让不同的图片得到不同的路径呢?
谁能帮我看看我的解释是否正确,并解释一下我不明白的那一行?谢谢。
游标将查询结果记录存储在行中,并授予许多方法来访问和遍历记录。另外 int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
是你的索引总是 0 的原因
1-
Uri selectedImage = data.getData();
这是您需要读取通过您之前通过 startActivityForResult
方法调用的另一个意图传递的数据的语句。在这种情况下,您可能打开一个意图并让用户 select 一张图像,然后图像的 URI
将被 return 编辑给您,然后您使用 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();
当您从数据库中读取所需的行时(在本例中您可能只是 select 编辑了一张图像),您需要将光标移动到 [= 的第一个条目(行) 50=] 编辑结果
5-
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
您需要知道需要访问哪一列才能读取所需数据(在本例中为文件路径名)。所以你问光标 file pathname
的列索引是什么,它会 return 你的列索引。当然,在这种情况下,它将始终为 0,因为您只要求内容提供者 return 一列 (file pathname
),因此除了
之外不会显示更多数据
6-
String picturePath = cursor.getString(columnIndex);
最后这个语句要求游标获取位于索引处的 file pathname
(在本例中是索引 0
),所以最后你有你的文件路径。注意这个方法一次只能读取一张图片数据
我有从图库加载图片的代码,但我真的不明白它是如何工作的。这是代码。
@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,那怎么才能让不同的图片得到不同的路径呢?
谁能帮我看看我的解释是否正确,并解释一下我不明白的那一行?谢谢。
游标将查询结果记录存储在行中,并授予许多方法来访问和遍历记录。另外 int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
是你的索引总是 0 的原因
1-
Uri selectedImage = data.getData();
这是您需要读取通过您之前通过 startActivityForResult
方法调用的另一个意图传递的数据的语句。在这种情况下,您可能打开一个意图并让用户 select 一张图像,然后图像的 URI
将被 return 编辑给您,然后您使用 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();
当您从数据库中读取所需的行时(在本例中您可能只是 select 编辑了一张图像),您需要将光标移动到 [= 的第一个条目(行) 50=] 编辑结果
5-
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
您需要知道需要访问哪一列才能读取所需数据(在本例中为文件路径名)。所以你问光标 file pathname
的列索引是什么,它会 return 你的列索引。当然,在这种情况下,它将始终为 0,因为您只要求内容提供者 return 一列 (file pathname
),因此除了
6-
String picturePath = cursor.getString(columnIndex);
最后这个语句要求游标获取位于索引处的 file pathname
(在本例中是索引 0
),所以最后你有你的文件路径。注意这个方法一次只能读取一张图片数据