代码如何从 Android Gallery 加载图像

2024-05-28

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

@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,那么如何才能为不同的图片获取不同的路径呢?

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


1-

Uri selectedImage = data.getData();

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

2-

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

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

3-

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

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

4-

cursor.moveToFirst();

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

5-

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

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

6-

String picturePath = cursor.getString(columnIndex);

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码如何从 Android Gallery 加载图像 的相关文章

  • Android 使用键盘上的“完成”按钮来单击按钮

    好的 在我的应用程序中 我有一个供用户输入数字的字段 我已将该字段设置为仅接受数字 当用户单击该字段时 它会弹出键盘 键盘 ICS 上 上有一个完成按钮 我希望键盘上的完成按钮能够触发我的应用程序中的提交按钮 我的代码如下 package
  • 毕加索不在磁盘上缓存图像

    我必须使用自定义 OkHttpClient 以便我可以向图像请求添加标头 问题是毕加索不会因此而在磁盘上缓存任何图像 我用过setIndicatorsEnabled true 检查缓存 我只看到红色指示器 当我使用默认的 OkHttpDow
  • Android 相机:线程?哪个应该做什么

    我试图弄清楚哪些线程应该在 Android 中执行哪些操作 我发现官方文档中唯一说明的是camera open 应该放入它自己的线程中 关于什么 camera startPreview camera stopPreview camera r
  • 如何设置 MediaCodec 创建的编码器缓冲区大小

    我正在尝试使用 Nexus 来测试 Mediacodec API 的编码 我可以看到编码器提供的inputBuffers是119040 通过记录inputBuffers capacity 但帧的大小 即输入 是 460800 我收到错误消息
  • Jetpack Compose 预览未显示

    我似乎在撰写预览时遇到问题 当我使用 preview 注释撰写方法时 布局面板不会出现 我假设我缺少依赖项 但我已从此处复制并粘贴了代码https developer android com jetpack compose setup ht
  • 如何裁剪 JavaFX 图像并调整其大小?

    我正在尝试在 JavaFX 画布上显示非常大的图像 单张图像的分辨率为11980x8365 每个图像都有一个相应的世界文件 我可以使用它来正确定位图像 我的画布尺寸是 800x600 有时我需要在画布上写下整个图像 有时只是其中的一部分 这
  • Android 上有某种 ASLR 保护吗?

    我想知道是否有人可以访问具有从程序的一个实例到另一个实例的函数地址相同的库 在同一设备上运行时 地址空间布局将非常一致 许多主要系统库都是由 zygote 预加载的 因此由它分叉出来的子级继承为共享映射 以区分为应用程序 我认为在虚拟内存级
  • Android SQLite 查询被 Android Studio 标记为错误

    在我的一个 Android 应用程序中 我使用了一些SQLite自从我更新到以来开始出现问题的查询Android Studio 3 0 尽管我可以编译并运行该应用程序 但它们被标记为错误 这些是查询 db execSQL INSERT IN
  • AsyncTask加载图像RecyclerView

    我正在尝试创建一个与该应用程序类似的应用程序 一个在回收视图中包含一些图像和描述 卡片视图 的应用程序 https lh5 ggpht com At pHbZqdzlgmAqY0jbiztDYIAts1wOYWGTOHibmFHuq8CFA
  • 是否可以检测Android应用程序卸载?

    我的应用程序使用 Google 的 C2DM 推送通知 来通知用户朋友的新活动 一旦他们安装了应用程序 我就会向 C2DM 服务器注册设备并存储用户的电话号码 所以我知道用户正在使用我的应用程序 我可以向他 她发送推送通知 但是 如果用户卸
  • Android avd 管理器根本不工作 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我最近想尝试创建一个 Android
  • 如何同时运行两个FOR循环

    我正在使用加速度计 第一个代码是振动检测器 代码1 if sensor SensorManager SENSOR ACCELEROMETER long curTime System currentTimeMillis long now Sy
  • 在android上获取电池温度

    android 如何获取电池的温度 http developer android com reference android os BatteryManager html http developer android com referen
  • 如何使用 Android 的身份验证标签进行 GCM 加密

    我想制作一个通过 GCM 模式与 Android 身份验证标签加密数据的函数 这是我的源代码 public static byte GCMEncrypt String hexKey String hexIV byte aad throws
  • 如果没有 @Provides 注释的方法,则无法提供 Dagger AndroidInjector

    我已经通过 MVP 模式完成了我的 Android 项目 MainActivity 因此 在我的 MainPresenter 中 我想注入一个动态字符串 然后该字符串将填充 TextView 例如 class MyMainPresenter
  • Android 堆栈跟踪显示生产 Firebase crashlytics 中的测试代码

    该应用程序的 Play 商店版本的 Firebase crashlytics 中报告了该异常 当用户进入启动活动时会发生这种情况 任何帮助 将不胜感激 谢谢 没有其他可用的堆栈跟踪有助于跟踪代码发生的位置 Fatal Exception j
  • 更新 android chrome 版本 65 后,应用程序无法运行,Sencha touch 和 cordova android

    更新 chrome 版本 65 后 应用程序在点击某些点击事件时再次显示启动屏幕 它是 Sencha touch 和 Cordova android 的混合应用程序 编辑 这是一个已知的 chrome 65 错误 https bugs ch
  • PopupWindow 在 Android API 28 的自定义键盘上被剪切

    我做了一个定制键盘 当您长按某个键时 会出现PopupWindow在按键上方显示一些额外的选项 问题在于 在 API 28 中 此弹出窗口被剪切 甚至顶行完全隐藏 我已经为 API with https stackoverflow com
  • 将阿拉伯语文本导出为图像

    我有一堆 UTF 8 格式的阿拉伯文本 我尝试显示此设备的设备不支持显示阿拉伯语文本 因此 我需要将文本转换为图像 我想将每行文本保存为具有特定宽度的图像 我还需要使用特定的字体 做这个的最好方式是什么 有人知道这里有一个有用的工具吗 到目
  • 刷新 ArrayAdapter onResume [notifyDataSetChanged() 不起作用]

    我正在使用片段创建一个联系人列表应用程序 其中一个片段是联系人列表中的姓名列表 另一个是其余详细信息 这是显示名称列表的类 public class MyListFragment extends ListFragment private C

随机推荐