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

描述

前几天有朋友问我如何通过 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

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分