提交 4cd6c0d2 编写于 作者: Z zengyawen

Merge branch 'master' of https://gitee.com/zengyawen/docs

...@@ -96,8 +96,10 @@ Thread name:crasher <- 异常线程名 ...@@ -96,8 +96,10 @@ Thread name:crasher <- 异常线程名
使用addr2line工具根据偏移地址解析行号: 使用addr2line工具根据偏移地址解析行号:
[product name]为具体设备名。
``` ```
root:~/OpenHarmony/out/rk3568/exe.unstripped/hiviewdfx/faultloggerd$ addr2line -e crasher 0000332c root:~/OpenHarmony/out/[product name]/exe.unstripped/hiviewdfx/faultloggerd$ addr2line -e crasher 0000332c
base/hiviewdfx/faultloggerd/tools/crasher/dfx_crasher.c:57 base/hiviewdfx/faultloggerd/tools/crasher/dfx_crasher.c:57
``` ```
......
...@@ -58,8 +58,6 @@ DevEco Studio的基本使用,请参考[DevEco Studio使用指南](../../quick- ...@@ -58,8 +58,6 @@ DevEco Studio的基本使用,请参考[DevEco Studio使用指南](../../quick-
> **说明:** > **说明:**
> - 在一个工程中同一个设备类型只支持一个Entry类型的模块。 > - 在一个工程中同一个设备类型只支持一个Entry类型的模块。
> >
> - 当前的DevEco Studio(3.1.1 Release)在创建工程时,设备类型仅能选择phone和tablet,默认该模块已经选择了entry类型,那么在创建wearable这个模块,只能选择feature类型。
>
> - 在下一个小节,我们将介绍如何修改Module的配置,包括Module的类型以及其支持的设备类型等。 > - 在下一个小节,我们将介绍如何修改Module的配置,包括Module的类型以及其支持的设备类型等。
...@@ -115,7 +113,7 @@ DevEco Studio的基本使用,请参考[DevEco Studio使用指南](../../quick- ...@@ -115,7 +113,7 @@ DevEco Studio的基本使用,请参考[DevEco Studio使用指南](../../quick-
同样的,修改feature1和feature2模块中的oh-package.json文件,使其可以使用common模块中的代码。 同样的,修改feature1和feature2模块中的oh-package.json文件,使其可以使用common模块中的代码。
修改oh-package.json文件后,一定要点击右上角的“Sync Now”,否则改动不会生效! 修改oh-package.json文件后,请点击右上角的“Sync Now”,否则改动不会生效。
## 引用ohpm包中的代码 ## 引用ohpm包中的代码
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
- [开发音频通话功能](audio-call-development.md) - [开发音频通话功能](audio-call-development.md)
- [视频播放](video-playback.md) - [视频播放](video-playback.md)
- [视频录制](video-recording.md) - [视频录制](video-recording.md)
- [屏幕录制](avscreen-capture.md)
- 音视频编解码 - 音视频编解码
- [获取支持的编解码能力](obtain-supported-codecs.md) - [获取支持的编解码能力](obtain-supported-codecs.md)
- [音频编码](audio-encoding.md) - [音频编码](audio-encoding.md)
......
# 屏幕录制
屏幕录制主要为主屏幕录屏功能。
开发者可以调用录屏(AVScreenCapture)模块的Native API接口,完成屏幕录制,采集设备内、麦克风等的音视频源数据。当开发直播、办公等应用时,可以调用录屏模块获取音视频原始码流,然后通过流的方式流转到其他模块处理,达成直播时共享桌面的场景。
录屏模块和窗口(Window)、图形(Graphic)等模块完成整个视频采集的流程。
当前在进行屏幕录制时默认使用主屏,图形默认根据主屏生产录屏帧数据到显示数据缓冲队列,录屏框架从显示数据缓冲队列获取数据进行相应消费处理。
## 开发指导
使用AVScreenCapture录制屏幕涉及到AVScreenCapture实例的创建、音视频采集参数的配置、采集的开始与停止、资源的释放等。本开发指导将以一次录制屏幕数据的过程为例,向开发者讲解如何使用AVScreenCapturer进行屏幕录制,详细的API声明请参考[AVScreenCapture API参考](../reference/native-apis/_a_v_screen_capture.md)
使用AVScreenCapture时要明确其状态的变化,在创建实例后,调用对应的方法可以进入指定的状态实现对应的行为。
在确定的状态下执行不合适的方法会导致AVScreenCapture发生错误,开发者需要在调用状态转换的方法前进行状态检查,避免程序运行异常。
### 权限说明
在开发前,请根据应用实际需求,参考[访问控制授权申请指导](../security/accesstoken-guidelines.md)申请以下权限:
| 权限名 | 说明 | 授权方式 | 权限级别 |
| ------ | ----- | --------| ------- |
| ohos.permission.CAPTURE_SCREEN | 允许应用截取屏幕图像。| system_grant | system_core |
| ohos.permission.MICROPHONE | 允许应用使用麦克风(可选)。
如需录制麦克风源的音频,需要申请该权限。| user_grant | normal |
### 开发步骤及注意事项
开发者可以通过以下几个步骤来实现一个简单的屏幕录制功能。
1. 创建AVScreenCapture实例capture。
```c++
OH_AVScreenCapture* capture = AVScreenCapture_Create();
```
2. 配置屏幕录制参数。
创建AVScreenCapture实例capture后,可以设置屏幕录制所需要的参数。
```c++
OH_AudioCaptureInfo miccapinfo = {
.audioSampleRate = 16000,
.audioChannels = 2,
.audioSource = OH_MIC
};
OH_VideoCaptureInfo videocapinfo = {
.videoFrameWidth = display->GetWidth(),
.videoFrameHeight = display->Height(),
.videoSource = OH_VIDEO_SOURCE_SURFACE_RGBA
};
OH_AudioInfo audioinfo = {
.micCapInfo = miccapinfo,
};
OH_VideoInfo videoinfo = {
.videoCapInfo = videocapinfo
};
OH_RecorderInfo recorderinfo = {
.url = name
};
OH_AVScreenCaptureConfig config = {
.captureMode = OH_CAPTURE_HOME_SCREEN,
.dataType = OH_ORIGINAL_STREAM,
.audioInfo = audioinfo,
.videoInfo = videoinfo,
.recorderInfo = recorderinfo
};
OH_AVScreenCapture_Init(capture, config);
```
3. 设置麦克风开关。
```c++
bool isMic = true;
OH_AVScreenCapture_SetMicrophoneEnabled(capture, isMic);
```
4. 回调函数的设置,主要监听录屏过程中的错误事件的发生,音频流和视频流数据的产生事件。
```c++
OH_AVScreenCaptureCallback callback;
callback.onAudioBufferAvailable = OnAudioBufferAvailable;
callback.onVideoBufferAvailable = OnVideoBufferAvailable;
OH_AVScreenCapture_SetCallback(capture, callback);
```
5. 调用StartScreenCapture方法开始进行屏幕录制。
```c++
OH_AVScreenCapture_StartScreenCapture(capture);
```
6. 调用StopScreenCapture()方法停止录制。
```c++
OH_AVScreenCapture_StopScreenCapture(capture_);
```
7. 调用AcquireAudioBuffer()获取音频原始码流数据
```c++
OH_AVScreenCapture_AcquireAudioBuffer(capture, &audiobuffer, type);
```
8. 调用AcquireVideoBuffer()获取音频原始码流数据。
```c++
OH_NativeBuffer* buffer = OH_ScreenCapture_AcquireVideoBuffer(capture, &fence, &timestamp, &damage);
```
9. 调用ReleaseAudioBuffer方法释放音频buffer。
```c++
OH_ScreenCapture_ReleaseAudioBuffer(capture, type);
```
10. 调用ReleaseVideoBuffer()释放视频数据。
```c++
OH_ScreenCapture_ReleaseVideoBuffer(capture);
```
11. 调用release()方法销毁实例,释放资源。
```c++
OH_AVScreenCapture_Release(capture);
```
### 完整示例
下面展示了使用AVScreenCapture屏幕录制的完整示例代码。
目前阶段流程结束后返回的buffer为原始码流,针对原始码流可以进行编码并以mp4等文件格式保存以供播放。编码格式与文件格式当前阶段仅作预留,待后续版本实现。
```c++
#include "multimedia/player_framework/native_avscreen_capture.h"
#include "multimedia/player_framework/native_avscreen_capture_base.h"
#include "multimedia/player_framework/native_avscreen_capture_errors.h"
void OnError(struct OH_AVScreenCapture *capture, int32_t errorCode)
{
(void) capture;
(void) errorCode;
}
void OnAudioBufferAvailable(struct OH_AVScreenCapture *capture, bool isReady, OH_AudioCapSourceType type)
{
if (isReady) {
OH_AudioBuffer *audiobuffer = (struct OH_AudioBuffer*) malloc (sizeof(OH_AudioBuffer));
//获取音频流
int32_t ret = OH_AVScreenCapture_AcquireAudioBuffer(capture, &audiobuffer, type);
/* get buffer */
(void)audiobuffer->buf;
/* getbuffer size */
(void)audiobuffer->size;
/* get audiobuffer timestampe */
(void)audiobuffer->timestamp;
free(audiobuffer);
audiobuffer = nullptr;
//释放音频流
int32_t ret = OH_ScreenCapture_ReleaseAudioBuffer(capture, type);
}
}
void OnVideoBufferAvailable(struct OH_ScreenCapture *capture, bool isReady)
{
if (isReady) {
int32_t fence = 0;
int64_t timestamp = 0;
struct OH_Rect damage;
//获取视频流
OH_NativeBuffer* buffer = OH_ScreenCapture_AcquireVideoBuffer(capture, &fence, &timestamp, &damage);
void *virAddr = nullptr;
OH_NativeBuffer_Map(buffer, &virAddr); //获取buffer
OH_NativeBuffer_Config config;
OH_NativeBuffer_GetNativeBufferConfig(buffer, config); //获取config信息 宽,高,format
// fence, timestampe, damage 获取fence,时间戳,坐标信息
OH_NativeBuffer_UnMap(buffer); //释放buffer
//释放视频流
int32_t ret = OH_ScreenCapture_ReleaseVideoBuffer(capture);
}
}
int main()
{
//实例化ScreenCapture
struct OH_AVScreenCapture* capture = OH_AVScreenCapture_Create(void);
//设置回调
struct OH_AVScreenCaptureCallback callback;
callback.onError = OnError;
callack.onAudioBufferAvailable = OnAudioBufferAvailable ;
callack.onVideoBufferAvailable = OnVideoBufferAvailable;
int32_t ret = OH_AVScreenCapture_SetCallback(capture, callback);
//初始化录屏,传入配置信息OH_AVScreenRecorderConfig
OH_AudioCaptureInfo miccapinfo = {
.audioSampleRate = 16000,
.audioChannels = 2,
.audioSource = OH_MIC
};
OH_VideoCaptureInfo videocapinfo = {
.videoFrameWidth = 720,
.videoFrameHeight = 1280,
.videoSource = OH_VIDEO_SOURCE_SURFACE_RGBA
};
OH_AudioInfo audioinfo = {
.micCapInfo = miccapinfo,
};
OH_VideoInfo videoinfo = {
.videoCapInfo = videocapinfo
};
OH_AVScreenCaptureConfig config = {
.captureMode = OH_CAPTURE_HOME_SCREEN,
.dataType = OH_ORIGINAL_STREAM,
.audioInfo = audioinfo,
.videoInfo = videoinfo,
.recorderInfo = recorderinfo
};
OH_AVScreenCapture_Init(capture, config);
int32_t ret = OH_AVScreenCapture_Init(capture, &config);
//开始录屏
int32_t ret = OH_AVScreenCapture_StartScreenCapture(capture);
//mic开关设置
int32_t ret = OH_ScreenCapture_SetMicrophoneEnable(capture, true);
sleep(10); //录制10s
//结束录屏
int32_t ret = OH_ScreenCapture_StopScreenCapture(capture);
//释放ScreenCapture
int32_t ret = OH_ScreenCapture_Realease(capture);
return 0;
}
```
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
} }
``` ```
2. 通过CameraOutputCapability类中的previewProfiles()方法获取当前设备支持的预览能力,返回previewProfilesArray数组 。通过createPreviewOutput()方法创建预览输出流,其中,createPreviewOutput()方法中的两个参数分别是previewProfilesArray数组中的第一项和步骤一中获取的surfaceId。 2. 通过CameraOutputCapability类中的previewProfiles()方法获取当前设备支持的预览能力,返回previewProfilesArray数组 。通过createPreviewOutput()方法创建预览输出流,其中,createPreviewOutput()方法中的两个参数分别是previewProfilesArray数组中的第一项和步骤一中获取的surfaceId。
```ts ```ts
let previewProfilesArray = cameraOutputCapability.previewProfiles; let previewProfilesArray = cameraOutputCapability.previewProfiles;
......
...@@ -89,9 +89,11 @@ setBackgroundAllowed(isAllowed: boolean): Promise\<void> ...@@ -89,9 +89,11 @@ setBackgroundAllowed(isAllowed: boolean): Promise\<void>
**示例:** **示例:**
```js ```js
policy.setBackgroundAllowed(true).then(function (error) { policy.setBackgroundAllowed(true).then(() => {
console.log(JSON.stringify(error)) console.log("setBackgroundAllowed success");
}) }).catch(error => {
console.log(JSON.stringify(error));
});
``` ```
## policy.isBackgroundAllowed<sup>10+</sup> ## policy.isBackgroundAllowed<sup>10+</sup>
...@@ -164,10 +166,11 @@ isBackgroundAllowed(): Promise\<boolean>; ...@@ -164,10 +166,11 @@ isBackgroundAllowed(): Promise\<boolean>;
**示例:** **示例:**
```js ```js
policy.isBackgroundAllowed().then(function (error, data) { policy.isBackgroundAllowed().then((data) => {
console.log(JSON.stringify(error)) console.log(JSON.stringify(data));
console.log(JSON.stringify(data)) }).catch(error => {
}) console.log(JSON.stringify(error));
});
``` ```
## policy.setPolicyByUid<sup>10+</sup> ## policy.setPolicyByUid<sup>10+</sup>
...@@ -248,9 +251,11 @@ setPolicyByUid(uid: number, policy: NetUidPolicy): Promise\<void>; ...@@ -248,9 +251,11 @@ setPolicyByUid(uid: number, policy: NetUidPolicy): Promise\<void>;
**示例:** **示例:**
```js ```js
policy.setPolicyByUid(11111, policy.NetUidPolicy.NET_POLICY_NONE).then(function (error) { policy.setPolicyByUid(11111, policy.NetUidPolicy.NET_POLICY_NONE).then(() => {
console.log(JSON.stringify(error)) console.log("setPolicyByUid success");
}) }).catch(error => {
console.log(JSON.stringify(error));
});
``` ```
## policy.getPolicyByUid<sup>10+</sup> ## policy.getPolicyByUid<sup>10+</sup>
...@@ -329,10 +334,11 @@ getPolicyByUid(uid: number): Promise\<NetUidPolicy>; ...@@ -329,10 +334,11 @@ getPolicyByUid(uid: number): Promise\<NetUidPolicy>;
**示例:** **示例:**
```js ```js
policy.getPolicyByUid(11111).then(function (error, data) { policy.getPolicyByUid(11111).then((data) => {
console.log(JSON.stringify(error)) console.log(JSON.stringify(data));
console.log(JSON.stringify(data)) }).catch(error => {
}) console.log(JSON.stringify(error));
});
``` ```
## policy.getUidsByPolicy<sup>10+</sup> ## policy.getUidsByPolicy<sup>10+</sup>
...@@ -412,10 +418,11 @@ getUidsByPolicy(policy: NetUidPolicy): Promise\<Array\<number>>; ...@@ -412,10 +418,11 @@ getUidsByPolicy(policy: NetUidPolicy): Promise\<Array\<number>>;
**示例:** **示例:**
```js ```js
policy.getUidsByPolicy(11111).then(function (error, data) { policy.getUidsByPolicy(11111).then((data) => {
console.log(JSON.stringify(error)) console.log(JSON.stringify(data));
console.log(JSON.stringify(data)) }).catch(error => {
}) console.log(JSON.stringify(error));
});
``` ```
## policy.getNetQuotaPolicies<sup>10+</sup> ## policy.getNetQuotaPolicies<sup>10+</sup>
...@@ -487,11 +494,11 @@ getNetQuotaPolicies(): Promise\<Array\<NetQuotaPolicy>>; ...@@ -487,11 +494,11 @@ getNetQuotaPolicies(): Promise\<Array\<NetQuotaPolicy>>;
**示例:** **示例:**
```js ```js
policy.getNetQuotaPolicies().then(function (error, data) { policy.getNetQuotaPolicies().then((data) => {
console.log(JSON.stringify(error)) console.log(JSON.stringify(data));
console.log(JSON.stringify(data)) }).catch(error => {
}) console.log(JSON.stringify(error));
});
``` ```
## policy.setNetQuotaPolicies<sup>10+</sup> ## policy.setNetQuotaPolicies<sup>10+</sup>
...@@ -608,9 +615,11 @@ let netquotapolicy = { ...@@ -608,9 +615,11 @@ let netquotapolicy = {
netQuotaPolicyList.push(netquotapolicy); netQuotaPolicyList.push(netquotapolicy);
policy.setNetQuotaPolicies(netQuotaPolicyList).then(function (error) { policy.setNetQuotaPolicies(netQuotaPolicyList).then(() => {
console.log(JSON.stringify(error)) console.log("setNetQuotaPolicies success");
}) }).catch(error => {
console.log(JSON.stringify(error));
});
``` ```
## policy.isUidNetAllowed<sup>10+</sup> ## policy.isUidNetAllowed<sup>10+</sup>
...@@ -692,10 +701,11 @@ isUidNetAllowed(uid: number, isMetered: boolean): Promise\<boolean>; ...@@ -692,10 +701,11 @@ isUidNetAllowed(uid: number, isMetered: boolean): Promise\<boolean>;
**示例:** **示例:**
```js ```js
policy.isUidNetAllowed(11111, true).then(function (error, data) { policy.isUidNetAllowed(11111, true).then((data) => {
console.log(JSON.stringify(error)) console.log(JSON.stringify(data));
console.log(JSON.stringify(data)) }).catch(error => {
}) console.log(JSON.stringify(error));
});
``` ```
## policy.isUidNetAllowed<sup>10+</sup> ## policy.isUidNetAllowed<sup>10+</sup>
...@@ -777,10 +787,11 @@ isUidNetAllowed(uid: number, iface: string): Promise\<boolean>; ...@@ -777,10 +787,11 @@ isUidNetAllowed(uid: number, iface: string): Promise\<boolean>;
**示例:** **示例:**
```js ```js
policy.isUidNetAllowed(11111, 'wlan0').then(function (error, data) { policy.isUidNetAllowed(11111, 'wlan0').then((data) => {
console.log(JSON.stringify(error)) console.log(JSON.stringify(data));
console.log(JSON.stringify(data)) }).catch(error => {
}) console.log(JSON.stringify(error));
});
``` ```
## policy.setDeviceIdleTrustlist<sup>10+</sup> ## policy.setDeviceIdleTrustlist<sup>10+</sup>
...@@ -861,9 +872,11 @@ setDeviceIdleTrustlist(uids: Array\<number>, isAllowed: boolean): Promise\<void> ...@@ -861,9 +872,11 @@ setDeviceIdleTrustlist(uids: Array\<number>, isAllowed: boolean): Promise\<void>
**示例:** **示例:**
```js ```js
policy.setDeviceIdleTrustlist([11111,22222], true).then(function (error) { policy.setDeviceIdleTrustlist([11111,22222], true).then(() => {
console.log(JSON.stringify(error)) console.log("setDeviceIdleTrustlist success");
}) }).catch(error => {
console.log(JSON.stringify(error));
});
``` ```
## policy.getDeviceIdleTrustlist<sup>10+</sup> ## policy.getDeviceIdleTrustlist<sup>10+</sup>
...@@ -934,10 +947,11 @@ getDeviceIdleTrustlist(): Promise\<Array\<number>>; ...@@ -934,10 +947,11 @@ getDeviceIdleTrustlist(): Promise\<Array\<number>>;
**示例:** **示例:**
```js ```js
policy.getDeviceIdleTrustlist().then(function (error, data) { policy.getDeviceIdleTrustlist().then((data) => {
console.log(JSON.stringify(error)) console.log(JSON.stringify(data));
console.log(JSON.stringify(data)) }).catch(error => {
}) console.log(JSON.stringify(error));
});
``` ```
## policy.getBackgroundPolicyByUid<sup>10+</sup> ## policy.getBackgroundPolicyByUid<sup>10+</sup>
...@@ -1017,10 +1031,11 @@ getBackgroundPolicyByUid(uid: number): Promise\<NetBackgroundPolicy>; ...@@ -1017,10 +1031,11 @@ getBackgroundPolicyByUid(uid: number): Promise\<NetBackgroundPolicy>;
**示例:** **示例:**
```js ```js
policy.getBackgroundPolicyByUid(11111).then(function (error, data) { policy.getBackgroundPolicyByUid(11111).then((data) => {
console.log(JSON.stringify(error)) console.log(JSON.stringify(data));
console.log(JSON.stringify(data)) }).catch(error => {
}) console.log(JSON.stringify(error));
});
``` ```
## policy.resetPolicies<sup>10+</sup> ## policy.resetPolicies<sup>10+</sup>
...@@ -1099,9 +1114,11 @@ resetPolicies(simId: string): Promise\<void>; ...@@ -1099,9 +1114,11 @@ resetPolicies(simId: string): Promise\<void>;
**示例:** **示例:**
```js ```js
policy.resetPolicies('1').then(function (error) { policy.resetPolicies('1').then(() => {
console.log(JSON.stringify(error)) console.log("resetPolicies success");
}) }).catch(error => {
console.log(JSON.stringify(error));
});
``` ```
## policy.updateRemindPolicy<sup>10+</sup> ## policy.updateRemindPolicy<sup>10+</sup>
...@@ -1186,9 +1203,11 @@ updateRemindPolicy(netType: NetBearType, simId: string, remindType: RemindType): ...@@ -1186,9 +1203,11 @@ updateRemindPolicy(netType: NetBearType, simId: string, remindType: RemindType):
```js ```js
import connection from '@ohos.net.connection'; import connection from '@ohos.net.connection';
policy.updateRemindPolicy(connection.NetBearType.BEARER_CELLULAR, '1', policy.RemindType.REMIND_TYPE_WARNING).then(function (error) { policy.updateRemindPolicy(connection.NetBearType.BEARER_CELLULAR, '1', policy.RemindType.REMIND_TYPE_WARNING).then(() => {
console.log(JSON.stringify(error)) console.log("updateRemindPolicy success");
}) }).catch(error => {
console.log(JSON.stringify(error));
});
``` ```
## policy.setPowerSaveTrustlist<sup>10+</sup> ## policy.setPowerSaveTrustlist<sup>10+</sup>
...@@ -1269,9 +1288,11 @@ setPowerSaveTrustlist(uids: Array\<number>, isAllowed: boolean): Promise\<void>; ...@@ -1269,9 +1288,11 @@ setPowerSaveTrustlist(uids: Array\<number>, isAllowed: boolean): Promise\<void>;
**示例:** **示例:**
```js ```js
policy.setPowerSaveTrustlist([11111,22222], true).then(function (error) { policy.setPowerSaveTrustlist([11111,22222], true).then(() => {
console.log(JSON.stringify(error)) console.log("setPowerSaveTrustlist success");
}) }).catch(error => {
console.log(JSON.stringify(error));
});
``` ```
## policy.getPowerSaveTrustlist<sup>10+</sup> ## policy.getPowerSaveTrustlist<sup>10+</sup>
...@@ -1343,10 +1364,11 @@ getPowerSaveTrustlist(): Promise\<Array\<number>>; ...@@ -1343,10 +1364,11 @@ getPowerSaveTrustlist(): Promise\<Array\<number>>;
**示例:** **示例:**
```js ```js
policy.getPowerSaveTrustlist().then(function (error, data) { policy.getPowerSaveTrustlist().then((data) => {
console.log(JSON.stringify(error)) console.log(JSON.stringify(data));
console.log(JSON.stringify(data)) }).catch(error => {
}) console.log(JSON.stringify(error));
});
``` ```
## policy.on ## policy.on
......
...@@ -134,11 +134,11 @@ finishAnimation(callback?: () => void): void ...@@ -134,11 +134,11 @@ finishAnimation(callback?: () => void): void
| 参数名 | 参数类型 | 必填项 | 参数描述 | | 参数名 | 参数类型 | 必填项 | 参数描述 |
| ---------------- | ---------------------------------------- | ---- | ---------------------------------------- | | ---------------- | ---------------------------------------- | ---- | ---------------------------------------- |
| isShowBackground | boolean | 否 | 设置箭头底板是否显示。<br/>默认值:false | | showBackground | boolean | 否 | 设置箭头底板是否显示。<br/>默认值:false |
| isSidebarMiddle | boolean | 否 | 设置箭头显示位置。<br/>默认值:false <br/>默认显示在导航点指示器两侧。 | | isSidebarMiddle | boolean | 否 | 设置箭头显示位置。<br/>默认值:false <br/>默认显示在导航点指示器两侧。 |
| backgroundSize | [Length](ts-types.md#length) | 否 | 设置底板大小。<br/>在导航点两侧显示:<br/>默认值:24vp<br/>在组件两侧显示:<br/>默认值:32vp<br/>不支持设置百分比。 | | backgroundSize | [Length](ts-types.md#length) | 否 | 设置底板大小。<br/>在导航点两侧显示:<br/>默认值:24vp<br/>在组件两侧显示:<br/>默认值:32vp<br/>不支持设置百分比。 |
| backgroundColor | [ResourceColor](ts-types.md#resourcecolor) | 否 | 设置底板颜色。<br/>在导航点两侧显示:<br/>默认值:\#19182431<br/>在组件两侧显示:<br/>默认值:\#00000000 | | backgroundColor | [ResourceColor](ts-types.md#resourcecolor) | 否 | 设置底板颜色。<br/>在导航点两侧显示:<br/>默认值:\#19182431<br/>在组件两侧显示:<br/>默认值:\#00000000 |
| arrowSize | [Length](ts-types.md#length) | 否 | 设置箭头大小。<br/>在导航点两侧显示时:<br/>默认值:18vp<br/>在组件两侧显示时:<br/>默认值:24vp<br/>**说明:**<br/>isShowBackground为true时,arrowSize为backgroundSize的3/4。<br/>不支持设置百分比。 | | arrowSize | [Length](ts-types.md#length) | 否 | 设置箭头大小。<br/>在导航点两侧显示时:<br/>默认值:18vp<br/>在组件两侧显示时:<br/>默认值:24vp<br/>**说明:**<br/>showBackground为true时,arrowSize为backgroundSize的3/4。<br/>不支持设置百分比。 |
| arrowColor | [ResourceColor](ts-types.md#resourcecolor) | 否 | 设置箭头颜色。<br/>默认值:\#182431 | | arrowColor | [ResourceColor](ts-types.md#resourcecolor) | 否 | 设置箭头颜色。<br/>默认值:\#182431 |
## SwiperAutoFill<sup>10+</sup> ## SwiperAutoFill<sup>10+</sup>
...@@ -219,7 +219,7 @@ struct SwiperExample { ...@@ -219,7 +219,7 @@ struct SwiperExample {
.duration(1000) .duration(1000)
.itemSpace(0) .itemSpace(0)
.displayArrow({ .displayArrow({
isShowBackground:true, showBackground:true,
isSidebarMiddle:true, isSidebarMiddle:true,
backgroundSize:24, backgroundSize:24,
backgroundColor:Color.White, backgroundColor:Color.White,
......
...@@ -2686,7 +2686,7 @@ ...@@ -2686,7 +2686,7 @@
## ohos.permission.MANAGE_DEVICE_AUTH_CRED ## ohos.permission.MANAGE_DEVICE_AUTH_CRED
允许应用调用设备认证华为帐号凭据管理应用接口。 允许应用调用设备认证分布式帐号凭据管理应用接口。
**权限级别**:system_basic **权限级别**:system_basic
......
...@@ -33,10 +33,10 @@ ...@@ -33,10 +33,10 @@
| 名称 | 类型 | 必填 | 说明 | | 名称 | 类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- | | -------- | -------- | -------- | -------- |
| resourceTypes | number | 是 | 申请的资源类型 | | resourceTypes | number | 是 | 申请的资源类型 |
| isApply | boolean | 是 | 申请或释放资源<br/>- ture表示申请资源<br/>- false表示释放部分资源 | | isApply | boolean | 是 | 申请或释放资源<br/>- true表示申请资源<br/>- false表示释放部分资源 |
| timeOut | number | 是 | 资源使用时间(ms) | | timeOut | number | 是 | 资源使用时间(ms) |
| isPersist | boolean | 否 | 是否为永久持有资源,默认为false<br/>- ture表示永久持有<br/>- false表示有限时间内持有 | | isPersist | boolean | 否 | 是否为永久持有资源,默认为false<br/>- true表示永久持有<br/>- false表示有限时间内持有 |
| isProcess | boolean | 否 | 进程或应用申请,默认为false<br/>- ture表示进程申请<br/>- false表示应用申请 | | isProcess | boolean | 否 | 进程或应用申请,默认为false<br/>- true表示进程申请<br/>- false表示应用申请 |
| reason | string | 是 | 申请资源原因 | | reason | string | 是 | 申请资源原因 |
**表3** 能效资源类型 **表3** 能效资源类型
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
// 应用需要在后台保持活动状态,不被挂起。 // 应用需要在后台保持活动状态,不被挂起。
let request = { let request = {
resourceTypes: backgroundTaskManager.ResourceType.CPU, // 资源类型是CPU资源,保证应用进程不被挂起 resourceTypes: backgroundTaskManager.ResourceType.CPU, // 资源类型是CPU资源,保证应用进程不被挂起
isApply: true, // 释放资源 isApply: true, // 申请资源
timeOut: 0, // 超时时间,超过超时时间后资源自动释放 timeOut: 0, // 超时时间,超过超时时间后资源自动释放
reason: "apply", // 申请原因 reason: "apply", // 申请原因
isPersist: true, // 永久持有资源 isPersist: true, // 永久持有资源
......
...@@ -304,3 +304,11 @@ pluginComponentManager.request({ ...@@ -304,3 +304,11 @@ pluginComponentManager.request({
} }
) )
``` ```
## cl.arkui.4 FormComponent组件中的JS卡片禁用网络图片
FormComponent组件中的JS卡片禁止使用网络图片。
**变更影响**
影响FormComponent中JS卡片中网络图片的加载显示。变更前JS卡片支持网络图片加载,变更后JS卡片不支持网络图片的加载。变更后建议将所需的网络图片下载至内存后刷新。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册