背景
本文主要在Fanbook
原有图片选择器插件的基础上,新增鸿蒙系统支持,实现了针对鸿蒙系统特定图片视频选器,里面包含了图片压缩、图片基础信息获取、视频压缩、获取视频基本信息、取视频封面等操作。当然,在实现这块需求的过程中,遇到了不少的问题和解决方案,我挑选了几条核心功能点来和大家分享,相信看完之后,对于鸿蒙系统的图片选择器实现有一定的帮助。阅读本文需要有一个定Flutter
插件开发基础和鸿蒙ArkTS
开发基础。
核心问题点
鸿蒙系统应用权限
应用权限,就是应用向系统申请的底层SDK使用权限,比如通知、相册、定位等。鸿蒙系统的权限按照对应用开放规则,可以分简单分为对所有应用开放权限和受限开放权限。
大多数鸿蒙APP
的应用等级都是普通,所以受限开放权限基本上无法使用。举个例子说明下。
比如想保存图片到相册,需要ohos.permission.WRITE_IMAGEVIDEO
这个受限权限,这个权限正常情况下比较难申请到,所以如果鸿蒙APP
有保存图片到相册的需求,可以使用鸿蒙的提供的SaveButton控件,用这个安全控件来保存。
再比如使用phAccessHelper.getAssets
类获取相册中图片需要ohos.permission.READ_IMAGEVIDEO
这个权限,这个权限也是受限权限。所以如果想在鸿蒙APP
实现自定义图片选择器界面基本上没戏,得使用鸿蒙提供的PhotoViewPicker来获取相册中图片或视频的uri
。
特别说明一下,如果向华为那边申请到了受限权限,添加到requestPermissions
中之后,还需要重新签名。
对所有应用开放的权限这个没什么好说的,就是所有应用都可以申请的权限。
按照是否需要用户授权分为,可分为system_grant
和user_grant
两类。
其中system_grant
是系统权限类型,比如ohos.permission.INTERNET
,只需要项目的在module.json5
中申请,应用就可以正常访问网络,不会弹框让用户再次授权。
user_grant
指的是用户授权类型,在该类型的权限需要再用户确认许可下,APP才可以使用.这个类似我们iOS和安卓一样,比如获取ohos.permission.LOCATION
地理位置权限,首次会弹出一个授权确认框。
// module.json5
"requestPermissions": [
{
"name" : "ohos.permission.INTERNET",
"reason": "$string:EntryAbility_desc",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "inuse"
}
},
{
"name" : "ohos.permission.LOCATION",
"reason": "$string:EntryAbility_desc",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "inuse"
}
}
]
调用系统图片视频选择器
前文说了鸿蒙系统的权限知识点,再来实现基于鸿蒙系统的图片选择器,我们就知道不能按照以前iOS和安卓那样,自己定义图片选择和浏览界面了。
其实这样也好,对于开发者来说少了不少事情,因为系统会对相册中的超大图片进行优化,避免图片选择器最常见的内存溢出闪退。但是如果想需要定制化,比如用户不能选择超过500M的视频、超长图片,这就无法前置做了,只能在用户选择结束之后才能做。
放两张使用PhotoViewPicker拉起图片选择,可以感受下,其实鸿蒙系统提供的选择器已经很完善了,可以满足大多数需求。
调用系统图片选择器,还是比较简单,首先需要import这个库
import { photoAccessHelper } from '@kit.MediaLibraryKit';
创建photoAccessHelper.PhotoSelectOptions()
实例photoSelectOptions
,可以自定义一些属性。
isOriginalSupported
:表示是否显示原图选项
maxSelectNumber
:最多选择多少张资源
MIMEType
: 表示选择的资源类型,可以是纯图,纯视频,或者全部。
<