前几天有朋友问我如何通过 AVStorage 来获取鸿蒙系统相册的图片,这个操作在我们平时开发时也经常用到,今天就分享一下鸿蒙系统访问系统相册的方法。
鸿蒙的 AVStorage 对应的是 Android 中的 MediaStore,都是用于操作系统媒体数据库的类。
但是现在开放的功能不如 MediaStore 强大,很多操作需要用的字段还找不到。
这里我先通过一段安卓程序往系统相册目录中写入三张图片,并插入媒体数据库:
//将文件保存到公共的媒体文件夹//这里的filename单纯的指文件名,不包含路径@RequiresApi(Build.VERSION_CODES.Q)fun saveImage(fileName: String, bitmap: Bitmap) {
try {
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
-
华为
+关注
关注
216文章
34433浏览量
251692 -
操作系统
+关注
关注
37文章
6818浏览量
123325 -
鸿蒙系统
+关注
关注
183文章
2634浏览量
66336 -
HarmonyOS
+关注
关注
79文章
1974浏览量
30173
原文标题:如何获取鸿蒙系统相册图片?
文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论