Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
e558cc18
D
Docs
项目概览
OpenHarmony
/
Docs
大约 1 年 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e558cc18
编写于
10月 11, 2022
作者:
Z
zengyawen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update docs
Signed-off-by:
N
zengyawen
<
zengyawen1@huawei.com
>
上级
e02e31f9
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
1002 addition
and
0 deletion
+1002
-0
zh-cn/application-dev/Readme-CN.md
zh-cn/application-dev/Readme-CN.md
+1
-0
zh-cn/application-dev/file-management/Readme-CN.md
zh-cn/application-dev/file-management/Readme-CN.md
+6
-0
zh-cn/application-dev/file-management/medialibrary-album-guidelines.md
...tion-dev/file-management/medialibrary-album-guidelines.md
+146
-0
zh-cn/application-dev/file-management/medialibrary-filepath-guidelines.md
...n-dev/file-management/medialibrary-filepath-guidelines.md
+244
-0
zh-cn/application-dev/file-management/medialibrary-overview.md
.../application-dev/file-management/medialibrary-overview.md
+126
-0
zh-cn/application-dev/file-management/medialibrary-resource-guidelines.md
...n-dev/file-management/medialibrary-resource-guidelines.md
+479
-0
未找到文件。
zh-cn/application-dev/Readme-CN.md
浏览文件 @
e558cc18
...
...
@@ -26,6 +26,7 @@
-
[
安全
](
security/Readme-CN.md
)
-
[
网络与连接
](
connectivity/Readme-CN.md
)
-
[
数据管理
](
database/Readme-CN.md
)
-
[
文件管理
](
file-management/Readme-CN.md
)
-
[
电话服务
](
telephony/Readme-CN.md
)
-
[
任务管理
](
task-management/Readme-CN.md
)
-
[
设备管理
](
device/Readme-CN.md
)
...
...
zh-cn/application-dev/file-management/Readme-CN.md
0 → 100644
浏览文件 @
e558cc18
# 文件管理
-
媒体库管理
-
[
媒体库开发概述
](
medialibrary-overview.md
)
-
[
媒体资源使用指导
](
medialibrary-resource-guidelines.md
)
-
[
文件路径使用指导
](
medialibrary-filepath-guidelines.md
)
-
[
相册资源使用指导
](
medialibrary-album-guidelines.md
)
\ No newline at end of file
zh-cn/application-dev/file-management/medialibrary-album-guidelines.md
0 → 100644
浏览文件 @
e558cc18
# 相册资源使用指导
mediaLibrary提供相册相关的接口,供开发者创建、删除相册,获取相册中的图片资源等。
> **说明:**
>
> 在进行功能开发前,请开发者查阅[媒体库开发概述](medialibrary-overview.md),了解如何获取媒体库实例和如何申请媒体库功能开发相关权限。
为了保证应用的运行效率,大部分MediaLibrary调用都是异步的,对于异步调用的API均提供了callback和Promise两种方式,以下示例均采用Promise函数,更多方式可以查阅
[
API参考
](
../reference/apis/js-apis-medialibrary.md
)
。
## 获取相册中的图片/视频
获取相册中的图片、视频有两种方式:
一是通过
[
MediaLibrary.getFileAssets
](
../reference/apis/js-apis-medialibrary.md#getfileassets7-1
)
指定相册以获取媒体资源,参考
[
获取指定相册的媒体资源
](
medialibrary-resource-guidelines#指定相册
)
;
二是通过
[
Album.getFileAssets
](
../reference/apis/js-apis-medialibrary.md#getfileassets7-3
)
使用相册Album实例获取媒体资源,参考
[
获取相册中的图片或视频
](
medialibrary-resource-guidelines#获取相册中的图片或视频
)
。
## 创建相册
通过
[
MediaLibrary.createAsset
](
../reference/apis/js-apis-medialibrary.md#createasset8-1
)
可以创建媒体资源,可以通过创建图片或视频文件时设置的相对路径,创建出相册,相对路径的命名即为相册名称。
**前提条件**
-
获取媒体库mediaLibrary实例。
-
申请媒体库读写权限“ohos.permission.WRITE_MEDIA”。
下面以创建相册myAlbum为例。
**开发步骤**
1.
调用getPublicDirectory获取文件公共路径。
获取文件公共路径的更多指导可参考
[
获取文件保存的公共目录
](
medialibrary-filepath-guidelines.md#获取文件保存的公共目录
)
。
2.
调用createAsset新建图片,并设置相对路径为path+'myAlbum/'。
即在创建相册的同时,往里面放了一张图片。
```
ts
async
function
example
()
{
let
mediaType
=
mediaLibrary
.
MediaType
.
IMAGE
;
let
DIR_IMAGE
=
mediaLibrary
.
DirectoryType
.
DIR_IMAGE
;
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
const
path
=
await
media
.
getPublicDirectory
(
DIR_IMAGE
)
//myAlbum为新建文件保存路径,也是新建相册的名称
media
.
createAsset
(
mediaType
,
'
test.jpg
'
,
path
+
'
myAlbum/
'
,
(
err
,
fileAsset
)
=>
{
if
(
fileAsset
!=
undefined
)
{
console
.
info
(
'
createAlbum successfully, message =
'
+
fileAsset
);
}
else
{
console
.
info
(
'
createAlbum failed, message =
'
+
err
);
}
});
}
```
## 删除相册
当删除相册的所有媒体资源时,相册自动删除,通过
[
FileAsset.deleteAsset
](
../reference/apis/js-apis-medialibrary.md#deleteasset8-1
)
可以删除媒体资源。
> **说明:**<br/>
>
> deleteAsset为系统接口,仅限系统应用使用。
**前提条件**
-
获取媒体库mediaLibrary实例。
-
申请媒体库读写权限“ohos.permission.WRITE_MEDIA”。
**开发步骤**
1.
建立检索条件,用于获取目标相册。
2.
调用getAlbums获取相册列表。
3.
建立检索条件,用于获取相册下的目标图片资源。
4.
调用getFileAssets获取目标图片资源。
5.
调用getAllObject获取相册下的全部图片。
6.
调用deleteAsset删除全部图片。
```
ts
async
function
example
()
{
let
AlbumNoArgsfetchOp
=
{
selections
:
''
,
selectionArgs
:
[],
};
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
let
albumList
=
await
media
.
getAlbums
(
AlbumNoArgsfetchOp
);
let
album
=
albumList
[
0
];
if
(
album
!=
undefined
)
{
let
fetchOpt
=
{
selections
:
mediaLibrary
.
FileKey
.
MEDIA_TYPE
+
'
= ?
'
,
selectionArgs
:
[
mediaLibrary
.
MediaType
.
IMAGE
.
toString
()],
};
let
fetchFileResult
=
await
album
.
getFileAssets
(
fetchOpt
);
fetchFileResult
.
getAllObject
().
then
(
function
(
fileAssetList
){
for
(
let
i
=
0
;
i
<
fileAssetList
.
length
;
++
i
)
{
media
.
deleteAsset
(
fileAssetList
[
i
].
uri
).
then
(
function
()
{
console
.
info
(
"
removeAlbum successfully
"
);
}).
catch
(
function
(
err
){
console
.
info
(
"
removeAlbum failed with error:
"
+
err
);
});
}
})
}
}
```
## 重命名相册
重命名修改的是相册的FileAsset.albumName属性,即相册名称。修改后再通过
[
Album.commitModify
](
../reference/apis/js-apis-medialibrary.md#commitmodify8-3
)
更新到数据库中。
**前提条件**
-
获取媒体库mediaLibrary实例。
-
申请媒体库读写权限“ohos.permission.WRITE_MEDIA”。
下面以重命名相册为“newAlbum“为例。
**开发步骤**
1.
建立检索条件,用于获取目标相册。
2.
调用getAlbums获取相册列表。
3.
将相册重命名为“newAlbum“。
4.
调用Album.commitModify将更新的相册属性修改到数据库中。
```
ts
async
function
example
()
{
let
AlbumNoArgsfetchOp
=
{
selections
:
''
,
selectionArgs
:
[],
};
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
let
albumList
=
await
media
.
getAlbums
(
AlbumNoArgsfetchOp
);
let
album
=
albumList
[
0
];
album
.
albumName
=
'
newAlbum
'
;
//回调返回空
album
.
commitModify
().
then
(
function
()
{
console
.
info
(
"
albumRename successfully
"
);
}).
catch
(
function
(
err
){
console
.
info
(
"
albumRename failed with error:
"
+
err
);
});
}
```
zh-cn/application-dev/file-management/medialibrary-filepath-guidelines.md
0 → 100644
浏览文件 @
e558cc18
# 文件路径使用指导
Openharmony上用户数据统一由媒体库进行管理,用户数据用户数据可以通过mediaLibrary提供的接口能力进行访问和操作。
> **说明:**
>
> 在进行功能开发前,请开发者查阅[媒体库开发概述](medialibrary-overview.md),了解如何获取媒体库实例和如何申请媒体库功能开发相关权限。
为了保证应用的运行效率,大部分MediaLibrary调用都是异步的,对于异步调用的API均提供了callback和Promise两种方式,以下示例均采用Promise函数,更多方式可以查阅
[
API参考
](
../reference/apis/js-apis-medialibrary.md
)
。
## 公共目录路径支持的文件格式
在使用文件路径进行开发之前,需要了解各公共目录路径支持的文件格式说明。
> **注意:** <br/>
> 下表仅表示系统能识别的文件类型,在具体的开发中,开发者需要关注对应接口支持的文件格式。<br/> 如image编码功能只支持.jpeg和.webp,解码功能只支持.jpg .png .gif .bmp .webp RAW。
| 目录路径 | 目录类型 | 媒体类型 | 说明 | 支持的文件格式 |
| ---------- | ------------- | ------------- | -------------- | ------------------------------------------------------------ |
| Camera/ | DIR_CAMERA | VIDEO amd IMAGE | 相机拍摄图片与录像的存放路径,目录与子目录下可以存放视频,图片类型文件。 | .bmp / .bm / .gif / .jpg /. jpeg / .jpe / .png / .webp / .raw / .svg / .heif / .mp4 / .3gp / .mpg / .mov / .webm / .mkv |
| Videos/ | DIR_VIDEO | VIDEO | 视频专有目录,目录与子目录下只可以存放视频类型文件。| .mp4 / .3gp / .mpg / .mov / .webm / .mkv |
| Pictures/ | DIR_IMAGE | IMAGE | 图片专有目录,目录与子目录下只可以存放图片类型文件。 | .bmp / .bm / .gif / .jpg /. jpeg / .jpe / .png / .webp / .raw / .svg / .heif |
| Audios/ | DIR_AUDIO | AUDIO |音频专有目录,目录与子目录下只可以存放音频类型文件。| .aac/.mp3/.flac/.wav/.ogg |
| Documents/ | DIR_DOCUMENTS | FILE |文档类型目录,目录与子目录下只可以存放音频,图片,视频以外类型文件。| - |
| Download/ | DIR_DOWNLOAD | ALLTYPE |下载文件存放目录,目录与子目录下文件类型不受限制。| - |
## 获取文件保存的公共目录
不同类型的文件会保存到不同的公共目录下,可以通过接口
[
getPublicDirectory
](
../reference/apis/js-apis-medialibrary.md#getpublicdirectory8-1
)
来获取公共目录路径。
**前提条件**
-
获取媒体库mediaLibrary实例。
-
申请媒体库读权限“ohos.permission.READ_MEDIA。
下面以获取Camera文件保存的公共目录为例。
```
ts
async
function
example
(){
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
let
DIR_CAMERA
=
mediaLibrary
.
DirectoryType
.
DIR_CAMERA
;
const
dicResult
=
await
media
.
getPublicDirectory
(
DIR_CAMERA
);
if
(
dicResult
==
'
Camera/
'
)
{
console
.
info
(
'
mediaLibraryTest : getPublicDirectory passed
'
);
}
else
{
console
.
info
(
'
mediaLibraryTest : getPublicDirectory failed
'
);
}
}
```
## 沙箱与公共路径间文件的复制
OpenHarmony提供应用沙箱机制,增加目录可见性数据访问防线,减少了应用数据和用户隐私信息泄露,建立了更加严格安全的应用沙盒隔离能力。
放在公共路径下的文件,用户可以通过系统应用“文件管理”、“图库”访问,但应用沙箱内的文件,只有应用本身可以访问。
### 复制文件
通过接口
[
mediaLibrary.FileAsset.open
](
../reference/apis/js-apis-medialibrary.md#open8-1
)
可以打开公共路径文件。
通过接口
[
fileio.open
](
../reference/apis/js-apis-fileio.md#fileioopen7
)
可以打开沙箱路径文件,沙箱路径必须通过应用上下文context进行访问。
**前提条件**
-
获取媒体库mediaLibrary实例。
-
申请媒体库读写权限“ohos.permission.WRITE_MEDIA。
-
除了@ohos.multimedia.mediaLibrary外,还需要导入模块
[
@ohos.fileio
](
../reference/apis/js-apis-fileio.md
)
。
**开发步骤**
1.
调用
[
context.filesDir
](
../reference/apis/js-apis-Context.md#contextgetfilesdir
)
获取应用沙箱路径。
2.
调用MediaLibrary.getFileAssets和FetchFileResult.getFirstObject获取公共目录中的FileAsset实例。
3.
调用fileio.open打开沙箱路径文件。
4.
调用fileAsset.open打开公共路径文件。
5.
调用fileio.copyfile复制文件。
6.
调用fileAsset.close和fileio.close关闭文件。
**示例1 将公共路径文件复制到沙箱路径下**
```
ts
async
function
copyPublic2Sandbox
()
{
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
let
sandboxDirPath
=
globalThis
.
context
.
filesDir
;
let
fileKeyObj
=
mediaLibrary
.
FileKey
let
fileAssetFetchOp
=
{
selections
:
fileKeyObj
.
DISPLAY_NAME
+
'
= ?
'
,
selectionArgs
:
[
'
testFile.txt
'
],
};
let
fetchResult
=
await
media
.
getFileAssets
(
fileAssetFetchOp
);
let
fileAsset
=
await
fetchResult
.
getFirstObject
();
let
fdPub
=
await
fileAsset
.
open
(
'
rw
'
);
let
fdSand
=
await
fileio
.
open
(
sandboxDirPath
+
'
/testFile.txt
'
,
0o2
|
0o100
,
0o666
);
await
fileio
.
copyFile
(
fdPub
,
fdSand
);
await
fileAsset
.
close
(
fdPub
);
await
fileio
.
close
(
fdSand
);
let
content_sand
=
await
fileio
.
readText
(
sandboxDirPath
+
'
/testFile.txt
'
);
console
.
log
(
'
content read from sandbox file:
'
,
content_sand
)
}
```
**示例2 将应用沙箱路径文件复制到公共路径**
```
ts
async
function
copySandbox2Public
()
{
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
let
sandboxDirPath
=
globalThis
.
context
.
filesDir
;
let
DIR_DOCUMENTS
=
mediaLibrary
.
DirectoryType
.
DIR_DOCUMENTS
;
const
publicDirPath
=
await
media
.
getPublicDirectory
(
DIR_DOCUMENTS
);
try
{
let
fileAsset
=
await
media
.
createAsset
(
mediaLibrary
.
MediaType
.
FILE
,
'
testFile02.txt
'
,
publicDirPath
);
console
.
info
(
'
createFile successfully, message =
'
+
fileAsset
);
}
catch
(
err
)
{
console
.
info
(
'
createFile failed, message =
'
+
err
);
}
try
{
let
fileKeyObj
=
mediaLibrary
.
FileKey
let
fileAssetFetchOp
=
{
selections
:
fileKeyObj
.
DISPLAY_NAME
+
'
= ?
'
,
selectionArgs
:
[
'
testFile02.txt
'
],
};
let
fetchResult
=
await
media
.
getFileAssets
(
fileAssetFetchOp
);
var
fileAsset
=
await
fetchResult
.
getFirstObject
();
}
catch
(
err
)
{
console
.
info
(
'
file asset get failed, message =
'
,
err
)
}
var
fdPub
=
await
fileAsset
.
open
(
'
rw
'
);
var
fdSand
=
await
fileio
.
open
(
sandboxDirPath
+
'
testFile.txt
'
,
0o2
);
await
fileio
.
copyFile
(
fdSand
,
fdPub
);
await
fileio
.
close
(
fdPub
);
await
fileio
.
close
(
fdSand
);
let
fdPubRead
=
await
fileAsset
.
open
(
'
rw
'
);
try
{
var
arrayBuffer
=
new
ArrayBuffer
(
4096
);
await
fileio
.
read
(
fdPubRead
,
arrayBuffer
);
var
content_pub
=
String
.
fromCharCode
(...
new
Uint8Array
(
arrayBuffer
));
fileAsset
.
close
(
fdPubRead
);
}
catch
(
err
)
{
console
.
log
(
'
read text failed, message =
'
,
err
);
}
console
.
log
(
'
content read from public file:
'
,
content_pub
);
}
```
### 读写文件内容
通过
[
mediaLibrary
](
../reference/apis/js-apis-medialibrary.md
)
的接口FileAsset.open和FileAsset.close可以打开和关闭文件。通过
[
fileio
](
../reference/apis/js-apis-fileio.md
)
的接口fileio.read和fileio.write可以读写文件。
**前提条件**
-
获取媒体库mediaLibrary实例。
-
申请媒体库读写权限“ohos.permission.WRITE_MEDIA。
-
除了@ohos.multimedia.mediaLibrary外,还需要导入模块
[
@ohos.fileio
](
../reference/apis/js-apis-fileio.md
)
。
**开发步骤**
1.
创建用于读写示例的文件。
```
ts
async
function
example
()
{
let
mediaType
=
mediaLibrary
.
MediaType
.
FILE
;
let
DIR_DOCUMENTS
=
mediaLibrary
.
DirectoryType
.
DIR_DOCUMENTS
;
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
const
path
=
await
media
.
getPublicDirectory
(
DIR_DOCUMENTS
);
media
.
createAsset
(
mediaType
,
"
testFile.text
"
,
path
).
then
(
function
(
asset
)
{
console
.
info
(
"
createAsset successfully:
"
+
JSON
.
stringify
(
asset
));
}).
catch
(
function
(
err
){
console
.
info
(
"
createAsset failed with error:
"
+
err
);
});
}
```
2.
使用open打开文件。
3.
使用fileio.write写入文件,以string形式传入写入数据。
4.
使用fileio.read读取文件,以 ArrayBuffer 形式保存读取结果。
5.
将ArrayBuffer转化为string,以string形式得到文件内容。
6.
使用close关闭文件。
**示例1 打开现有文件、向文件中写入**
```
ts
async
function
writeOnlyPromise
()
{
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
let
fileKeyObj
=
mediaLibrary
.
FileKey
let
fileAssetFetchOp
=
{
selections
:
fileKeyObj
.
DISPLAY_NAME
+
'
= ?
'
,
selectionArgs
:
[
'
testFile.txt
'
],
};
let
fetchResult
=
await
media
.
getFileAssets
(
fileAssetFetchOp
);
let
fileAsset
=
await
fetchResult
.
getFirstObject
();
console
.
info
(
'
fileAssetName:
'
,
fileAsset
.
displayName
);
try
{
let
fd
=
await
fileAsset
.
open
(
'
w
'
);
console
.
info
(
'
file descriptor:
'
,
fd
);
await
fileio
.
write
(
fd
,
"
Write file test content.
"
);
await
fileAsset
.
close
(
fd
);
}
catch
(
err
)
{
console
.
info
(
'
write file failed, message =
'
,
err
);
}
}
```
**示例2 打开现有文件,读取文件内容**
```
ts
async
function
readOnlyPromise
()
{
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
let
fileKeyObj
=
mediaLibrary
.
FileKey
let
fileAssetFetchOp
=
{
selections
:
fileKeyObj
.
DISPLAY_NAME
+
'
= ?
'
,
selectionArgs
:
[
'
testFile.txt
'
],
};
let
fetchResult
=
await
media
.
getFileAssets
(
fileAssetFetchOp
);
let
fileAsset
=
await
fetchResult
.
getFirstObject
();
console
.
info
(
'
fileAssetName:
'
,
fileAsset
.
displayName
);
try
{
let
fd
=
await
fileAsset
.
open
(
'
r
'
);
let
arrayBuffer
=
new
ArrayBuffer
(
4096
);
await
fileio
.
read
(
fd
,
arrayBuffer
);
let
fileContent
=
String
.
fromCharCode
(...
new
Uint8Array
(
arrayBuffer
));
globalThis
.
fileContent
=
fileContent
globalThis
.
fileName
=
fileAsset
.
displayName
;
console
.
info
(
'
file content:
'
,
fileContent
);
await
fileAsset
.
close
(
fd
);
}
catch
(
err
)
{
console
.
info
(
'
read file failed, message =
'
,
err
);
}
}
```
zh-cn/application-dev/file-management/medialibrary-overview.md
0 → 100644
浏览文件 @
e558cc18
# 媒体库开发概述
MediaLibrary提供媒体库相关能力,帮助开发者更方便地访问和修改媒体文件,具体分为:
-
[
媒体资源(音频、视频、图片文件等)相关
](
medialibrary-resource-guidelines.md
)
,包括:
-
查询指定媒体资源
-
获取图片/视频
-
获取图片/视频缩略图
-
创建、删除媒体资源
-
重命名媒体资源
-
将媒体资源放入回收站
-
[
文件路径相关
](
medialibrary-filepath-guidelines.md
)
,包括:
-
获取文件保存的公共目录
-
沙箱与公共路径间文件的复制
-
读写文件内容
-
[
相册相关
](
medialibrary-album-guidelines.md
)
,包括:
-
获取相册中的图片/视频
-
创建、删除相册
-
重命名相册
> **说明:**<br/>
> 本开发指导基于API Version 9,仅适用于Stage模型。
应用需要先获取媒体库实例,才能访问和修改用户等个人媒体数据信息。媒体库涉及用户个人数据信息,所以应用需要向用户申请媒体库读写操作权限才能保证功能的正常运行。
开发者在使用MediaLibrary进行功能开发前,请先掌握以下内容:
-
[
媒体库开发概述
](
#媒体库开发概述
)
-
[
获取媒体库实例
](
#获取媒体库实例
)
-
[
申请媒体库功能相关权限
](
#申请媒体库功能相关权限
)
## 获取媒体库实例
应用需要使用应用上下文Context通过接口
[
getMediaLibrary
](
../reference/apis/js-apis-medialibrary.md#medialibrarygetmedialibrary8
)
,获取媒体库实例,用于访问和修改用户等个人媒体数据信息(如音频、视频、图片、文档等)。
**开发步骤**
1.
导入mediaLibrary模块以使用媒体库相关接口。
2.
通过getContext获取应用上下文。
3.
获取媒体库实例。
```
ts
import
mediaLibrary
from
'
@ohos.multimedia.mediaLibrary
'
;
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
```
## 申请媒体库功能相关权限
媒体库的读写操作需要相应权限,在申请权限前,请保证符合
[
权限使用的基本原则
](
../security/accesstoken-overview.md#权限使用的基本原则
)
。涉及的权限如下表。
| 权限名 | 说明 | 授权方式 |
| ------------------------------ | ------------------------------------------ | ---------- |
| ohos.permission.READ_MEDIA | 允许应用读取用户外部存储中的媒体文件信息。 | user_grant |
| ohos.permission.WRITE_MEDIA | 允许应用读写用户外部存储中的媒体文件信息。 | user_grant |
| ohos.permission.MEDIA_LOCATION | 允许应用访问用户媒体文件中的地理位置信息。 | user_grant |
以上权限的授权方式均为user_grant(用户授权),即开发者在module.json5文件中配置对应的权限后,需要使用接口
[
Context.requestPermissionsFromUser
](
../reference/apis/js-apis-ability-context.md#abilitycontextrequestpermissionsfromuser
)
去校验当前用户是否已授权。如果是,应用可以直接访问/操作目标对象;否则需要弹框向用户申请授权。
> **说明:**<br/>即使用户曾经授予权限,应用在调用受此权限保护的接口前,也应该先检查是否有权限。不能把之前授予的状态持久化,因为用户在动态授予后还可以通过“设置”取消应用的权限。
**开发步骤**
1.
在配置文件module.json5中声明权限。在配置文件的“module”标签内,增加“requestPermissions”标签,标签内容请根据实际情况填写。标签说明可参考
[
访问控制(权限)开发指导
](
../security/accesstoken-guidelines.md
)
。
```
json
{
"module"
:
{
"requestPermissions"
:
[
{
"name"
:
"ohos.permission.MEDIA_LOCATION"
,
"reason"
:
"$string:reason"
,
"usedScene"
:
{
"abilities"
:
[
"MainAbility"
],
"when"
:
"always"
}
},
{
"name"
:
"ohos.permission.READ_MEDIA"
,
"reason"
:
"$string:reason"
,
"usedScene"
:
{
"abilities"
:
[
"MainAbility"
],
"when"
:
"always"
}
},
{
"name"
:
"ohos.permission.WRITE_MEDIA"
,
"reason"
:
"$string:reason"
,
"usedScene"
:
{
"abilities"
:
[
"MainAbility"
],
"when"
:
"always"
}
}
]
}
}
```
2.
调用requestPermissionsFromUser进行权限校验,可以选择需要动态申请获取的权限。
```
ts
import
Ability
from
'
@ohos.application.Ability
'
export
default
class
MainAbility
extends
Ability
{
onWindowStageCreate
(
windowStage
)
{
var
permissions
=
[
'
ohos.permission.READ_MEDIA
'
,
'
ohos.permission.WRITE_MEDIA
'
]
var
permissionRequestResult
;
this
.
context
.
requestPermissionsFromUser
(
permissions
,(
err
,
result
)
=>
{
if
(
err
){
console
.
log
(
'
requestPermissionsFromUserError:
'
+
JSON
.
stringify
(
err
));
}
else
{
permissionRequestResult
=
result
;
console
.
log
(
'
permissionRequestResult:
'
+
JSON
.
stringify
(
permissionRequestResult
));
}
});
}
}
```
\ No newline at end of file
zh-cn/application-dev/file-management/medialibrary-resource-guidelines.md
0 → 100644
浏览文件 @
e558cc18
# 媒体资源使用指导
应用可以通过mediaLibrary的接口,进行媒体资源(音频、视频、图片文件等)相关操作。
> **说明:**
>
> 在进行功能开发前,请开发者查阅[媒体库开发概述](medialibrary-overview.md),了解如何获取媒体库实例和如何申请媒体库功能开发相关权限。
为了保证应用的运行效率,大部分MediaLibrary调用都是异步的,对于异步调用的API均提供了callback和Promise两种方式,以下示例均采用Promise函数,更多方式可以查阅
[
API参考
](
../reference/apis/js-apis-medialibrary.md
)
。
## 获取媒体资源
开发者可以根据特定的条件查询媒体资源,如指定类型、指定日期、指定相册等。
应用通过调用
[
MediaLibrary.getFileAssets
](
../reference/apis/js-apis-medialibrary.md#getfileassets7-1
)
获取媒体资源,并传入MediaFetchOptions对象指定检索条件。MediaFetchOptions.selections为检索条件,使用FileKey中的枚举值作为检索条件的列名;MediaFetchOptions.selectionArgs对应selections中检索条件列的值;除此之外,可以使用order(结果排序方式)、uri(文件URI)、networkId(注册设备网络ID)作为检索条件。
如果只想获取某个位置的对象(如第一个、最后一个、指定索引等),可以通过
[
FetchFileResult
](
../reference/apis/js-apis-medialibrary.md#fetchfileresult7
)
中的接口获取对应位置的媒体资源对象。本小节均采用getNextObject循环获取检索结果中的所有媒体资源。
**前提条件**
-
获取媒体库mediaLibrary实例。
-
申请媒体库读权限“ohos.permission.READ_MEDIA”。
### 指定媒体类型
下面以查询图片类型的媒体资源为例。
**开发步骤**
selections: FileKey.MEDIA_TYPE,根据媒体类型检索。
selectionArgs: MediaType.IMAGE,媒体类型为图片。
```
ts
async
function
example
()
{
let
fileKeyObj
=
mediaLibrary
.
FileKey
let
fileType
=
mediaLibrary
.
MediaType
.
IMAGE
let
option
=
{
selections
:
fileKeyObj
.
MEDIA_TYPE
+
'
= ?
'
,
selectionArgs
:
[
fileType
.
toString
()],
};
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
const
fetchFileResult
=
await
media
.
getFileAssets
(
option
);
for
(
let
i
=
0
;
i
<
fetchFileResult
.
getCount
();
i
++
)
{
fetchFileResult
.
getNextObject
((
err
,
fileAsset
)
=>
{
if
(
err
)
{
console
.
error
(
'
Failed
'
);
return
;
}
console
.
log
(
'
fileAsset.displayName
'
+
i
+
'
:
'
+
fileAsset
.
displayName
);
})
}
}
```
### 指定日期
下面以查询指定添加日期的媒体资源为例。实际开发中可以设置添加日期、修改日期、拍摄日期。
selections: FileKey.DATE_ADDED,根据文件添加日期检索。
selectionArgs:2022-8-5,具体添加时间的字符串。
```
ts
async
function
example
()
{
let
fileKeyObj
=
mediaLibrary
.
FileKey
let
option
=
{
selections
:
fileKeyObj
.
DATE_ADDED
+
'
= ?
'
,
selectionArgs
:
[
'
2022-8-5
'
],
};
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
const
fetchFileResult
=
await
media
.
getFileAssets
(
option
);
for
(
let
i
=
0
;
i
<
fetchFileResult
.
getCount
();
i
++
)
{
fetchFileResult
.
getNextObject
((
err
,
fileAsset
)
=>
{
if
(
err
)
{
console
.
error
(
'
Failed
'
);
return
;
}
console
.
log
(
'
fileAsset.displayName
'
+
i
+
'
:
'
+
fileAsset
.
displayName
);
})
}
}
```
### 按指定顺序排列
下面以查询图片并按文件添加日期降序排列为例。实际开发中可以设置升序(AESC)和降序(DESC)。
order: FileKey.DATE_ADDED,根据文件添加日期排序;并设置排列顺序为DESC降序。
```
ts
async
function
example
()
{
let
fileKeyObj
=
mediaLibrary
.
FileKey
let
fileType
=
mediaLibrary
.
MediaType
.
IMAGE
let
option
=
{
selections
:
fileKeyObj
.
MEDIA_TYPE
+
'
= ?
'
,
selectionArgs
:
[
fileType
.
toString
()],
order
:
fileKeyObj
.
DATE_ADDED
+
"
DESC
"
,
};
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
const
fetchFileResult
=
await
media
.
getFileAssets
(
option
);
for
(
let
i
=
0
;
i
<
fetchFileResult
.
getCount
();
i
++
)
{
fetchFileResult
.
getNextObject
((
err
,
fileAsset
)
=>
{
if
(
err
)
{
console
.
error
(
'
Failed
'
);
return
;
}
console
.
log
(
'
fileAsset.displayName
'
+
i
+
'
:
'
+
fileAsset
.
displayName
);
})
}
}
```
### 指定相册
下面以指定相册myAlbum为例。
selections: FileKey.ALBUM_NAME,根据相册名称检索。
selectionArgs:'myAlbum',具体相册名称。
```
ts
async
function
example
()
{
let
fileKeyObj
=
mediaLibrary
.
FileKey
let
fileType
=
mediaLibrary
.
MediaType
.
IMAGE
let
option
=
{
selections
:
fileKeyObj
.
ALBUM_NAME
+
'
= ?
'
,
selectionArgs
:
[
'
myAlbum
'
],
};
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
const
fetchFileResult
=
await
media
.
getFileAssets
(
option
);
for
(
let
i
=
0
;
i
<
fetchFileResult
.
getCount
();
i
++
)
{
fetchFileResult
.
getNextObject
((
err
,
fileAsset
)
=>
{
if
(
err
)
{
console
.
error
(
'
Failed
'
);
return
;
}
console
.
log
(
'
fileAsset.displayName
'
+
i
+
'
:
'
+
fileAsset
.
displayName
);
})
}
}
```
## 获取相册中的图片或视频
获取相册的媒体资源有两种方式,一是通过
[
MediaLibrary.getFileAssets
](
../reference/apis/js-apis-medialibrary.md#getfileassets7-1
)
指定相册以获取媒体资源,参考
[
获取指定相册的媒体资源
](
#指定相册
)
;二是通过
[
Album.getFileAssets
](
../reference/apis/js-apis-medialibrary.md#getfileassets7-3
)
使用相册Album实例获取媒体资源。
**前提条件**
-
获取媒体库mediaLibrary实例。
-
申请媒体库读权限“ohos.permission.READ_MEDIA”。
**开发步骤**
下面以获取相册名称为“新建相册1”的视频为例。
1.
建立检索条件,用于获取目的相册实例。
```
ts
let
fileKeyObj
=
mediaLibrary
.
FileKey
;
let
AlbumNoArgsFetchOp
=
{
selections
:
fileKeyObj
.
ALBUM_NAME
+
'
= ?
'
,
selectionArgs
:
[
'
新建相册1
'
]
}
```
2.
建立检索条件,用于获取目的相册下的视频资源。
```
ts
let
fileKeyObj
=
mediaLibrary
.
FileKey
;
let
imageType
=
mediaLibrary
.
MediaType
.
VIDEO
;
let
imagesFetchOp
=
{
selections
:
fileKeyObj
.
MEDIA_TYPE
+
'
= ?
'
,
selectionArgs
:
[
imageType
.
toString
()],
}
```
3.
通过Album.getFileAssets获取对应的资源。
以下为
**完整示例**
。
```
ts
async
function
getCameraImagePromise
()
{
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
let
fileKeyObj
=
mediaLibrary
.
FileKey
;
let
imageType
=
mediaLibrary
.
MediaType
.
IMAGE
;
let
imagesFetchOp
=
{
selections
:
fileKeyObj
.
MEDIA_TYPE
+
'
= ?
'
,
selectionArgs
:
[
imageType
.
toString
()],
}
let
AlbumNoArgsFetchOp
=
{
selections
:
fileKeyObj
.
ALBUM_NAME
+
'
= ?
'
,
selectionArgs
:
[
'
新建相册1
'
]
}
let
albumList
=
await
media
.
getAlbums
(
AlbumNoArgsFetchOp
);
if
(
albumList
.
length
>
0
)
{
const
album
=
albumList
[
0
];
let
fetchFileResult
=
await
album
.
getFileAssets
(
imagesFetchOp
);
let
count
=
fetchFileResult
.
getCount
();
console
.
info
(
"
get mediaLibrary IMAGE number
"
,
count
);
}
else
{
console
.
info
(
'
getAlbum list is: 0
'
);
}
}
```
## 获取图片/视频缩略图
通过接口
[
FileAsset.getThumbnail
](
../reference/apis/js-apis-medialibrary.md#getthumbnail8-2
)
,传入缩略图尺寸,可以获取图片/视频缩略图。缩略图常用于UI界面展示。
**前提条件**
-
获取媒体库mediaLibrary实例。
-
申请媒体库读权限“ohos.permission.READ_MEDIA”。
### 获取某张图片的缩略图
当需要在相册展示图片/视频、编辑预览,应用需要获取某张图片的缩略图。
下面以获取相册第一张图片的缩略图为例,缩略图尺寸为720
*
720。
**开发步骤**
1.
建立检索条件,用于获取目的相册下的图片资源。
2.
调用getFileAssets获取目标图片资源。
3.
调用getFirstObject获取第一张图片。
4.
调用getThumbnail获取相册中图片的缩略图。
```
ts
async
function
getFirstThumbnailPromise
()
{
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
let
fileKeyObj
=
mediaLibrary
.
FileKey
;
let
imageType
=
mediaLibrary
.
MediaType
.
IMAGE
;
let
imagesFetchOp
=
{
selections
:
fileKeyObj
.
MEDIA_TYPE
+
'
= ?
'
,
selectionArgs
:
[
imageType
.
toString
()],
}
let
size
=
{
width
:
720
,
height
:
720
};
const
fetchFileResult
=
await
media
.
getFileAssets
(
imagesFetchOp
);
if
(
fetchFileResult
!=
undefined
)
{
const
asset
=
await
fetchFileResult
.
getFirstObject
();
asset
.
getThumbnail
(
size
).
then
((
pixelMap
)
=>
{
pixelMap
.
getImageInfo
().
then
((
info
)
=>
{
console
.
info
(
'
get Thumbnail info:
'
+
"
width:
"
+
info
.
size
.
width
+
"
height:
"
+
info
.
size
.
height
);
}).
catch
((
err
)
=>
{
console
.
info
(
"
getImageInfo failed with error:
"
+
err
);
});
}).
catch
((
err
)
=>
{
console
.
info
(
"
getImageInfo failed with error:
"
+
err
);
});
}
else
{
console
.
info
(
"
get image failed with error
"
);
}
}
```
### 获取相册中所有图片的缩略图
当应用需要提供某个相册里所有图片/视频供用户选择时,可以选择提供缩略图。
与获取单张缩略图的区别是,需要使用getAllObject获取图片/视频数组。
下面以获取720
*
720的图片缩略图为例。
```
ts
function
sleep
(
time
)
{
return
new
Promise
((
resolve
)
=>
setTimeout
(
resolve
,
time
));
}
async
function
getThumbnailNumberPromise
()
{
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
let
fileKeyObj
=
mediaLibrary
.
FileKey
;
let
imageType
=
mediaLibrary
.
MediaType
.
IMAGE
;
let
imagesFetchOp
=
{
selections
:
fileKeyObj
.
MEDIA_TYPE
+
'
= ?
'
,
selectionArgs
:
[
imageType
.
toString
()],
}
let
size
=
{
width
:
720
,
height
:
720
};
const
fetchFileResult
=
await
media
.
getFileAssets
(
imagesFetchOp
);
if
(
fetchFileResult
!=
undefined
)
{
const
count
=
fetchFileResult
.
getCount
();
const
assetList
=
await
fetchFileResult
.
getAllObject
();
for
(
let
i
=
0
;
i
<
count
;
i
++
)
{
sleep
(
10
).
then
(()
=>
{
assetList
[
i
].
getThumbnail
(
size
).
then
((
pixelMap
)
=>
{
pixelMap
.
getImageInfo
().
then
((
info
)
=>
{
console
.
info
(
"
Thumbnail width:
"
+
info
.
size
.
width
+
"
height:
"
+
info
.
size
.
height
);
}).
catch
((
err
)
=>
{
console
.
info
(
"
getImageInfo failed with error:
"
+
err
);
});
}).
catch
((
err
)
=>
{
console
.
info
(
"
getImageInfo failed with error:
"
+
err
);
});
})
}
}
else
{
console
.
info
(
"
get image failed with error
"
);
}
}
```
## 创建媒体资源
通过接口
[
MediaLibrary.createAsset
](
../reference/apis/js-apis-medialibrary.md#createasset8-1
)
可以创建媒体资源。
**前提条件**
-
获取媒体库mediaLibrary实例。
-
申请媒体库读写权限“ohos.permission.WRITE_MEDIA”。
-
[
获取公共目录路径
](
medialibrary-filepath-guidelines.md
)
。
下面以创建文件类型(MediaType.FILE)的文件为例。
```
ts
async
function
example
()
{
let
mediaType
=
mediaLibrary
.
MediaType
.
FILE
;
let
DIR_DOCUMENTS
=
mediaLibrary
.
DirectoryType
.
DIR_DOCUMENTS
;
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
const
path
=
await
media
.
getPublicDirectory
(
DIR_DOCUMENTS
);
media
.
createAsset
(
mediaType
,
"
testFile.text
"
,
path
).
then
((
asset
)
=>
{
console
.
info
(
"
createAsset successfully:
"
+
JSON
.
stringify
(
asset
));
}).
catch
((
err
)
=>
{
console
.
info
(
"
createAsset failed with error:
"
+
err
);
});
}
```
## 将文件放入回收站
通过
[
FileAsset.trash
](
../reference/apis/js-apis-medialibrary.md#trash8
)
可以将文件放入回收站。
放入回收站的文件将会保存30天,在此期间,开发者可以将trash的入参isTrash设置为false将其恢复为正常文件;应用用户也可以通过系统应用“文件管理”或“图库”恢复文件。
**前提条件**
-
获取媒体库mediaLibrary实例。
-
申请媒体库读写权限“ohos.permission.WRITE_MEDIA”。
下面以将文件检索结果中第一个文件放入回收站为例。
**开发步骤**
1.
建立检索条件,用于获取目的相册下的图片资源。
2.
调用getFileAssets获取目标图片资源。
3.
调用getFirstObject获取第一张图片,即要放入回收站的图片对象。
4.
调用trash将文件放入回收站。
```
ts
async
function
example
()
{
let
fileKeyObj
=
mediaLibrary
.
FileKey
let
fileType
=
mediaLibrary
.
MediaType
.
FILE
let
option
=
{
selections
:
fileKeyObj
.
MEDIA_TYPE
+
'
= ?
'
,
selectionArgs
:
[
fileType
.
toString
()],
};
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
const
fetchFileResult
=
await
media
.
getFileAssets
(
option
);
let
asset
=
await
fetchFileResult
.
getFirstObject
();
if
(
asset
==
undefined
)
{
console
.
error
(
'
asset not exist
'
)
return
}
//回调为空
asset
.
trash
(
true
).
then
(()
=>
{
console
.
info
(
"
trash successfully
"
);
}).
catch
((
err
)
=>
{
console
.
info
(
"
trash failed with error:
"
+
err
);
});
}
```
## 删除媒体资源
通过
[
MediaLibrary.deleteAsset
](
../reference/apis/js-apis-medialibrary.md#deletaasset8-1
)
可以删除媒体资源。
> **说明:**<br/>
>
> deleteAsset为系统接口,仅限系统应用使用。普通应用建议使用trash将媒体资源放入回收站,具体参考[将文件放入回收站](#将文件放入回收站)。
**前提条件**
-
获取媒体库mediaLibrary实例。
-
申请媒体库读写权限“ohos.permission.WRITE_MEDIA”。
下面以删除文件检索结果中第一个文件为例。
**开发步骤**
1.
建立检索条件,用于获取目的相册下的图片资源。
2.
调用getFileAssets获取目标图片资源。
3.
调用getFirstObject获取第一张图片,即要删除的图片对象。
4.
调用deleteAsset删除文件。
```
ts
async
function
example
()
{
let
fileKeyObj
=
mediaLibrary
.
FileKey
let
fileType
=
mediaLibrary
.
MediaType
.
FILE
let
option
=
{
selections
:
fileKeyObj
.
MEDIA_TYPE
+
'
= ?
'
,
selectionArgs
:
[
fileType
.
toString
()],
};
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
const
fetchFileResult
=
await
media
.
getFileAssets
(
option
);
let
asset
=
await
fetchFileResult
.
getFirstObject
();
if
(
asset
==
undefined
)
{
console
.
error
(
'
asset not exist
'
)
return
}
media
.
deleteAsset
(
asset
.
uri
).
then
(
function
()
{
console
.
info
(
"
deleteAsset successfully
"
);
}).
catch
(
function
(
err
){
console
.
info
(
"
deleteAsset failed with error:
"
+
err
);
});
}
```
## 重命名媒体资源
重命名修改的是文件的FileAsset.displayName属性,即文件的显示文件名,包含文件后缀。
修改后再通过
[
FileAsset.commitModify
](
../reference/apis/js-apis-medialibrary.md#commitmodify8-1
)
更新到数据库中。
在删除文件之前,需要先获取文件对象,可以通过
[
FetchFileResult
](
../reference/apis/js-apis-medialibrary.md#fetchfileresult7
)
中的接口获取对应位置的文件。
**前提条件**
-
获取媒体库mediaLibrary实例。
-
申请媒体库读写权限“ohos.permission.WRITE_MEDIA”。
下面以将文件检索结果中第一个文件重命名为“newtitle.text”为例。
**开发步骤**
1.
建立检索条件,用于获取目的相册下的图片资源。
2.
调用getFileAssets获取目标图片资源。
3.
调用getFirstObject获取第一张图片,即要重命名的图片对象。
4.
将图片重命名为“newImage.jpg“。
5.
调用FileAsset.commitModify将更新的图片属性修改到数据库中。
```
ts
async
function
example
()
{
let
fileKeyObj
=
mediaLibrary
.
FileKey
let
fileType
=
mediaLibrary
.
MediaType
.
FILE
let
option
=
{
selections
:
fileKeyObj
.
MEDIA_TYPE
+
'
= ?
'
,
selectionArgs
:
[
fileType
.
toString
()],
};
const
context
=
getContext
(
this
);
var
media
=
mediaLibrary
.
getMediaLibrary
(
context
);
const
fetchFileResult
=
await
media
.
getFileAssets
(
option
);
let
asset
=
await
fetchFileResult
.
getFirstObject
();
if
(
asset
==
undefined
)
{
console
.
error
(
'
asset not exist
'
)
return
}
asset
.
displayName
=
'
newImage.jpg
'
;
//回调为空
asset
.
commitModify
((
err
)
=>
{
if
(
err
)
{
console
.
error
(
'
fileRename Failed
'
);
return
;
}
console
.
log
(
'
fileRename successful.
'
);
})
}
```
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录