java如何获取按钮上的图片的id_获取系统照片并解码渲染显示(附完整demo)

该博客介绍了一个Java Demo,展示如何在Android设备上获取并显示用户拍摄的照片。首先,通过获取读取图片的权限,然后搜索并获取图片ID,将其转化为URI,接着用URI生成Pixmap,最后用Image渲染显示图片。
摘要由CSDN通过智能技术生成

这是我看了夏曹俊老师在上周六的直播预习材料的加持下所写的一个小 demo,不多说,先上 demo 的跑起来的效果。

如下两张图:(点击显示图片的按钮之后就会显示出一张图片,图片是个什么玩意,知足吧,我拿远程模拟机拍摄的)

215f83f5cd6ba501efac25e721521a17.png f9f781ae7f7506e5b22acf377229c1c9.png

完整 demo 在附件中进行下载

说一下操作步骤吧,把 demo 烧进手机,记住此时候的手机是没有图片的,先打开照相机拍摄一张图片,然后你就会得到和下面截图一样的图片,然后打开 demo,点击显示图片按钮就会显示你拍摄到的图片了。

老规矩还是先说一下大概思路:

  • 读取本机的图片,首先你得有权限,所以先想办法获得权限。

  • 获得权限之后,就可以使用类似数据库的搜索方法来搜索图片的 ID 了。

  • 获得 ID 之后,然后将其转换为 uri。

  • 得到 uri 之后,然后使用 uri 生成 Pixmap。

  • 得到 Pixmap 之后,使用 Image 来渲染其 Pixmap。

①来获得读取照片的权限

在 config 中添加如下配置文件:
 "reqPermissions": [{
 "name": "ohos.permission.READ_USER_STORAGE"
 }
然后在 java 代码中获取到这个权限:
String[] permission = {"ohos.permission.READ_USER_STORAGE"};
requestPermissionsFromUser(permission,0);

②获得权限之后,就可以使用类似数据库的搜索方法来搜索图片的 ID 了

首先获得一个 DataAbilityHelper:
DataAbilityHelper helper = DataAbilityHelper.creator(getContext());
然后调用 query 查询方法获得图片 ID,这里其实只有一张:
ResultSet result = helper.query(AVStorage.Images.Media.EXTERNAL_DATA_ABILITY_URI, null, null);
int mediaId = result.getInt(result.getColumnIndexForName(AVStorage.Images.Media.ID));

③获得 ID 之后,然后将其转换为 uri

代码如下:

Uri uri = Uri.appendEncodedPathToUri(AVStorage.Images.Media.EXTERNAL_DATA_ABILITY_URI,""+mediaId);

④得到 uri 之后,然后使用 uri 生成 Pixmap

步骤如下:
  • 先将得到的 uri 使用 openFile 的 API 得到 FileDescriptor 对象。

  • 使用上一步的对象作为参数新建一个ImageSource对象和这个对象之下的 DecodingOptions 对象。

  • 然后调用上一步建好的 ImageSource 对象的 createThumbnailPixelmap 方法生成 Pixmap。
FileDescriptor filedesc = helper.openFile(uri,"r");
ImageSource.DecodingOptions decodingOpts = new ImageSource.DecodingOption();
decodingOpts.desiredSize = new Size(300,300);
ImageSource imageSource = ImageSource.create(filedesc,null);
PixelMap pixelMap = imageSource.createThumbnailPixelmap(decodingOpts,true);

⑤得到 Pixmap 之后,使用 Image 来渲染其 Pixmap

无论使用何种手段得到一个 Image 对象,然后调用它的 setPixelMap 将上一步得到的 Pixmap 作为参数传进去就 OK 了。至于别的都是一些对 Image 其他属性的设置。
Image img = (Image)findComponentById(ResourceTable.Id_image1);
img.setId(mediaId);
img.setHeight(300);
img.setWidth(300);
img.setMarginTop(20);
img.setMarginLeft(20);
img.setPixelMap(pixelMap);
img.setScaleMode(Image.ScaleMode.ZOOM_CENTER);

由于时间比较急,所以这个 demo 比较简单,只可以显示一张图片,下周我应该会在这个 demo 的基础上继续完善,有兴趣的朋友可以关注一下。

? 扫码关注鸿蒙技术社区 ?

e2fe6f952d0de3a71b84f0c227089214.png

专注开源技术,共建鸿蒙生态

d9864bfbfc677383b16795e186ee06da.gif

“阅读原文”下载完整 demo 的源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值