这是我看了夏曹俊老师在上周六的直播预习材料的加持下所写的一个小 demo,不多说,先上 demo 的跑起来的效果。
如下两张图:(点击显示图片的按钮之后就会显示出一张图片,图片是个什么玩意,知足吧,我拿远程模拟机拍摄的)
![215f83f5cd6ba501efac25e721521a17.png](https://i-blog.csdnimg.cn/blog_migrate/53aa62d3d92c410964ce2a8e9de6a9cc.png)
![f9f781ae7f7506e5b22acf377229c1c9.png](https://i-blog.csdnimg.cn/blog_migrate/5af64b65bb7944c1b40623b6a7a744a3.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 的基础上继续完善,有兴趣的朋友可以关注一下。
? 扫码关注鸿蒙技术社区 ?专注开源技术,共建鸿蒙生态
![d9864bfbfc677383b16795e186ee06da.gif](https://i-blog.csdnimg.cn/blog_migrate/7d26a4bc551a639a5822a0f4d45492b6.gif)
点“阅读原文”下载完整 demo 的源码