提交 10a1b30a 编写于 作者: Z zengyawen
上级 1153dfd8
...@@ -138,6 +138,7 @@ async function readWriteFileWithStream() { ...@@ -138,6 +138,7 @@ async function readWriteFileWithStream() {
``` ```
> **说明:** > **说明:**
>
> 使用流接口时,需注意流的及时关闭。同时流的异步接口应严格遵循异步接口使用规范,避免同步、异步接口混用。流接口不支持并发读写。 > 使用流接口时,需注意流的及时关闭。同时流的异步接口应严格遵循异步接口使用规范,避免同步、异步接口混用。流接口不支持并发读写。
### 查看文件列表 ### 查看文件列表
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
开发者可以使用上传下载模块([ohos.request](../reference/apis/js-apis-request.md))的上传接口将本地文件上传。文件上传过程使用系统服务代理完成。 开发者可以使用上传下载模块([ohos.request](../reference/apis/js-apis-request.md))的上传接口将本地文件上传。文件上传过程使用系统服务代理完成。
> **说明:** > **说明:**
>
> 当前上传应用文件功能,仅支持上传应用缓存文件路径(cacheDir)下的文件。 > 当前上传应用文件功能,仅支持上传应用缓存文件路径(cacheDir)下的文件。
> >
> 使用上传下载模块,需[申请相关权限](../security/accesstoken-guidelines.md):ohos.permission.INTERNET。 > 使用上传下载模块,需[申请相关权限](../security/accesstoken-guidelines.md):ohos.permission.INTERNET。
...@@ -64,13 +65,14 @@ try { ...@@ -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)一致。文件下载过程使用系统服务代理完成。 开发者可以使用上传下载模块([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。 > 使用上传下载模块,需[申请相关权限](../security/accesstoken-guidelines.md):ohos.permission.INTERNET。
以下示例代码演示了如何将网络资源文件下载到应用文件目录: 以下示例代码演示了如何将网络资源文件下载到应用文件目录:
``` ```ts
// pages/xxx.ets // pages/xxx.ets
// 将网络资源文件下载到应用文件目录并读取一段内容 // 将网络资源文件下载到应用文件目录并读取一段内容
import common from '@ohos.app.ability.common'; import common from '@ohos.app.ability.common';
......
...@@ -10,7 +10,8 @@ ...@@ -10,7 +10,8 @@
下图展示了应用沙箱下,应用可访问的文件范围和方式。 下图展示了应用沙箱下,应用可访问的文件范围和方式。
**图1** 应用沙箱文件访问关系图   **图1** 应用沙箱文件访问关系图
![Application sandbox file access relationship](figures/application-sandbox-file-access-relationship.png) ![Application sandbox file access relationship](figures/application-sandbox-file-access-relationship.png)
## 应用沙箱目录与应用沙箱路径 ## 应用沙箱目录与应用沙箱路径
...@@ -23,7 +24,8 @@ ...@@ -23,7 +24,8 @@
- 从实际物理路径推导物理路径与沙箱路径并不是1:1的映射关系,沙箱路径总是少于系统进程视角可见的物理路径。有些调试进程视角下的物理路径在对应的应用沙箱目录是无法找到的,而沙箱路径总是能够找到其对应的物理路径。 - 从实际物理路径推导物理路径与沙箱路径并不是1:1的映射关系,沙箱路径总是少于系统进程视角可见的物理路径。有些调试进程视角下的物理路径在对应的应用沙箱目录是无法找到的,而沙箱路径总是能够找到其对应的物理路径。
**图2** 应用沙箱路径(不同权限与角色的进程下可见的文件路径不同)   **图2** 应用沙箱路径(不同权限与角色的进程下可见的文件路径不同)
  
![Application sandbox path](figures/application-sandbox-path.png) ![Application sandbox path](figures/application-sandbox-path.png)
## 应用文件目录与应用文件路径 ## 应用文件目录与应用文件路径
...@@ -34,7 +36,8 @@ ...@@ -34,7 +36,8 @@
在此主要介绍应用文件目录,如下图所示。应用文件目录下某个文件或某个具体目录的路径称为应用文件路径。应用文件目录下的各个文件路径,具备不同的属性和特征。 在此主要介绍应用文件目录,如下图所示。应用文件目录下某个文件或某个具体目录的路径称为应用文件路径。应用文件目录下的各个文件路径,具备不同的属性和特征。
**图3** 应用文件目录结构图   **图3** 应用文件目录结构图
![Application file directory structure](figures/application-file-directory-structure.png) ![Application file directory structure](figures/application-file-directory-structure.png)
1. 一级目录data/:代表应用文件目录。 1. 一级目录data/:代表应用文件目录。
...@@ -54,8 +57,8 @@ ...@@ -54,8 +57,8 @@
Context上下文获取及上述应用文件路径的获取,详见[应用上下文Context](../application-models/application-context-stage.md) Context上下文获取及上述应用文件路径的获取,详见[应用上下文Context](../application-models/application-context-stage.md)
> **说明:** > **说明:**
> - 禁止直接使用上图中四级目录之前的目录名组成的路径字符串,否则可能导致后续应用版本因应用文件路径变化导致不兼容问题。
> >
> - 禁止直接使用上图中四级目录之前的目录名组成的路径字符串,否则可能导致后续应用版本因应用文件路径变化导致不兼容问题。
> - 应通过Context属性获取应用文件路径,包括但不限于上图中绿色背景的路径。 > - 应通过Context属性获取应用文件路径,包括但不限于上图中绿色背景的路径。
应用文件路径具体说明及生命周期如下表所示。 应用文件路径具体说明及生命周期如下表所示。
......
...@@ -123,7 +123,6 @@ OpenHarmony预置了FileManager文件管理器。系统应用开发者也可以 ...@@ -123,7 +123,6 @@ OpenHarmony预置了FileManager文件管理器。系统应用开发者也可以
5. 操作文件或目录。 5. 操作文件或目录。
开发者可以集成文件访问框架的接口,完成一些用户行为,比如删除文件(目录)、重命名文件(目录)、新建文件(目录)、移动文件(目录)等。以下示例展示了如何创建一个文件,其他接口请参见[API参考](../reference/apis/js-apis-fileAccess.md) 开发者可以集成文件访问框架的接口,完成一些用户行为,比如删除文件(目录)、重命名文件(目录)、新建文件(目录)、移动文件(目录)等。以下示例展示了如何创建一个文件,其他接口请参见[API参考](../reference/apis/js-apis-fileAccess.md)
```ts ```ts
// 以本地设备为例 // 以本地设备为例
// 创建文件 // 创建文件
......
...@@ -8,10 +8,8 @@ ...@@ -8,10 +8,8 @@
- 户外拍摄的照片,回家打开平板直接访问原设备拍摄的照片。 - 户外拍摄的照片,回家打开平板直接访问原设备拍摄的照片。
hmdfs在分布式软总线动态组网的基础上,为网络上各个设备结点提供一个全局一致的访问视图,支持开发者通过基础文件系统接口进行读写访问,具有高性能、低延时等优点。 hmdfs在分布式软总线动态组网的基础上,为网络上各个设备结点提供一个全局一致的访问视图,支持开发者通过基础文件系统接口进行读写访问,具有高性能、低延时等优点。
## 分布式文件系统架构 ## 分布式文件系统架构
![Distributed File System Architecture](figures/distributed-file-system-architecture.png) ![Distributed File System Architecture](figures/distributed-file-system-architecture.png)
......
# 跨设备文件访问 # 跨设备文件访问
分布式文件系统为应用提供了跨设备文件访问的能力,开发者在多个设备安装同一应用时,通过[基础文件接口](app-file-access.md),可跨设备读写其他设备该应用分布式文件路径(/data/storage/el2/distributedfiles/)下的文件。例如:多设备数据流转的场景,设备组网互联之后,设备A上的应用可访问设备B同应用分布式路径下的文件,当期望应用文件被其他设备访问时,只需将文件移动到分布式文件路径即可。 分布式文件系统为应用提供了跨设备文件访问的能力,开发者在多个设备安装同一应用时,通过[基础文件接口](app-file-access.md),可跨设备读写其他设备该应用分布式文件路径(/data/storage/el2/distributedfiles/)下的文件。例如:多设备数据流转的场景,设备组网互联之后,设备A上的应用可访问设备B同应用分布式路径下的文件,当期望应用文件被其他设备访问时,只需将文件移动到分布式文件路径即可。
## 开发步骤 ## 开发步骤
1. 完成分布式组网。 1. 完成分布式组网。
...@@ -14,7 +12,6 @@ ...@@ -14,7 +12,6 @@
设备A上在分布式路径下创建测试文件,并写入内容。示例中的context的获取方式请参见[获取UIAbility的上下文信息](../application-models/uiability-usage.md#获取uiability的上下文信息) 设备A上在分布式路径下创建测试文件,并写入内容。示例中的context的获取方式请参见[获取UIAbility的上下文信息](../application-models/uiability-usage.md#获取uiability的上下文信息)
```ts ```ts
import fs from '@ohos.file.fs'; import fs from '@ohos.file.fs';
...@@ -38,7 +35,6 @@ ...@@ -38,7 +35,6 @@
设备B上在分布式路径下读取测试文件。 设备B上在分布式路径下读取测试文件。
```ts ```ts
import fs from '@ohos.file.fs'; import fs from '@ohos.file.fs';
......
...@@ -21,4 +21,5 @@ ...@@ -21,4 +21,5 @@
- [分布式文件系统](distributed-fs-overview.md):提供跨设备的文件访问能力。所谓跨设备,指文件不一定存储在本地设备或外置存储设备,而是通过计算机网络与其他分布式设备相连。 - [分布式文件系统](distributed-fs-overview.md):提供跨设备的文件访问能力。所谓跨设备,指文件不一定存储在本地设备或外置存储设备,而是通过计算机网络与其他分布式设备相连。
**图1** 文件分类模型示意图 **图1** 文件分类模型示意图
![File classification model](figures/file-classification-model.png) ![File classification model](figures/file-classification-model.png)
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
外置存储设备的管理由StorageManager和StorageDaemon两个服务完成。StorageDaemon实现底层的的监听挂载等功能;StorageManager则对系统应用提供状态变更通知、查询和管理能力。 外置存储设备的管理由StorageManager和StorageDaemon两个服务完成。StorageDaemon实现底层的的监听挂载等功能;StorageManager则对系统应用提供状态变更通知、查询和管理能力。
**图1** 外置存储设备管理示意图   **图1** 外置存储设备管理示意图  
![External storage device management](figures/external-storage-device-management.png) ![External storage device management](figures/external-storage-device-management.png)
- 插入外卡时,StorageDaemon进程通过netlink监听获取到外卡插入事件,创建对应的磁盘设备以及卷设备,此时,已创建的卷设备状态为卸载状态(UNMOUNTED)。 - 插入外卡时,StorageDaemon进程通过netlink监听获取到外卡插入事件,创建对应的磁盘设备以及卷设备,此时,已创建的卷设备状态为卸载状态(UNMOUNTED)。
...@@ -19,7 +20,6 @@ ...@@ -19,7 +20,6 @@
- 当卷设备处于卸载状态时,拔出卷设备会删除相关卷设备信息,并发送COMMON_EVENT_VOLUME_REMOVED广播。 - 当卷设备处于卸载状态时,拔出卷设备会删除相关卷设备信息,并发送COMMON_EVENT_VOLUME_REMOVED广播。
## 接口说明 ## 接口说明
外置存储设备管理相关API的详细介绍请参见[API参考](../reference/apis/js-apis-file-volumemanager.md) 外置存储设备管理相关API的详细介绍请参见[API参考](../reference/apis/js-apis-file-volumemanager.md)
...@@ -36,7 +36,6 @@ ...@@ -36,7 +36,6 @@
| usual.event.data.VOLUME_BAD_REMOVAL | id:卷设备ID<br/>diskId:卷设备所属磁盘设备ID | | usual.event.data.VOLUME_BAD_REMOVAL | id:卷设备ID<br/>diskId:卷设备所属磁盘设备ID |
| usual.event.data.VOLUME_EJECT | id:卷设备ID<br/>diskId:卷设备所属磁盘设备ID<br/>volumeState:卷设备状态 | | usual.event.data.VOLUME_EJECT | id:卷设备ID<br/>diskId:卷设备所属磁盘设备ID<br/>volumeState:卷设备状态 |
## 开发步骤 ## 开发步骤
开发者通过订阅卷设备相关的广播事件来感知外置存储的插入,通过广播传递的信息获取卷设备信息后可以对卷设备进行查询以及管理操作。 开发者通过订阅卷设备相关的广播事件来感知外置存储的插入,通过广播传递的信息获取卷设备信息后可以对卷设备进行查询以及管理操作。
...@@ -53,7 +52,6 @@ ...@@ -53,7 +52,6 @@
- 卷设备异常移除:"usual.event.data.VOLUME_BAD_REMOVAL" - 卷设备异常移除:"usual.event.data.VOLUME_BAD_REMOVAL"
- 卷设备正在弹出:"usual.event.data.VOLUME_EJECT" - 卷设备正在弹出:"usual.event.data.VOLUME_EJECT"
```ts ```ts
import CommonEvent from '@ohos.commonEventManager'; import CommonEvent from '@ohos.commonEventManager';
import volumeManager from '@ohos.file.volumeManager'; import volumeManager from '@ohos.file.volumeManager';
......
...@@ -35,7 +35,6 @@ ...@@ -35,7 +35,6 @@
}) })
``` ```
## 保存文档类文件 ## 保存文档类文件
1. 导入选择器模块。 1. 导入选择器模块。
...@@ -58,7 +57,6 @@ ...@@ -58,7 +57,6 @@
> >
> 目前DocumentSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。 > 目前DocumentSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。
```ts ```ts
const documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例 const documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例
documentViewPicker.save(documentSaveOptions) documentViewPicker.save(documentSaveOptions)
...@@ -71,7 +69,6 @@ ...@@ -71,7 +69,6 @@
}) })
``` ```
## 保存音频类文件 ## 保存音频类文件
1. 导入选择器模块。 1. 导入选择器模块。
...@@ -93,7 +90,6 @@ ...@@ -93,7 +90,6 @@
> >
> 目前AudioSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。 > 目前AudioSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。
```ts ```ts
const audioViewPicker = new picker.AudioViewPicker(); const audioViewPicker = new picker.AudioViewPicker();
audioViewPicker.save(audioSaveOptions) audioViewPicker.save(audioSaveOptions)
......
...@@ -2,10 +2,8 @@ ...@@ -2,10 +2,8 @@
终端用户有时需要分享、保存一些图片、视频等用户文件,开发者需要在应用中支持此类使用场景。此时,开发者可以使用OpenHarmony系统预置的[文件选择器(FilePicker)](../reference/apis/js-apis-file-picker.md),实现用户文件选择及保存能力。 终端用户有时需要分享、保存一些图片、视频等用户文件,开发者需要在应用中支持此类使用场景。此时,开发者可以使用OpenHarmony系统预置的[文件选择器(FilePicker)](../reference/apis/js-apis-file-picker.md),实现用户文件选择及保存能力。
根据用户文件的常见类型,文件选择器(FilePicker)分别提供以下接口: 根据用户文件的常见类型,文件选择器(FilePicker)分别提供以下接口:
- [PhotoViewPicker](../reference/apis/js-apis-file-picker.md#photoviewpicker):适用于图片或视频类文件的选择与保存。 - [PhotoViewPicker](../reference/apis/js-apis-file-picker.md#photoviewpicker):适用于图片或视频类文件的选择与保存。
- [DocumentViewPicker](../reference/apis/js-apis-file-picker.md#documentviewpicker):适用于文档类文件的选择与保存。 - [DocumentViewPicker](../reference/apis/js-apis-file-picker.md#documentviewpicker):适用于文档类文件的选择与保存。
...@@ -29,15 +27,14 @@ ...@@ -29,15 +27,14 @@
3. 选择媒体文件类型和选择媒体文件的最大数目。 3. 选择媒体文件类型和选择媒体文件的最大数目。
以下示例以图片选择为例,媒体文件类型请参见[PhotoViewMIMETypes](../reference/apis/js-apis-file-picker.md#photoviewmimetypes) 以下示例以图片选择为例,媒体文件类型请参见[PhotoViewMIMETypes](../reference/apis/js-apis-file-picker.md#photoviewmimetypes)
```ts ```ts
photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目 photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目
``` ```
4. 创建图库选择器实例,调用[select()](../reference/apis/js-apis-file-picker.md#select)接口拉起FilePicker界面进行文件选择。 4. 创建图库选择器实例,调用[select()](../reference/apis/js-apis-file-picker.md#select)接口拉起FilePicker界面进行文件选择。
文件选择成功后,返回[PhotoSelectResult](../reference/apis/js-apis-file-picker.md#photoselectresult)结果集,可以根据结果集中URI进行文件读取等操作。
文件选择成功后,返回[PhotoSelectResult](../reference/apis/js-apis-file-picker.md#photoselectresult)结果集,可以根据结果集中URI进行文件读取等操作。
```ts ```ts
const photoPicker = new picker.PhotoViewPicker(); const photoPicker = new picker.PhotoViewPicker();
...@@ -71,7 +68,6 @@ ...@@ -71,7 +68,6 @@
> >
> 目前DocumentSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。 > 目前DocumentSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。
```ts ```ts
const documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例 const documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例
documentViewPicker.select(documentSelectOptions) documentViewPicker.select(documentSelectOptions)
...@@ -99,14 +95,15 @@ ...@@ -99,14 +95,15 @@
``` ```
3. 创建音频选择器实例。调用[select()](../reference/apis/js-apis-file-picker.md#select-6)接口拉起FilePicker界面进行文件选择。 3. 创建音频选择器实例。调用[select()](../reference/apis/js-apis-file-picker.md#select-6)接口拉起FilePicker界面进行文件选择。
文件选择成功后,返回被选中音频的URI结果集。开发者可以根据结果集中URI做进一步的处理。 文件选择成功后,返回被选中音频的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不支持参数配置,默认可以选择所有类型的用户文件。 > 目前AudioSelectOptions不支持参数配置,默认可以选择所有类型的用户文件。
```ts ```ts
const audioViewPicker = new picker.AudioViewPicker(); const audioViewPicker = new picker.AudioViewPicker();
audioViewPicker.select(audioSelectOptions) audioViewPicker.select(audioSelectOptions)
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
不同设备本身的安全能力差异较大,一些小的嵌入式设备安全能力远弱于平板等设备类型。用户或者应用不同的文件数据有不同安全诉求,例如个人的健康信息和银行卡信息等不期望被弱设备读取。因此,OpenHarmony提供一套完整的数据分级、设备分级标准,并针对不同设备制定不同的数据流转策略,具体规则请参见[数据、设备安全分级](../database/access-control-by-device-and-data-level.md) 不同设备本身的安全能力差异较大,一些小的嵌入式设备安全能力远弱于平板等设备类型。用户或者应用不同的文件数据有不同安全诉求,例如个人的健康信息和银行卡信息等不期望被弱设备读取。因此,OpenHarmony提供一套完整的数据分级、设备分级标准,并针对不同设备制定不同的数据流转策略,具体规则请参见[数据、设备安全分级](../database/access-control-by-device-and-data-level.md)
## 接口说明 ## 接口说明
API详细介绍请参见[ohos.file.securityLabel](../reference/apis/js-apis-file-securityLabel.md) API详细介绍请参见[ohos.file.securityLabel](../reference/apis/js-apis-file-securityLabel.md)
...@@ -15,6 +14,7 @@ API详细介绍请参见[ohos.file.securityLabel](../reference/apis/js-apis-file ...@@ -15,6 +14,7 @@ API详细介绍请参见[ohos.file.securityLabel](../reference/apis/js-apis-file
| getSecurityLabel | 获取文件安全标签 | 方法 | √ | √ | | getSecurityLabel | 获取文件安全标签 | 方法 | √ | √ |
> **须知:** > **须知:**
>
> 1. 对于不满足安全等级的文件,跨设备仍然可以看到该文件,但是无权限打开访问该文件。 > 1. 对于不满足安全等级的文件,跨设备仍然可以看到该文件,但是无权限打开访问该文件。
> >
> 2. 分布式文件系统的数据等级默认为S3,应用可以主动设置文件的安全等级。 > 2. 分布式文件系统的数据等级默认为S3,应用可以主动设置文件的安全等级。
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
文件URI的格式为: 文件URI的格式为:
格式为file://&lt;bundleName&gt;/&lt;path&gt;/\#networkid=&lt;networkid&gt; 格式为file://&lt;bundleName&gt;/&lt;path&gt;/\#networkid=&lt;networkid&gt;
- file:文件URI的标志。 - file:文件URI的标志。
- bundleName:该文件资源的属主。 - bundleName:该文件资源的属主。
...@@ -118,7 +119,6 @@ ...@@ -118,7 +119,6 @@
通过接口want的参数获取分享文件的URI,获取文件URI后通过fs.open()接口打开文件,获取对应的file对象后,可对文件进行读写操作。 通过接口want的参数获取分享文件的URI,获取文件URI后通过fs.open()接口打开文件,获取对应的file对象后,可对文件进行读写操作。
```ts ```ts
// xxx.ets // xxx.ets
import fs from '@ohos.file.fs'; import fs from '@ohos.file.fs';
......
...@@ -19,7 +19,7 @@ export default class VoiceCallDemoForAudioRenderer { ...@@ -19,7 +19,7 @@ export default class VoiceCallDemoForAudioRenderer {
private renderModel = undefined; private renderModel = undefined;
private audioStreamInfo = { private audioStreamInfo = {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000, // 采样率 samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000, // 采样率
channels: audio.AudioChannel.CHANNEL_2, // 通道 channels: audio.AudioChannel.CHANNEL_2, // 通道
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式 sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式 encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
} }
...@@ -60,7 +60,7 @@ export default class VoiceCallDemoForAudioRenderer { ...@@ -60,7 +60,7 @@ export default class VoiceCallDemoForAudioRenderer {
// 开始一次音频渲染 // 开始一次音频渲染
async start() { async start() {
let stateGroup = [audio.AudioState.STATE_PREPARED, audio.AudioState.STATE_PAUSED, audio.AudioState.STATE_STOPPED]; 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'); console.error(TAG + 'start failed');
return; return;
} }
...@@ -91,7 +91,7 @@ export default class VoiceCallDemoForAudioRenderer { ...@@ -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); fs.close(file);
await this.renderModel.stop(); await this.renderModel.stop();
} }
...@@ -105,7 +105,7 @@ export default class VoiceCallDemoForAudioRenderer { ...@@ -105,7 +105,7 @@ export default class VoiceCallDemoForAudioRenderer {
} }
// 暂停渲染 // 暂停渲染
async pause() { async pause() {
// 只有渲染器状态为running的时候才能暂停 // 只有渲染器状态为STATE_RUNNING的时候才能暂停
if (this.renderModel.state !== audio.AudioState.STATE_RUNNING) { if (this.renderModel.state !== audio.AudioState.STATE_RUNNING) {
console.info('Renderer is not running'); console.info('Renderer is not running');
return; return;
...@@ -119,7 +119,7 @@ export default class VoiceCallDemoForAudioRenderer { ...@@ -119,7 +119,7 @@ export default class VoiceCallDemoForAudioRenderer {
} }
// 停止渲染 // 停止渲染
async stop() { async stop() {
// 只有渲染器状态为running或paused的时候才可以停止 // 只有渲染器状态为STATE_RUNNING或STATE_PAUSED的时候才可以停止
if (this.renderModel.state !== audio.AudioState.STATE_RUNNING && this.renderModel.state !== audio.AudioState.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.'); console.info('Renderer is not running or paused.');
return; return;
...@@ -133,7 +133,7 @@ export default class VoiceCallDemoForAudioRenderer { ...@@ -133,7 +133,7 @@ export default class VoiceCallDemoForAudioRenderer {
} }
// 销毁实例,释放资源 // 销毁实例,释放资源
async release() { async release() {
// 渲染器状态不是released状态,才能release // 渲染器状态不是STATE_RELEASED状态,才能release
if (this.renderModel.state === audio.AudioState.STATE_RELEASED) { if (this.renderModel.state === audio.AudioState.STATE_RELEASED) {
console.info('Renderer already released'); console.info('Renderer already released');
return; return;
...@@ -161,7 +161,7 @@ export default class VoiceCallDemoForAudioCapturer { ...@@ -161,7 +161,7 @@ export default class VoiceCallDemoForAudioCapturer {
private audioCapturer = undefined; private audioCapturer = undefined;
private audioStreamInfo = { private audioStreamInfo = {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100, // 采样率 samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_44100, // 采样率
channels: audio.AudioChannel.CHANNEL_1, // 通道 channels: audio.AudioChannel.CHANNEL_1, // 通道
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式 sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式 encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
} }
...@@ -198,7 +198,7 @@ export default class VoiceCallDemoForAudioCapturer { ...@@ -198,7 +198,7 @@ export default class VoiceCallDemoForAudioCapturer {
// 开始一次音频采集 // 开始一次音频采集
async start() { async start() {
let stateGroup = [audio.AudioState.STATE_PREPARED, audio.AudioState.STATE_PAUSED, audio.AudioState.STATE_STOPPED]; 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`); console.error(`${TAG}: start failed`);
return; return;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册