前幾天有朋友問我如何通過 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文章
34417瀏覽量
251538 -
操作系統
+關注
關注
37文章
6808瀏覽量
123291 -
鴻蒙系統
+關注
關注
183文章
2634瀏覽量
66309 -
HarmonyOS
+關注
關注
79文章
1974瀏覽量
30149
原文標題:如何獲取鴻蒙系統相冊圖片?
文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論