0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙系统访问系统相册方法

OpenHarmony技术社区 来源:鸿蒙技术社区 作者:拓维云创易乘民 2021-08-26 17:49 次阅读

前几天有朋友问我如何通过 AVStorage 来获取鸿蒙系统相册的图片,这个操作在我们平时开发时也经常用到,今天就分享一下鸿蒙系统访问系统相册的方法。

鸿蒙的 AVStorage 对应的是 Android 中的 MediaStore,都是用于操作系统媒体数据库的类。

但是现在开放的功能不如 MediaStore 强大,很多操作需要用的字段还找不到。

这里我先通过一段安卓程序往系统相册目录中写入三张图片,并插入媒体数据库:

//将文件保存到公共的媒体文件夹//这里的filename单纯的指文件名,不包含路径@RequiresApi(Build.VERSION_CODES.Q)fun saveImage(fileName: String, bitmap: Bitmap) {

try {

//设置保存参数到ContentValues中

val contentValues = ContentValues()

//设置文件名

contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName)

//android Q中不再使用DATA字段,而用RELATIVE_PATH代替

//RELATIVE_PATH是相对路径不是绝对路径

//DCIM是系统文件夹,关于系统文件夹可以到系统自带的文件管理器中查看,不可以写没存在的名字

contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, “DCIM/”);

//设置文件类型

contentValues.put(MediaStore.Images.Media.MIME_TYPE, “image/JPEG”)

//执行insert操作,向系统文件夹中添加文件

//EXTERNAL_CONTENT_URI代表外部存储器,该值不变

val uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)

if (uri != null) {

//若生成了uri,则表示该文件添加成功

//使用流将内容写入该uri中即可

val outputStream: OutputStream? = contentResolver.openOutputStream(uri)

if (outputStream != null) {

bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream)

outputStream.flush()

outputStream.close()

}

}

} catch (e: Exception) {

e.printStackTrace()

}

}

val bitmap = resources.getDrawable(R.mipmap.ic_launcher, null).toBitmap()

saveImage(“test”, bitmap)

这里我是放在点击事件回调中,点击三次,插入了三张同样的图片,该方法会自动给重复的图片重命名。

通过 AS 的文件管理器和系统的图库我们可以看到已经写入成功了,接下来再用系统相机拍两张照片,以创建不同来源的媒体图片,同样可在文件管理器和图库中查看结果。

这样,数据就做好了,接下来,我们通过鸿蒙提供的 API 来获取系统相册的图片并显示出来。

首先,读取系统相册需要获取 ohos.permission.READ_USER_STORAGE 权限,我们需要在 config.json 中加入如下代码:

“reqPermissions”: [{“name”: “ohos.permission.READ_USER_STORAGE”}]

并且,该权限需要动态申请,我们需要在 ability 中手动申请权限:

String[] permissions = {“ohos.permission.READ_USER_STORAGE”};

requestPermissionsFromUser(permissions, 0);

获取到权限之后,我们就可以通过 DataAbilityHelper 和 AVStorage 来查询媒体数据库了。

获取媒体外部存储中的图片 URI 需要使用的预定义字段是:AVStorage.Images.Media.EXTERNAL_DATA_ABILITY_URI:

private void showImage() {

DataAbilityHelper helper = DataAbilityHelper.creator(this);

try {

// columns为null,查询记录所有字段,当前例子表示查询id字段

ResultSet resultSet = helper.query(AVStorage.Images.Media.EXTERNAL_DATA_ABILITY_URI, new String[]{AVStorage.Images.Media.ID}, null);

while (resultSet != null && resultSet.goToNextRow()) {

PixelMap pixelMap = null;

ImageSource imageSource = null;

Image image = new Image(this);

image.setWidth(250);

image.setHeight(250);

image.setMarginsLeftAndRight(10, 10);

image.setMarginsTopAndBottom(10, 10);

image.setScaleMode(Image.ScaleMode.CLIP_CENTER);

// 获取id字段的值

int id = resultSet.getInt(resultSet.getColumnIndexForName(AVStorage.Images.Media.ID));

Uri uri = Uri.appendEncodedPathToUri(AVStorage.Images.Media.EXTERNAL_DATA_ABILITY_URI, String.valueOf(id));

FileDescriptor fd = helper.openFile(uri, “r”);

try {

imageSource = ImageSource.create(fd, null);

pixelMap = imageSource.createPixelmap(null);

} catch (Exception e) {

e.printStackTrace();

} finally {

if (imageSource != null) {

imageSource.release();

}

}

image.setPixelMap(pixelMap);

tableLayout.addComponent(image);

}

} catch (DataAbilityRemoteException | FileNotFoundException e) {

e.printStackTrace();

}

}

我们通过一个 TableLayout 来模仿图库界面展示获取到的系统相册图片:

tableLayout = (TableLayout) findComponentById(ResourceTable.Id_table);

tableLayout.setColumnCount(4);

showImage();

至此,我们就获取到了系统相册目录下的图片。责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 华为
    +关注

    关注

    215

    文章

    34268

    浏览量

    251060
  • 操作系统
    +关注

    关注

    37

    文章

    6707

    浏览量

    123159
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2634

    浏览量

    66184
  • HarmonyOS
    +关注

    关注

    79

    文章

    1966

    浏览量

    29978

原文标题:如何获取鸿蒙系统相册图片?

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    鸿蒙系统专用版微信内测即将启动

    近日,有知情人士称鸿蒙系统专用版微信的开发工作现已基本完成。这一消息标志着微信在适配鸿蒙系统方面取得了重要进展,为鸿蒙
    的头像 发表于 11-07 10:58 250次阅读

    原生鸿蒙操作系统正式发布,诚迈科技与华为一起共建鸿蒙新世界

    10月22日,我国首个国产移动操作系统——华为原生鸿蒙操作系统正式发布,这也是继苹果iOS和安卓系统后,全球第三大移动操作系统。此次发布的原
    的头像 发表于 10-28 09:29 316次阅读
    原生<b class='flag-5'>鸿蒙</b>操作<b class='flag-5'>系统</b>正式发布,诚迈科技与华为一起共建<b class='flag-5'>鸿蒙</b>新世界

    华为鸿蒙系统正式发布,华鼎冷链科技携手共筑国产OS生态

    华为鸿蒙系统刷屏了!10月22日, 华为正式发布原生鸿蒙操作系统HarmonyOS NEXT,成为与苹果iOS系统和谷歌安卓
    的头像 发表于 10-25 11:43 213次阅读
    华为<b class='flag-5'>鸿蒙</b><b class='flag-5'>系统</b>正式发布,华鼎冷链科技携手共筑国产OS生态

    华为原生鸿蒙操作系统正式发布

    10月22日晚,华为举行了一场盛大的发布会,正式推出了其原生鸿蒙操作系统HarmonyOS NEXT,也被称为鸿蒙5.0。这一发布标志着鸿蒙系统
    的头像 发表于 10-23 16:52 386次阅读

    鸿蒙系统三防平板怎么样

    鸿蒙系统三防平板是一款功能强大、性能卓越的平板电脑,其独特的三防设计使其成为各种恶劣环境下的理想选择。无论是户外探险、工地作业还是军事应用,鸿蒙系统三防平板都能为用户提供稳定、可靠的性
    发表于 04-12 14:26

    纯血鸿蒙系统,拿什么与安卓、iOS比?

    鸿蒙系统的出现就是来打破这种僵局的,华为鸿蒙是以生态系统为基本而产生的独立系统。如果与Android、iOS
    发表于 02-21 21:04

    鸿蒙系统优缺点,能否作为开发者选择

    凡是都有对立面,就直接说说鸿蒙的优缺点吧。 鸿蒙的缺点: 鸿蒙是从2019年开始做出来的,那时候是套壳Android大家都知晓。从而导致大家不看鸿蒙
    发表于 02-16 21:00

    华为鸿蒙系统怎么样 华为鸿蒙系统和安卓系统的区别

    华为鸿蒙系统是华为公司自主研发的全场景分布式操作系统,于2019年8月首次发布。鸿蒙系统不同于传统的操作
    的头像 发表于 02-02 14:54 1609次阅读

    emui10怎么升级鸿蒙系统

    鸿蒙系统是华为开发的新一代操作系统,而EMUI 10则是基于Android的用户界面。目前,华为尚未公开说明如何在EMUI 10设备上升级到鸿蒙系统
    的头像 发表于 02-02 11:31 2264次阅读

    如何在鸿蒙系统上安装Google Play

    随着鸿蒙(HarmonyOS)系统的逐渐普及和用户基数的增加,一些用户希望能在鸿蒙系统上使用Google Play商店以获取更多应用。然而,由于鸿蒙
    的头像 发表于 01-31 17:13 1.5w次阅读

    多家头部企业宣布「启动鸿蒙原生应用开发」,你看好鸿蒙系统走向「独立」吗?

    鸿蒙生态迎「关键一战」,多家头部企业宣布「启动鸿蒙原生应用开发」,你看好鸿蒙系统走向「独立」吗?
    的头像 发表于 01-24 11:47 526次阅读
    多家头部企业宣布「启动<b class='flag-5'>鸿蒙</b>原生应用开发」,你看好<b class='flag-5'>鸿蒙</b><b class='flag-5'>系统</b>走向「独立」吗?

    鸿蒙系统和安卓的区别 鸿蒙系统有什么特别之处

    鸿蒙系统是华为公司自主研发的一款全新操作系统,旨在替代安卓系统鸿蒙系统与安卓
    的头像 发表于 01-18 11:45 1.1w次阅读

    鸿蒙系统支持哪些手机型号

    鸿蒙系统是由华为公司自主研发的操作系统,旨在为智能手机和其他智能设备提供更好的性能和用户体验。虽然目前鸿蒙系统并未在所有手机型号上提供支持,
    的头像 发表于 01-12 17:39 1.8w次阅读

    鸿蒙系统和安卓的区别哪个好用

    鸿蒙系统和安卓系统是目前市场上两个比较流行的手机操作系统,它们在很多方面都有所不同。本文将从多个方面比较鸿蒙
    的头像 发表于 01-11 11:15 1857次阅读

    鸿蒙原生应用/元服务开发-利用picker选择器来多选相册图片

    前言 在之前的时候,测试一个应用进入相册选择图片demo,利用了startAbilityForResult()方法,启动相对应的Ability来完成效果,但是这种方法有限制,一次只能获取一张图片,在
    发表于 12-01 17:04