提交 1033ce1e 编写于 作者: Z zengyawen

update docs

Signed-off-by: Nzengyawen <zengyawen1@huawei.com>
上级 031eae1d
......@@ -138,6 +138,7 @@ async function readWriteFileWithStream() {
```
> **说明:**
>
> 使用流接口时,需注意流的及时关闭。同时流的异步接口应严格遵循异步接口使用规范,避免同步、异步接口混用。流接口不支持并发读写。
### 查看文件列表
......
......@@ -7,8 +7,9 @@
开发者可以使用上传下载模块([ohos.request](../reference/apis/js-apis-request.md))的上传接口将本地文件上传。文件上传过程使用系统服务代理完成。
> **说明:**
>
> 当前上传应用文件功能,仅支持上传应用缓存文件路径(cacheDir)下的文件。
>
>
> 使用上传下载模块,需[申请相关权限](../security/accesstoken-guidelines.md):ohos.permission.INTERNET。
以下示例代码演示了如何将应用缓存文件路径下的文件上传至网络服务器。
......@@ -64,13 +65,14 @@ try {
开发者可以使用上传下载模块([ohos.request](../reference/apis/js-apis-request.md))的下载接口将网络资源文件下载到应用文件目录。对已下载的网络资源文件,开发者可以使用基础文件IO接口([ohos.file.fs](../reference/apis/js-apis-file-fs.md))对其进行访问,使用方式与[应用文件访问](app-file-access.md)一致。文件下载过程使用系统服务代理完成。
> **说明:**
>
> 当前网络资源文件仅支持下载至应用文件目录。
>
>
> 使用上传下载模块,需[申请相关权限](../security/accesstoken-guidelines.md):ohos.permission.INTERNET。
以下示例代码演示了如何将网络资源文件下载到应用文件目录:
```
```ts
// pages/xxx.ets
// 将网络资源文件下载到应用文件目录并读取一段内容
import common from '@ohos.app.ability.common';
......
......@@ -10,7 +10,8 @@
下图展示了应用沙箱下,应用可访问的文件范围和方式。
**图1** 应用沙箱文件访问关系图  
**图1** 应用沙箱文件访问关系图
![Application sandbox file access relationship](figures/application-sandbox-file-access-relationship.png)
## 应用沙箱目录与应用沙箱路径
......@@ -23,7 +24,8 @@
- 从实际物理路径推导物理路径与沙箱路径并不是1:1的映射关系,沙箱路径总是少于系统进程视角可见的物理路径。有些调试进程视角下的物理路径在对应的应用沙箱目录是无法找到的,而沙箱路径总是能够找到其对应的物理路径。
**图2** 应用沙箱路径(不同权限与角色的进程下可见的文件路径不同)  
**图2** 应用沙箱路径(不同权限与角色的进程下可见的文件路径不同)
  
![Application sandbox path](figures/application-sandbox-path.png)
## 应用文件目录与应用文件路径
......@@ -34,7 +36,8 @@
在此主要介绍应用文件目录,如下图所示。应用文件目录下某个文件或某个具体目录的路径称为应用文件路径。应用文件目录下的各个文件路径,具备不同的属性和特征。
**图3** 应用文件目录结构图  
**图3** 应用文件目录结构图
![Application file directory structure](figures/application-file-directory-structure.png)
1. 一级目录data/:代表应用文件目录。
......@@ -54,14 +57,14 @@
Context上下文获取及上述应用文件路径的获取,详见[应用上下文Context](../application-models/application-context-stage.md)
> **说明:**
>
> - 禁止直接使用上图中四级目录之前的目录名组成的路径字符串,否则可能导致后续应用版本因应用文件路径变化导致不兼容问题。
>
> - 应通过Context属性获取应用文件路径,包括但不限于上图中绿色背景的路径。
应用文件路径具体说明及生命周期如下表所示。
**表1** 应用文件路径详细说明
| 目录名 | Context属性名称 | 类型 | 说明 |
| -------- | -------- | -------- | -------- |
| bundle | bundleCodeDir | 安装文件路径 | 应用安装后的app的hap资源包所在目录;随应用卸载而清理。不能拼接路径访问资源文件,请使用[资源管理接口](../reference/apis/js-apis-resource-manager.md)访问资源。 |
......
......@@ -14,11 +14,11 @@ OpenHarmony预置了FileManager文件管理器。系统应用开发者也可以
> **说明:**
>
> ohos.permission.FILE_ACCESS_MANAGER是使用文件访问框架接口的基础权限。
>
>
> ohos.permission.GET_BUNDLE_INFO_PRIVILEGED权限可以用于查询系统内当前支持的文件管理服务端应用信息。
2. 导入依赖模块。
```ts
import fileAccess from '@ohos.file.fileAccess';
import fileExtensionInfo from '@ohos.file.fileExtensionInfo';
......@@ -30,7 +30,7 @@ OpenHarmony预置了FileManager文件管理器。系统应用开发者也可以
开发者可以获取当前系统所有文件管理服务端管理的设备属性,也可以获取某个文件管理服务端管理的设备属性。应用开发者可以按需过滤设备。
在文件访问框架中,使用RootInfo用于表示设备的属性信息。以下示例可以获取所有设备的RootInfo。
```ts
// 创建连接系统内所有文件管理服务端的helper对象
let fileAccessHelperAllServer = null;
......@@ -71,7 +71,7 @@ OpenHarmony预置了FileManager文件管理器。系统应用开发者也可以
在文件访问框架中,使用FileInfo表示一个文件(目录)的基础信息。开发者可以使用listfile接口遍历下一级所有文件(目录)的迭代器对象;也可以通过scanfile过滤指定目录,获取满足条件的迭代器对象。
listfile和scanfile接口当前支持RootInfo对象调用,可用于支撑遍历下一级文件或过滤整个目录树。同时,接口也支持FileInfo对象调用,用于支撑遍历下一级文件或过滤指定目录。
```ts
// 从根目录开始
let rootInfo = rootinfos[0];
......@@ -123,7 +123,6 @@ OpenHarmony预置了FileManager文件管理器。系统应用开发者也可以
5. 操作文件或目录。
开发者可以集成文件访问框架的接口,完成一些用户行为,比如删除文件(目录)、重命名文件(目录)、新建文件(目录)、移动文件(目录)等。以下示例展示了如何创建一个文件,其他接口请参见[API参考](../reference/apis/js-apis-fileAccess.md)
```ts
// 以本地设备为例
// 创建文件
......
......@@ -8,10 +8,8 @@
- 户外拍摄的照片,回家打开平板直接访问原设备拍摄的照片。
hmdfs在分布式软总线动态组网的基础上,为网络上各个设备结点提供一个全局一致的访问视图,支持开发者通过基础文件系统接口进行读写访问,具有高性能、低延时等优点。
## 分布式文件系统架构
![Distributed File System Architecture](figures/distributed-file-system-architecture.png)
......@@ -20,22 +18,22 @@ hmdfs在分布式软总线动态组网的基础上,为网络上各个设备结
- hmdfs:实现在内核的网络文件系统,包括缓存管理、文件访问、元数据管理和冲突管理等。
- 缓存管理
- 设备分布式组网后,hmdfs提供文件的互访能力,但不会主动进行文件数据传输和拷贝。如果应用需要将数据保存到本地,需主动拷贝。
- hmdfs保证Close-to-Open的一致性,即一端写关闭后,另外一端可以读取到最新数据,不保证文件内容的实时一致性。
- 数据在远端写入,但是由于网络原因未及时回刷,文件系统会在下次网络接入时回刷本地,但是如果远端已修改则无法回刷。
- 设备分布式组网后,hmdfs提供文件的互访能力,但不会主动进行文件数据传输和拷贝。如果应用需要将数据保存到本地,需主动拷贝。
- hmdfs保证Close-to-Open的一致性,即一端写关闭后,另外一端可以读取到最新数据,不保证文件内容的实时一致性。
- 数据在远端写入,但是由于网络原因未及时回刷,文件系统会在下次网络接入时回刷本地,但是如果远端已修改则无法回刷。
- 文件访问
- 文件访问接口与本地一致([ohos.file.fs](../reference/apis/js-apis-file-fs.md))。
- 如果文件在本地,则堆叠访问本地文件系统。
- 如果文件在其他设备,则同步网络访问远端设备文件。
- 文件访问接口与本地一致([ohos.file.fs](../reference/apis/js-apis-file-fs.md))。
- 如果文件在本地,则堆叠访问本地文件系统。
- 如果文件在其他设备,则同步网络访问远端设备文件。
> **说明:**
>
> symlink:不支持。
- 元数据管理
- 分布式组网下,文件一端创建、删除、修改,另一端可以“立即”查看到最新文件,看到速度取决于网络情况。
- 远端设备离线后,该设备数据将不再在本端设备呈现。但由于设备离线的感知具有延迟,可能会造成部分消息4s超时,因此开发者需要考虑接口的网络超时或一些文件虽然可以看到,但实际设备可能已离线的场景。
- 分布式组网下,文件一端创建、删除、修改,另一端可以“立即”查看到最新文件,看到速度取决于网络情况。
- 远端设备离线后,该设备数据将不再在本端设备呈现。但由于设备离线的感知具有延迟,可能会造成部分消息4s超时,因此开发者需要考虑接口的网络超时或一些文件虽然可以看到,但实际设备可能已离线的场景。
- 冲突处理
- 本地与远端冲突 ,远端文件被重命名,看到的同名文件是本地同名文件,远端文件被重命名。
- 远端多个设备冲突,以接入本设备ID为顺序,显示设备ID小的同名文件,其他文件被依次重命名。
- 如果组网场景,目录树下已经有远端文件,创建同名文件,提示文件已存在。
- 冲突文件显示_conflict_dev后依次加id,id从1自动递增。
- 同名目录之间仅融合不存在冲突,文件和远端目录同名冲突,远端目录后缀加_remote_directory。
- 本地与远端冲突 ,远端文件被重命名,看到的同名文件是本地同名文件,远端文件被重命名。
- 远端多个设备冲突,以接入本设备ID为顺序,显示设备ID小的同名文件,其他文件被依次重命名。
- 如果组网场景,目录树下已经有远端文件,创建同名文件,提示文件已存在。
- 冲突文件显示_conflict_dev后依次加id,id从1自动递增。
- 同名目录之间仅融合不存在冲突,文件和远端目录同名冲突,远端目录后缀加_remote_directory。
# 跨设备文件访问
分布式文件系统为应用提供了跨设备文件访问的能力,开发者在多个设备安装同一应用时,通过[基础文件接口](app-file-access.md),可跨设备读写其他设备该应用分布式文件路径(/data/storage/el2/distributedfiles/)下的文件。例如:多设备数据流转的场景,设备组网互联之后,设备A上的应用可访问设备B同应用分布式路径下的文件,当期望应用文件被其他设备访问时,只需将文件移动到分布式文件路径即可。
## 开发步骤
1. 完成分布式组网。
......@@ -14,7 +12,6 @@
设备A上在分布式路径下创建测试文件,并写入内容。示例中的context的获取方式请参见[获取UIAbility的上下文信息](../application-models/uiability-usage.md#获取uiability的上下文信息)
```ts
import fs from '@ohos.file.fs';
......@@ -38,7 +35,6 @@
设备B上在分布式路径下读取测试文件。
```ts
import fs from '@ohos.file.fs';
......
......@@ -21,4 +21,5 @@
- [分布式文件系统](distributed-fs-overview.md):提供跨设备的文件访问能力。所谓跨设备,指文件不一定存储在本地设备或外置存储设备,而是通过计算机网络与其他分布式设备相连。
**图1** 文件分类模型示意图
![File classification model](figures/file-classification-model.png)
......@@ -5,6 +5,7 @@
外置存储设备的管理由StorageManager和StorageDaemon两个服务完成。StorageDaemon实现底层的的监听挂载等功能;StorageManager则对系统应用提供状态变更通知、查询和管理能力。
**图1** 外置存储设备管理示意图  
![External storage device management](figures/external-storage-device-management.png)
- 插入外卡时,StorageDaemon进程通过netlink监听获取到外卡插入事件,创建对应的磁盘设备以及卷设备,此时,已创建的卷设备状态为卸载状态(UNMOUNTED)。
......@@ -19,7 +20,6 @@
- 当卷设备处于卸载状态时,拔出卷设备会删除相关卷设备信息,并发送COMMON_EVENT_VOLUME_REMOVED广播。
## 接口说明
外置存储设备管理相关API的详细介绍请参见[API参考](../reference/apis/js-apis-file-volumemanager.md)
......@@ -36,7 +36,6 @@
| usual.event.data.VOLUME_BAD_REMOVAL | id:卷设备ID<br/>diskId:卷设备所属磁盘设备ID |
| usual.event.data.VOLUME_EJECT | id:卷设备ID<br/>diskId:卷设备所属磁盘设备ID<br/>volumeState:卷设备状态 |
## 开发步骤
开发者通过订阅卷设备相关的广播事件来感知外置存储的插入,通过广播传递的信息获取卷设备信息后可以对卷设备进行查询以及管理操作。
......@@ -53,7 +52,6 @@
- 卷设备异常移除:"usual.event.data.VOLUME_BAD_REMOVAL"
- 卷设备正在弹出:"usual.event.data.VOLUME_EJECT"
```ts
import CommonEvent from '@ohos.commonEventManager';
import volumeManager from '@ohos.file.volumeManager';
......@@ -71,7 +69,7 @@
```
3. 收到广播通知后获取卷设备信息。
```ts
CommonEvent.subscribe(subscriber, function (err, data) {
if (data.event === 'usual.event.data.VOLUME_MOUNTED') {
......
......@@ -8,13 +8,13 @@
## 保存图片或视频类文件
1. 导入选择器模块。
```ts
import picker from '@ohos.file.picker';
```
2. 创建图库保存选项实例。
```ts
const photoSaveOptions = new picker.PhotoSaveOptions(); // 创建文件管理器保存选项实例
photoSaveOptions.newFileNames = ["PhotoViewPicker01.jpg"]; // 保存文件名(可选)
......@@ -22,7 +22,7 @@
3. 创建图库选择器实例,调用[save()](../reference/apis/js-apis-file-picker.md#save)接口拉起FilePicker界面进行文件保存。
用户选择目标文件夹,用户选择与文件类型相对应的文件夹,即可完成文件保存操作。保存成功后,返回保存文档的URI。
```ts
const photoViewPicker = new picker.PhotoViewPicker();
photoViewPicker.save(photoSaveOptions)
......@@ -35,17 +35,16 @@
})
```
## 保存文档类文件
1. 导入选择器模块。
```ts
import picker from '@ohos.file.picker';
```
2. 创建文档保存选项实例。
```ts
const documentSaveOptions = new picker.DocumentSaveOptions(); // 创建文件管理器选项实例
documentSaveOptions.newFileNames = ["DocumentViewPicker01.txt"]; // 保存文件名(可选)
......@@ -58,7 +57,6 @@
>
> 目前DocumentSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。
```ts
const documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例
documentViewPicker.save(documentSaveOptions)
......@@ -71,17 +69,16 @@
})
```
## 保存音频类文件
1. 导入选择器模块。
```ts
import picker from '@ohos.file.picker';
```
2. 创建音频保存选项实例。
```ts
const audioSaveOptions = new picker.AudioSaveOptions(); // 创建文件管理器选项实例
audioSaveOptions.newFileNames = ['AudioViewPicker01.mp3']; // 保存文件名(可选)
......@@ -92,8 +89,7 @@
> **说明:**
>
> 目前AudioSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。
```ts
const audioViewPicker = new picker.AudioViewPicker();
audioViewPicker.save(audioSaveOptions)
......
......@@ -2,10 +2,8 @@
终端用户有时需要分享、保存一些图片、视频等用户文件,开发者需要在应用中支持此类使用场景。此时,开发者可以使用OpenHarmony系统预置的[文件选择器(FilePicker)](../reference/apis/js-apis-file-picker.md),实现用户文件选择及保存能力。
根据用户文件的常见类型,文件选择器(FilePicker)分别提供以下接口:
- [PhotoViewPicker](../reference/apis/js-apis-file-picker.md#photoviewpicker):适用于图片或视频类文件的选择与保存。
- [DocumentViewPicker](../reference/apis/js-apis-file-picker.md#documentviewpicker):适用于文档类文件的选择与保存。
......@@ -15,13 +13,13 @@
## 选择图片或视频类文件
1. 导入选择器模块。
```ts
import picker from '@ohos.file.picker';
```
2. 创建图库选择选项实例。
```ts
const photoSelectOptions = new picker.PhotoSelectOptions();
```
......@@ -29,16 +27,15 @@
3. 选择媒体文件类型和选择媒体文件的最大数目。
以下示例以图片选择为例,媒体文件类型请参见[PhotoViewMIMETypes](../reference/apis/js-apis-file-picker.md#photoviewmimetypes)
```ts
photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目
```
4. 创建图库选择器实例,调用[select()](../reference/apis/js-apis-file-picker.md#select)接口拉起FilePicker界面进行文件选择。
文件选择成功后,返回[PhotoSelectResult](../reference/apis/js-apis-file-picker.md#photoselectresult)结果集,可以根据结果集中URI进行文件读取等操作。
```ts
const photoPicker = new picker.PhotoViewPicker();
photoPicker.select(photoSelectOptions)
......@@ -54,13 +51,13 @@
## 选择文档类文件
1. 导入选择器模块。
```ts
import picker from '@ohos.file.picker';
```
2. 创建文档选择选项实例。
```ts
const documentSelectOptions = new picker.DocumentSelectOptions();
```
......@@ -70,8 +67,7 @@
> **说明:**
>
> 目前DocumentSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。
```ts
const documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例
documentViewPicker.select(documentSelectOptions)
......@@ -87,26 +83,27 @@
## 选择音频类文件
1. 导入选择器模块。
```ts
import picker from '@ohos.file.picker';
```
2. 创建音频选择选项实例。
```ts
const audioSelectOptions = new picker.AudioSelectOptions();
```
3. 创建音频选择器实例。调用[select()](../reference/apis/js-apis-file-picker.md#select-6)接口拉起FilePicker界面进行文件选择。
文件选择成功后,返回被选中音频的URI结果集。开发者可以根据结果集中URI做进一步的处理。
例如通过[文件管理接口](../reference/apis/js-apis-file-fs.md)根据URI拿到音频资源的文件句柄(FD),再配合媒体服务实现音频播放的开发,具体请参考[音频播放开发指导](../media/audio-playback-overview.md)。
例如通过[文件管理接口](../reference/apis/js-apis-file-fs.md)根据URI拿到音频资源的文件句柄(FD),再配合媒体服务实现音频播放的开发,具体请参考[音频播放开发指导](../media/audio-playback-overview.md)
> **说明:**
>
> 目前AudioSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。
```ts
const audioViewPicker = new picker.AudioViewPicker();
audioViewPicker.select(audioSelectOptions)
......
......@@ -14,14 +14,14 @@
**表1** 应用沙箱路径与真实物理路径对应关系
| 应用沙箱路径 | 调试进程(hdc)视角下的实际路径 | 说明 |
| 应用沙箱路径 | 调试进程(hdc)视角下的实际路径 | 说明 |
| -------- | -------- | -------- |
| /data/storage/el1/bundle | /data/app/el1/bundle/public/&lt;PACKAGENAME&gt; | 应用安装包目录 |
| /data/storage/el1/base | /data/app/el1/&lt;USERID&gt;/base/&lt;PACKAGENAME&gt; | 应用el1级别加密数据目录 |
| /data/storage/el2/base | /data/app/el2/&lt;USERID&gt;/base/&lt;PACKAGENAME&gt; | 应用el2级别加密数据目录 |
| /data/storage/el1/database | /data/app/el1/&lt;USERID&gt;/database/&lt;PACKAGENAME&gt; | 应用el1级别加密数据库目录 |
| /data/storage/el2/database | /data/app/el2/&lt;USERID&gt;/database/&lt;PACKAGENAME&gt; | 应用el2级别加密数据库目录 |
| /data/storage/el2/distributedfiles | /mnt/hmdfs/&lt;USERID&gt;/account/merge_view/data/&lt;PACKAGENAME&gt; | 应用el2加密级别有帐号分布式数据融合目录 |
| /data/storage/el1/bundle | /data/app/el1/bundle/public/&lt;PACKAGENAME&gt; | 应用安装包目录 |
| /data/storage/el1/base | /data/app/el1/&lt;USERID&gt;/base/&lt;PACKAGENAME&gt; | 应用el1级别加密数据目录 |
| /data/storage/el2/base | /data/app/el2/&lt;USERID&gt;/base/&lt;PACKAGENAME&gt; | 应用el2级别加密数据目录 |
| /data/storage/el1/database | /data/app/el1/&lt;USERID&gt;/database/&lt;PACKAGENAME&gt; | 应用el1级别加密数据库目录 |
| /data/storage/el2/database | /data/app/el2/&lt;USERID&gt;/database/&lt;PACKAGENAME&gt; | 应用el2级别加密数据库目录 |
| /data/storage/el2/distributedfiles | /mnt/hmdfs/&lt;USERID&gt;/account/merge_view/data/&lt;PACKAGENAME&gt; | 应用el2加密级别有帐号分布式数据融合目录 |
## 开发示例
......
......@@ -2,7 +2,6 @@
不同设备本身的安全能力差异较大,一些小的嵌入式设备安全能力远弱于平板等设备类型。用户或者应用不同的文件数据有不同安全诉求,例如个人的健康信息和银行卡信息等不期望被弱设备读取。因此,OpenHarmony提供一套完整的数据分级、设备分级标准,并针对不同设备制定不同的数据流转策略,具体规则请参见[数据、设备安全分级](../database/access-control-by-device-and-data-level.md)
## 接口说明
API详细介绍请参见[ohos.file.securityLabel](../reference/apis/js-apis-file-securityLabel.md)
......@@ -15,8 +14,9 @@ API详细介绍请参见[ohos.file.securityLabel](../reference/apis/js-apis-file
| getSecurityLabel | 获取文件安全标签 | 方法 | √ | √ |
> **须知:**
>
> 1. 对于不满足安全等级的文件,跨设备仍然可以看到该文件,但是无权限打开访问该文件。
>
>
> 2. 分布式文件系统的数据等级默认为S3,应用可以主动设置文件的安全等级。
## 开发示例
......
......@@ -13,6 +13,7 @@
文件URI的格式为:
格式为file://&lt;bundleName&gt;/&lt;path&gt;/\#networkid=&lt;networkid&gt;
- file:文件URI的标志。
- bundleName:该文件资源的属主。
......@@ -26,7 +27,7 @@
在分享文件给其他应用前,开发者需要先[获取应用文件路径](../application-models/application-context-stage.md#获取应用开发路径)
1. 获取文件在应用沙箱中的路径,并转换为文件URI。
```ts
import UIAbility from '@ohos.app.ability.UIAbility';
import fileuri from '@ohos.file.fileuri';
......@@ -49,7 +50,7 @@
> **说明:**
>
> 写权限分享时,同时授予读权限。
```ts
import fileuri from '@ohos.file.fileuri';
import window from '@ohos.window';
......@@ -118,7 +119,6 @@
通过接口want的参数获取分享文件的URI,获取文件URI后通过fs.open()接口打开文件,获取对应的file对象后,可对文件进行读写操作。
```ts
// xxx.ets
import fs from '@ohos.file.fs';
......
......@@ -56,5 +56,5 @@ OpenHarmony提供[用户文件访问框架](#用户文件访问框架),用于
- File Access Framework(用户文件访问框架)的主要功能模块如下:
- File Access Helper:提供给文件管理器和文件选择器访问用户文件的API接口。
- File Access ExtensionAbility:提供文件访问框架能力,由内卡文件管理服务UserFileManager和外卡文件管理服务ExternalFileManager组成,实现对应的文件访问功能。
- UserFileManager:内卡文件管理服务,基于File Access ExtensionAbility框架实现,用于管理内置存储设备上的文件。
- ExternalFileManager:外卡文件管理服务,基于File Access ExtensionAbility框架实现,用于管理外置存储设备上的文件。
- UserFileManager:内卡文件管理服务,基于File Access ExtensionAbility框架实现,用于管理内置存储设备上的文件。
- ExternalFileManager:外卡文件管理服务,基于File Access ExtensionAbility框架实现,用于管理外置存储设备上的文件。
......@@ -19,7 +19,7 @@ export default class VoiceCallDemoForAudioRenderer {
private renderModel = undefined;
private audioStreamInfo = {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000, // 采样率
channels: audio.AudioChannel.CHANNEL_2, // 通道
channels: audio.AudioChannel.CHANNEL_2, // 通道
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
}
......@@ -60,7 +60,7 @@ export default class VoiceCallDemoForAudioRenderer {
// 开始一次音频渲染
async start() {
let stateGroup = [audio.AudioState.STATE_PREPARED, audio.AudioState.STATE_PAUSED, audio.AudioState.STATE_STOPPED];
if (stateGroup.indexOf(this.renderModel.state) === -1) { // 当且仅当状态为prepared、paused和stopped之一时才能启动渲染
if (stateGroup.indexOf(this.renderModel.state) === -1) { // 当且仅当状态为STATE_PREPARED、STATE_PAUSED和STATE_STOPPED之一时才能启动渲染
console.error(TAG + 'start failed');
return;
}
......@@ -91,7 +91,7 @@ export default class VoiceCallDemoForAudioRenderer {
}
});
});
if (this.renderModel.state === audio.AudioState.STATE_RELEASED) { // 如果渲染器状态为released,停止渲染
if (this.renderModel.state === audio.AudioState.STATE_RELEASED) { // 如果渲染器状态为STATE_RELEASED,停止渲染
fs.close(file);
await this.renderModel.stop();
}
......@@ -105,7 +105,7 @@ export default class VoiceCallDemoForAudioRenderer {
}
// 暂停渲染
async pause() {
// 只有渲染器状态为running的时候才能暂停
// 只有渲染器状态为STATE_RUNNING的时候才能暂停
if (this.renderModel.state !== audio.AudioState.STATE_RUNNING) {
console.info('Renderer is not running');
return;
......@@ -119,7 +119,7 @@ export default class VoiceCallDemoForAudioRenderer {
}
// 停止渲染
async stop() {
// 只有渲染器状态为running或paused的时候才可以停止
// 只有渲染器状态为STATE_RUNNING或STATE_PAUSED的时候才可以停止
if (this.renderModel.state !== audio.AudioState.STATE_RUNNING && this.renderModel.state !== audio.AudioState.STATE_PAUSED) {
console.info('Renderer is not running or paused.');
return;
......@@ -133,7 +133,7 @@ export default class VoiceCallDemoForAudioRenderer {
}
// 销毁实例,释放资源
async release() {
// 渲染器状态不是released状态,才能release
// 渲染器状态不是STATE_RELEASED状态,才能release
if (this.renderModel.state === audio.AudioState.STATE_RELEASED) {
console.info('Renderer already released');
return;
......@@ -161,7 +161,7 @@ export default class VoiceCallDemoForAudioCapturer {
private audioCapturer = undefined;
private audioStreamInfo = {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100, // 采样率
channels: audio.AudioChannel.CHANNEL_1, // 通道
channels: audio.AudioChannel.CHANNEL_1, // 通道
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
}
......@@ -198,7 +198,7 @@ export default class VoiceCallDemoForAudioCapturer {
// 开始一次音频采集
async start() {
let stateGroup = [audio.AudioState.STATE_PREPARED, audio.AudioState.STATE_PAUSED, audio.AudioState.STATE_STOPPED];
if (stateGroup.indexOf(this.audioCapturer.state) === -1) { // 当且仅当状态为prepared、paused和stopped之一时才能启动采集
if (stateGroup.indexOf(this.audioCapturer.state) === -1) { // 当且仅当状态为STATE_PREPARED、STATE_PAUSED和STATE_STOPPED之一时才能启动采集
console.error(`${TAG}: start failed`);
return;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册