前幾天有朋友問我如何通過 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
-
華為
+關注
關注
216文章
35036瀏覽量
255104 -
操作系統
+關注
關注
37文章
7095瀏覽量
124969 -
鴻蒙系統
+關注
關注
183文章
2639瀏覽量
67721 -
HarmonyOS
+關注
關注
79文章
2053瀏覽量
32161
原文標題:如何獲取鴻蒙系統相冊圖片?
文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
國產操作系統加速崛起——鴻蒙電腦補齊鴻蒙生態最重要拼圖
鴻蒙操作系統首登電腦端,華為開啟鴻蒙辦公新時代

“RdbStore”上線開源鴻蒙社區 助力鴻蒙應用數據訪問效率大幅提升
【「鴻蒙操作系統設計原理與架構」閱讀體驗】01-初始華為鴻蒙
華為新品出廠默認搭載原生鴻蒙系統


名單公布!【書籍評測活動NO.53】鴻蒙操作系統設計原理與架構
鴻蒙系統專用版微信內測即將啟動
原生鴻蒙操作系統正式發布,誠邁科技與華為一起共建鴻蒙新世界

華為原生鴻蒙操作系統正式發布
瑞芯微RK3568鴻蒙開發板OpenHarmony系統修改cfg文件權限方法

鴻蒙開發Ability Kit程序框架服務:訪問控制概述 程序訪問控制

評論