diff --git a/zh-cn/application-dev/dfx/cppcrash-guidelines.md b/zh-cn/application-dev/dfx/cppcrash-guidelines.md index 33e34e3c0caee52f25231bf3e3aeeae40425686d..e4a18bdd91431ded5f42e4ca753e64ba1556b8ee 100644 --- a/zh-cn/application-dev/dfx/cppcrash-guidelines.md +++ b/zh-cn/application-dev/dfx/cppcrash-guidelines.md @@ -96,8 +96,10 @@ Thread name:crasher <- 异常线程名 使用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 ``` diff --git a/zh-cn/application-dev/key-features/multi-device-app-dev/ide-using.md b/zh-cn/application-dev/key-features/multi-device-app-dev/ide-using.md index 0d9e8cfe73c3b13cfd09f3611dc0faa569e4fdc6..7f7cf3786f62b95754f79d066dd083db0a893039 100644 --- a/zh-cn/application-dev/key-features/multi-device-app-dev/ide-using.md +++ b/zh-cn/application-dev/key-features/multi-device-app-dev/ide-using.md @@ -58,8 +58,6 @@ DevEco Studio的基本使用,请参考[DevEco Studio使用指南](../../quick- > **说明:** > - 在一个工程中同一个设备类型只支持一个Entry类型的模块。 > -> - 当前的DevEco Studio(3.1.1 Release)在创建工程时,设备类型仅能选择phone和tablet,默认该模块已经选择了entry类型,那么在创建wearable这个模块,只能选择feature类型。 -> > - 在下一个小节,我们将介绍如何修改Module的配置,包括Module的类型以及其支持的设备类型等。 @@ -115,7 +113,7 @@ DevEco Studio的基本使用,请参考[DevEco Studio使用指南](../../quick- 同样的,修改feature1和feature2模块中的oh-package.json文件,使其可以使用common模块中的代码。 -修改oh-package.json文件后,一定要点击右上角的“Sync Now”,否则改动不会生效! +修改oh-package.json文件后,请点击右上角的“Sync Now”,否则改动不会生效。 ## 引用ohpm包中的代码 diff --git a/zh-cn/application-dev/media/Readme-CN.md b/zh-cn/application-dev/media/Readme-CN.md index 5b3d92fad526aed9daaf7202ef0cc267e59f4d63..863a030c1944ff138d1e0ec10f5ea49bc1318c2e 100755 --- a/zh-cn/application-dev/media/Readme-CN.md +++ b/zh-cn/application-dev/media/Readme-CN.md @@ -31,6 +31,7 @@ - [开发音频通话功能](audio-call-development.md) - [视频播放](video-playback.md) - [视频录制](video-recording.md) + - [屏幕录制](avscreen-capture.md) - 音视频编解码 - [获取支持的编解码能力](obtain-supported-codecs.md) - [音频编码](audio-encoding.md) diff --git a/zh-cn/application-dev/media/avscreen-capture.md b/zh-cn/application-dev/media/avscreen-capture.md new file mode 100644 index 0000000000000000000000000000000000000000..b1614258308d05aeb6d5d0a957aa3fabaec6c071 --- /dev/null +++ b/zh-cn/application-dev/media/avscreen-capture.md @@ -0,0 +1,237 @@ +# 屏幕录制 + +屏幕录制主要为主屏幕录屏功能。 + +开发者可以调用录屏(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, ×tamp, &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, ×tamp, &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; +} +``` diff --git a/zh-cn/application-dev/media/camera-preview.md b/zh-cn/application-dev/media/camera-preview.md index ec2f45a39cc887d96551acbb6c33a65dfcb1c9e3..2836389c3b3db5ed27629f249bbf333e3ec7caaf 100644 --- a/zh-cn/application-dev/media/camera-preview.md +++ b/zh-cn/application-dev/media/camera-preview.md @@ -34,7 +34,7 @@ } ``` -2. 通过CameraOutputCapability类中的previewProfiles()方法获取当前设备支持的预览能力,返回previewProfilesArray数组 。通过createPreviewOutput()方法创建预览输出流,其中,createPreviewOutput()方法中的而两个参数分别是previewProfilesArray数组中的第一项和步骤一中获取的surfaceId。 +2. 通过CameraOutputCapability类中的previewProfiles()方法获取当前设备支持的预览能力,返回previewProfilesArray数组 。通过createPreviewOutput()方法创建预览输出流,其中,createPreviewOutput()方法中的两个参数分别是previewProfilesArray数组中的第一项和步骤一中获取的surfaceId。 ```ts let previewProfilesArray = cameraOutputCapability.previewProfiles; diff --git a/zh-cn/application-dev/reference/apis/js-apis-net-policy.md b/zh-cn/application-dev/reference/apis/js-apis-net-policy.md index 48ac1c115d1f77fcf6ad18a4e42dae9ea7ecf3fb..f39fb30dbc853ff3cd36a4639be7f52bab612c2a 100644 --- a/zh-cn/application-dev/reference/apis/js-apis-net-policy.md +++ b/zh-cn/application-dev/reference/apis/js-apis-net-policy.md @@ -89,9 +89,11 @@ setBackgroundAllowed(isAllowed: boolean): Promise\ **示例:** ```js -policy.setBackgroundAllowed(true).then(function (error) { - console.log(JSON.stringify(error)) -}) +policy.setBackgroundAllowed(true).then(() => { + console.log("setBackgroundAllowed success"); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.isBackgroundAllowed10+ @@ -164,10 +166,11 @@ isBackgroundAllowed(): Promise\; **示例:** ```js -policy.isBackgroundAllowed().then(function (error, data) { - console.log(JSON.stringify(error)) - console.log(JSON.stringify(data)) -}) +policy.isBackgroundAllowed().then((data) => { + console.log(JSON.stringify(data)); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.setPolicyByUid10+ @@ -248,9 +251,11 @@ setPolicyByUid(uid: number, policy: NetUidPolicy): Promise\; **示例:** ```js -policy.setPolicyByUid(11111, policy.NetUidPolicy.NET_POLICY_NONE).then(function (error) { - console.log(JSON.stringify(error)) -}) +policy.setPolicyByUid(11111, policy.NetUidPolicy.NET_POLICY_NONE).then(() => { + console.log("setPolicyByUid success"); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.getPolicyByUid10+ @@ -329,10 +334,11 @@ getPolicyByUid(uid: number): Promise\; **示例:** ```js -policy.getPolicyByUid(11111).then(function (error, data) { - console.log(JSON.stringify(error)) - console.log(JSON.stringify(data)) -}) +policy.getPolicyByUid(11111).then((data) => { + console.log(JSON.stringify(data)); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.getUidsByPolicy10+ @@ -412,10 +418,11 @@ getUidsByPolicy(policy: NetUidPolicy): Promise\>; **示例:** ```js -policy.getUidsByPolicy(11111).then(function (error, data) { - console.log(JSON.stringify(error)) - console.log(JSON.stringify(data)) -}) +policy.getUidsByPolicy(11111).then((data) => { + console.log(JSON.stringify(data)); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.getNetQuotaPolicies10+ @@ -487,11 +494,11 @@ getNetQuotaPolicies(): Promise\>; **示例:** ```js -policy.getNetQuotaPolicies().then(function (error, data) { - console.log(JSON.stringify(error)) - console.log(JSON.stringify(data)) -}) - +policy.getNetQuotaPolicies().then((data) => { + console.log(JSON.stringify(data)); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.setNetQuotaPolicies10+ @@ -608,9 +615,11 @@ let netquotapolicy = { netQuotaPolicyList.push(netquotapolicy); -policy.setNetQuotaPolicies(netQuotaPolicyList).then(function (error) { - console.log(JSON.stringify(error)) -}) +policy.setNetQuotaPolicies(netQuotaPolicyList).then(() => { + console.log("setNetQuotaPolicies success"); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.isUidNetAllowed10+ @@ -692,10 +701,11 @@ isUidNetAllowed(uid: number, isMetered: boolean): Promise\; **示例:** ```js -policy.isUidNetAllowed(11111, true).then(function (error, data) { - console.log(JSON.stringify(error)) - console.log(JSON.stringify(data)) -}) +policy.isUidNetAllowed(11111, true).then((data) => { + console.log(JSON.stringify(data)); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.isUidNetAllowed10+ @@ -777,10 +787,11 @@ isUidNetAllowed(uid: number, iface: string): Promise\; **示例:** ```js -policy.isUidNetAllowed(11111, 'wlan0').then(function (error, data) { - console.log(JSON.stringify(error)) - console.log(JSON.stringify(data)) -}) +policy.isUidNetAllowed(11111, 'wlan0').then((data) => { + console.log(JSON.stringify(data)); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.setDeviceIdleTrustlist10+ @@ -861,9 +872,11 @@ setDeviceIdleTrustlist(uids: Array\, isAllowed: boolean): Promise\ **示例:** ```js -policy.setDeviceIdleTrustlist([11111,22222], true).then(function (error) { - console.log(JSON.stringify(error)) -}) +policy.setDeviceIdleTrustlist([11111,22222], true).then(() => { + console.log("setDeviceIdleTrustlist success"); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.getDeviceIdleTrustlist10+ @@ -934,10 +947,11 @@ getDeviceIdleTrustlist(): Promise\>; **示例:** ```js -policy.getDeviceIdleTrustlist().then(function (error, data) { - console.log(JSON.stringify(error)) - console.log(JSON.stringify(data)) -}) +policy.getDeviceIdleTrustlist().then((data) => { + console.log(JSON.stringify(data)); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.getBackgroundPolicyByUid10+ @@ -1017,10 +1031,11 @@ getBackgroundPolicyByUid(uid: number): Promise\; **示例:** ```js -policy.getBackgroundPolicyByUid(11111).then(function (error, data) { - console.log(JSON.stringify(error)) - console.log(JSON.stringify(data)) -}) +policy.getBackgroundPolicyByUid(11111).then((data) => { + console.log(JSON.stringify(data)); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.resetPolicies10+ @@ -1099,9 +1114,11 @@ resetPolicies(simId: string): Promise\; **示例:** ```js -policy.resetPolicies('1').then(function (error) { - console.log(JSON.stringify(error)) -}) +policy.resetPolicies('1').then(() => { + console.log("resetPolicies success"); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.updateRemindPolicy10+ @@ -1186,9 +1203,11 @@ updateRemindPolicy(netType: NetBearType, simId: string, remindType: RemindType): ```js import connection from '@ohos.net.connection'; -policy.updateRemindPolicy(connection.NetBearType.BEARER_CELLULAR, '1', policy.RemindType.REMIND_TYPE_WARNING).then(function (error) { - console.log(JSON.stringify(error)) -}) +policy.updateRemindPolicy(connection.NetBearType.BEARER_CELLULAR, '1', policy.RemindType.REMIND_TYPE_WARNING).then(() => { + console.log("updateRemindPolicy success"); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.setPowerSaveTrustlist10+ @@ -1269,9 +1288,11 @@ setPowerSaveTrustlist(uids: Array\, isAllowed: boolean): Promise\; **示例:** ```js -policy.setPowerSaveTrustlist([11111,22222], true).then(function (error) { - console.log(JSON.stringify(error)) -}) +policy.setPowerSaveTrustlist([11111,22222], true).then(() => { + console.log("setPowerSaveTrustlist success"); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.getPowerSaveTrustlist10+ @@ -1343,10 +1364,11 @@ getPowerSaveTrustlist(): Promise\>; **示例:** ```js -policy.getPowerSaveTrustlist().then(function (error, data) { - console.log(JSON.stringify(error)) - console.log(JSON.stringify(data)) -}) +policy.getPowerSaveTrustlist().then((data) => { + console.log(JSON.stringify(data)); +}).catch(error => { + console.log(JSON.stringify(error)); +}); ``` ## policy.on diff --git a/zh-cn/application-dev/reference/arkui-ts/ts-container-swiper.md b/zh-cn/application-dev/reference/arkui-ts/ts-container-swiper.md index 3735108a93820e37f711e00e867a5bdbe7b00934..5db42c5d42ca0cb43e5b8f93735110f5f92980c9 100644 --- a/zh-cn/application-dev/reference/arkui-ts/ts-container-swiper.md +++ b/zh-cn/application-dev/reference/arkui-ts/ts-container-swiper.md @@ -134,11 +134,11 @@ finishAnimation(callback?: () => void): void | 参数名 | 参数类型 | 必填项 | 参数描述 | | ---------------- | ---------------------------------------- | ---- | ---------------------------------------- | -| isShowBackground | boolean | 否 | 设置箭头底板是否显示。
默认值:false | +| showBackground | boolean | 否 | 设置箭头底板是否显示。
默认值:false | | isSidebarMiddle | boolean | 否 | 设置箭头显示位置。
默认值:false
默认显示在导航点指示器两侧。 | | backgroundSize | [Length](ts-types.md#length) | 否 | 设置底板大小。
在导航点两侧显示:
默认值:24vp
在组件两侧显示:
默认值:32vp
不支持设置百分比。 | | backgroundColor | [ResourceColor](ts-types.md#resourcecolor) | 否 | 设置底板颜色。
在导航点两侧显示:
默认值:\#19182431
在组件两侧显示:
默认值:\#00000000 | -| arrowSize | [Length](ts-types.md#length) | 否 | 设置箭头大小。
在导航点两侧显示时:
默认值:18vp
在组件两侧显示时:
默认值:24vp
**说明:**
isShowBackground为true时,arrowSize为backgroundSize的3/4。
不支持设置百分比。 | +| arrowSize | [Length](ts-types.md#length) | 否 | 设置箭头大小。
在导航点两侧显示时:
默认值:18vp
在组件两侧显示时:
默认值:24vp
**说明:**
showBackground为true时,arrowSize为backgroundSize的3/4。
不支持设置百分比。 | | arrowColor | [ResourceColor](ts-types.md#resourcecolor) | 否 | 设置箭头颜色。
默认值:\#182431 | ## SwiperAutoFill10+ @@ -219,7 +219,7 @@ struct SwiperExample { .duration(1000) .itemSpace(0) .displayArrow({ - isShowBackground:true, + showBackground:true, isSidebarMiddle:true, backgroundSize:24, backgroundColor:Color.White, diff --git a/zh-cn/application-dev/security/permission-list.md b/zh-cn/application-dev/security/permission-list.md index 3af6ac1bbce8a2fad0989c3248de7f3f5c4797d2..f2f4b0d505ac3094625a6f4c89acd20f87fd0b14 100644 --- a/zh-cn/application-dev/security/permission-list.md +++ b/zh-cn/application-dev/security/permission-list.md @@ -2686,7 +2686,7 @@ ## ohos.permission.MANAGE_DEVICE_AUTH_CRED -允许应用调用设备认证华为帐号凭据管理应用接口。 +允许应用调用设备认证分布式帐号凭据管理应用接口。 **权限级别**:system_basic diff --git a/zh-cn/application-dev/task-management/efficiency-resource-request.md b/zh-cn/application-dev/task-management/efficiency-resource-request.md index 0f011ed531a754852126a54bff5c536ff471f35b..3dbdaf18646b9197ea4c7ed5b299ecff3404ada9 100644 --- a/zh-cn/application-dev/task-management/efficiency-resource-request.md +++ b/zh-cn/application-dev/task-management/efficiency-resource-request.md @@ -33,10 +33,10 @@ | 名称 | 类型 | 必填 | 说明 | | -------- | -------- | -------- | -------- | | resourceTypes | number | 是 | 申请的资源类型 | -| isApply | boolean | 是 | 申请或释放资源
- ture表示申请资源
- false表示释放部分资源 | +| isApply | boolean | 是 | 申请或释放资源
- true表示申请资源
- false表示释放部分资源 | | timeOut | number | 是 | 资源使用时间(ms) | -| isPersist | boolean | 否 | 是否为永久持有资源,默认为false
- ture表示永久持有
- false表示有限时间内持有 | -| isProcess | boolean | 否 | 进程或应用申请,默认为false
- ture表示进程申请
- false表示应用申请 | +| isPersist | boolean | 否 | 是否为永久持有资源,默认为false
- true表示永久持有
- false表示有限时间内持有 | +| isProcess | boolean | 否 | 进程或应用申请,默认为false
- true表示进程申请
- false表示应用申请 | | reason | string | 是 | 申请资源原因 | **表3** 能效资源类型 @@ -67,7 +67,7 @@ // 应用需要在后台保持活动状态,不被挂起。 let request = { resourceTypes: backgroundTaskManager.ResourceType.CPU, // 资源类型是CPU资源,保证应用进程不被挂起 - isApply: true, // 释放资源 + isApply: true, // 申请资源 timeOut: 0, // 超时时间,超过超时时间后资源自动释放 reason: "apply", // 申请原因 isPersist: true, // 永久持有资源 diff --git a/zh-cn/release-notes/changelogs/v3.2-Release/changelogs-arkui.md b/zh-cn/release-notes/changelogs/v3.2-Release/changelogs-arkui.md index 23d453b41ef6811d484f1c62796676f6a2f1013b..204cfef02cb9f9dc919f08e6379e91609e5d91a5 100644 --- a/zh-cn/release-notes/changelogs/v3.2-Release/changelogs-arkui.md +++ b/zh-cn/release-notes/changelogs/v3.2-Release/changelogs-arkui.md @@ -304,3 +304,11 @@ pluginComponentManager.request({ } ) ``` + +## cl.arkui.4 FormComponent组件中的JS卡片禁用网络图片 + +FormComponent组件中的JS卡片禁止使用网络图片。 + +**变更影响** + +影响FormComponent中JS卡片中网络图片的加载显示。变更前JS卡片支持网络图片加载,变更后JS卡片不支持网络图片的加载。变更后建议将所需的网络图片下载至内存后刷新。