@doubao-dev/plugin-app-dev 0.0.0-stage → 0.0.40-canary-dea0ddc73-20261026073950

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +10 -2
  2. package/dist/147.js +9 -0
  3. package/dist/assets.d.ts +5 -0
  4. package/dist/assets.js +4 -0
  5. package/dist/index.d.ts +43 -0
  6. package/dist/index.js +1378 -0
  7. package/dist/plugin.d.ts +102 -0
  8. package/dist/plugin.js +4995 -0
  9. package/dist/preview.js +16 -0
  10. package/dist/rslib-runtime.js +33 -0
  11. package/dist/skills/doubao-plugin-app/SKILL.md +21 -0
  12. package/dist/skills/doubao-plugin-app/references/app-development.md +85 -0
  13. package/dist/skills/doubao-plugin-app/references/frontend/components/container-overlay.md +131 -0
  14. package/dist/skills/doubao-plugin-app/references/frontend/components/form-controls.md +146 -0
  15. package/dist/skills/doubao-plugin-app/references/frontend/components/interactive-controls.md +120 -0
  16. package/dist/skills/doubao-plugin-app/references/frontend/components/map-canvas.md +107 -0
  17. package/dist/skills/doubao-plugin-app/references/frontend/components/overview.md +43 -0
  18. package/dist/skills/doubao-plugin-app/references/frontend/components/scroll-list.md +149 -0
  19. package/dist/skills/doubao-plugin-app/references/frontend/components/text-media.md +209 -0
  20. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/01-/345/237/272/347/241/200.md +1389 -0
  21. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/02-/347/263/273/347/273/237.md +1376 -0
  22. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/03-/350/207/252/345/256/232/344/271/211/351/200/232/344/277/241.md +127 -0
  23. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/04-/345/256/232/344/275/215.md +784 -0
  24. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/05-/345/255/230/345/202/250.md +1176 -0
  25. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/06-/350/267/257/347/224/261.md +839 -0
  26. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/07-/347/225/214/351/235/242.md +376 -0
  27. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/08-/344/272/244/344/272/222.md +1319 -0
  28. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/09-/350/276/223/345/205/245.md +192 -0
  29. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/10-/347/275/221/347/273/234.md +900 -0
  30. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/11-/345/252/222/344/275/223.md +1496 -0
  31. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/12-/344/270/232/345/212/241/350/203/275/345/212/233.md +1281 -0
  32. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/13-/347/231/273/345/275/225.md +511 -0
  33. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/14-/346/224/257/344/273/230.md +943 -0
  34. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/15-/346/225/260/346/215/256/345/210/206/346/236/220.md +124 -0
  35. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/16-/350/223/235/347/211/231.md +3364 -0
  36. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/17-wi-fi.md +1028 -0
  37. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/18-/345/212/240/351/200/237/345/272/246/350/256/241.md +354 -0
  38. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/19-ibeacon.md +508 -0
  39. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/20-/347/275/227/347/233/230.md +320 -0
  40. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/21-/350/256/276/345/244/207/346/226/271/345/220/221.md +351 -0
  41. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/22-/351/231/200/350/236/272/344/273/252.md +354 -0
  42. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/23-/345/252/222/344/275/223-/350/256/276/345/244/207-/347/275/221/347/273/234.md +264 -0
  43. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/24-/347/237/255/344/277/241.md +155 -0
  44. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/25-/346/227/240/351/232/234/347/242/215.md +144 -0
  45. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/26-/345/237/272/347/241/200/344/277/241/346/201/257.md +238 -0
  46. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/27-/347/224/265/346/261/240.md +235 -0
  47. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/28-/345/211/252/350/264/264/346/235/277.md +303 -0
  48. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/29-/345/212/240/345/257/206.md +126 -0
  49. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/30-/346/227/245/345/216/206.md +417 -0
  50. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/31-/347/224/265/350/257/235.md +144 -0
  51. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/32-/346/211/253/347/240/201.md +236 -0
  52. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/33-/345/261/217/345/271/225.md +747 -0
  53. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/34-/351/234/207/345/212/250.md +277 -0
  54. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/35-/346/226/207/344/273/266/347/263/273/347/273/237.md +431 -0
  55. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/common-errors.md +69 -0
  56. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/groups.md +43 -0
  57. package/dist/skills/doubao-plugin-app/references/frontend/doubao-agentic-service-api/quick-reference.md +436 -0
  58. package/dist/skills/doubao-plugin-app/references/frontend/examples/common-patterns.md +590 -0
  59. package/dist/skills/doubao-plugin-app/references/frontend/examples/doubao-agentic-service-api-recipes.md +209 -0
  60. package/dist/skills/doubao-plugin-app/references/frontend/examples/page-widget-basics.md +368 -0
  61. package/dist/skills/doubao-plugin-app/references/frontend/examples/page-widget-recipes.md +65 -0
  62. package/dist/skills/doubao-plugin-app/references/frontend/framework/core.md +283 -0
  63. package/dist/skills/doubao-plugin-app/references/frontend/guides/auth.md +277 -0
  64. package/dist/skills/doubao-plugin-app/references/frontend/guides/best-practices.md +574 -0
  65. package/dist/skills/doubao-plugin-app/references/frontend/guides/client-tools-and-events.md +209 -0
  66. package/dist/skills/doubao-plugin-app/references/frontend/guides/component-development.md +832 -0
  67. package/dist/skills/doubao-plugin-app/references/frontend/guides/debugger-mcp.md +537 -0
  68. package/dist/skills/doubao-plugin-app/references/frontend/guides/expired-widget.md +101 -0
  69. package/dist/skills/doubao-plugin-app/references/frontend/guides/performance-optimization.md +417 -0
  70. package/dist/skills/doubao-plugin-app/references/frontend/guides/troubleshooting.md +278 -0
  71. package/dist/skills/doubao-plugin-app/references/frontend/lynx/best-practices.md +720 -0
  72. package/dist/skills/doubao-plugin-app/references/frontend/lynx/css/pseudo-classes.md +149 -0
  73. package/dist/skills/doubao-plugin-app/references/frontend/lynx/css/selectors.md +224 -0
  74. package/dist/skills/doubao-plugin-app/references/frontend/lynx/css/supported-properties.md +269 -0
  75. package/dist/skills/doubao-plugin-app/references/frontend/lynx/css/values-and-units.md +314 -0
  76. package/dist/skills/doubao-plugin-app/references/frontend/lynx/layout/flex-layout.md +334 -0
  77. package/dist/skills/doubao-plugin-app/references/frontend/lynx/layout/grid-layout.md +408 -0
  78. package/dist/skills/doubao-plugin-app/references/frontend/lynx/layout/linear-layout.md +355 -0
  79. package/dist/skills/doubao-plugin-app/references/frontend/lynx/layout/relative-layout.md +189 -0
  80. package/dist/skills/doubao-plugin-app/references/frontend/lynx/lynx-vs-web/css-differences.md +737 -0
  81. package/dist/skills/doubao-plugin-app/references/frontend/lynx/lynx-vs-web/migration-guide.md +669 -0
  82. package/dist/skills/doubao-plugin-app/references/frontend/lynx/lynx-vs-web/unsupported-features.md +290 -0
  83. package/dist/skills/doubao-plugin-app/references/frontend/lynx/overview.md +60 -0
  84. package/dist/skills/doubao-plugin-app/references/frontend/lynx/patterns/animation.md +243 -0
  85. package/dist/skills/doubao-plugin-app/references/frontend/lynx/patterns/responsive.md +194 -0
  86. package/dist/skills/doubao-plugin-app/references/frontend/lynx/patterns/theming.md +143 -0
  87. package/dist/skills/doubao-plugin-app/references/frontend/lynx/quick-reference.md +229 -0
  88. package/dist/skills/doubao-plugin-app/references/frontend/rules/dos-and-donts.md +479 -0
  89. package/dist/skills/doubao-plugin-app/references/frontend/widget-templates/design-boundary.md +46 -0
  90. package/dist/skills/doubao-plugin-app/references/frontend/widget-templates/overview.md +118 -0
  91. package/dist/skills/doubao-plugin-app/references/frontend/widget-templates/props.md +301 -0
  92. package/dist/skills/doubao-plugin-app/references/mcp-and-cards.md +38 -0
  93. package/dist/templates/README.md.template +11 -0
  94. package/dist/templates/com.doubao/app/manifest.yaml +41 -0
  95. package/dist/templates/com.doubao/app/package.json.template +13 -0
  96. package/dist/templates/com.doubao/app/src/app.config.ts.template +5 -0
  97. package/dist/templates/com.doubao/app/src/app.ts.template +3 -0
  98. package/dist/templates/com.doubao/app/src/pages/home/index.css +14 -0
  99. package/dist/templates/com.doubao/app/src/pages/home/index.tsx.template +14 -0
  100. package/dist/templates/com.doubao/app/src/widgets/example/index.tsx.template +29 -0
  101. package/dist/templates/com.doubao/app/tsconfig.json +19 -0
  102. package/dist/templates/mcp.json +9 -0
  103. package/dist/templates/plugin.json.template +29 -0
  104. package/dist/templates/skills/example/SKILL.md.template +14 -0
  105. package/dist/upload.d.ts +44 -0
  106. package/dist/upload.js +38 -0
  107. package/package.json +60 -3
@@ -0,0 +1,1496 @@
1
+ # 豆包应用插件的端能力 API: 媒体
2
+
3
+ 图片选择、预览、保存、压缩和信息读取;录音管理;背景音频和内部音频播放。
4
+
5
+ [返回目录](./groups.md) | [返回速查](./quick-reference.md)
6
+
7
+ ## 速查
8
+
9
+ | API | 说明 |
10
+ | --- | --- |
11
+ | [getBackgroundAudioManager](#getbackgroundaudiomanager) | 获取全局唯一的背景音频管理器。 |
12
+ | [saveImageToPhotosAlbum](#saveimagetophotosalbum) | 保存图片到系统相册。 需要先确保应用已具备写入系统相册的权限。 |
13
+ | [previewImage](#previewimage) | 预览图片。 |
14
+ | [getImageInfo](#getimageinfo) | 获取图片信息。 |
15
+ | [chooseImage](#chooseimage) | 选择图片。 |
16
+ | [compressImage](#compressimage) | 压缩图片。 |
17
+ | [createInnerAudioContext](#createinneraudiocontext) | 创建一个内部音频上下文。 |
18
+ | [getRecorderManager](#getrecordermanager) | 获取全局唯一的录音管理器。 |
19
+
20
+ ## API 详情
21
+
22
+ <a id="getbackgroundaudiomanager"></a>
23
+ ### getBackgroundAudioManager()
24
+
25
+ # getBackgroundAudioManager
26
+
27
+ 获取全局唯一的背景音频管理器。
28
+
29
+ ## 扫码预览
30
+ ![扫码预览 getBackgroundAudioManager](https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=doubao%3A%2F%2Fdoubao_apps%3Fapp_id%3Ddb_1McM5Ni%26path%3D%252Fpages%252Fapi%252Fmedia%252Fget-background-audio-manager%252Findex)
31
+
32
+ ## 支持版本
33
+
34
+ 前端库版本不低于 `0.0.37`。
35
+
36
+ ## 支持平台
37
+
38
+ <table>
39
+ <thead>
40
+ <tr><th>平台</th><th>支持情况</th></tr>
41
+ </thead>
42
+ <tbody>
43
+ <tr><td>Android</td><td>支持</td></tr>
44
+ <tr><td>iOS</td><td>支持</td></tr>
45
+ <tr><td>PC</td><td>不支持</td></tr>
46
+ <tr><td>HarmonyOS</td><td>不支持</td></tr>
47
+ </tbody>
48
+ </table>
49
+
50
+ ## 支持场景
51
+
52
+ <table>
53
+ <thead>
54
+ <tr><th>场景</th><th>支持情况</th></tr>
55
+ </thead>
56
+ <tbody>
57
+ <tr><td>页面</td><td>支持</td></tr>
58
+ <tr><td>卡片</td><td>不支持</td></tr>
59
+ </tbody>
60
+ </table>
61
+
62
+ ## 使用说明
63
+
64
+ - 调用 play 前先设置有效 src;播放结束且不再需要背景播放时调用 stop。
65
+
66
+ ## 调用方式
67
+
68
+ ### 同步 API
69
+
70
+ ```typescript
71
+ getBackgroundAudioManager(): BackgroundAudioManager
72
+ ```
73
+
74
+ ## 入参
75
+
76
+ 无。
77
+
78
+ ## 调用示例
79
+
80
+ ```typescript
81
+ import { getBackgroundAudioManager } from '@doubao-dev/framework/api';
82
+
83
+ const audio = getBackgroundAudioManager();
84
+ audio.title = '示例音频';
85
+ audio.coverImgUrl = 'https://example.com/cover.jpg';
86
+ audio.src = 'https://example.com/audio.mp3';
87
+ audio.onError((error) => console.error(error.errCode, error.errMsg));
88
+ audio.play();
89
+ ```
90
+
91
+ ## 返回值
92
+
93
+ <table>
94
+ <thead>
95
+ <tr><th>名称</th><th>类型</th><th>必返</th><th>说明</th></tr>
96
+ </thead>
97
+ <tbody>
98
+ <tr><td><code>buffered</code></td><td><code>number</code></td><td>是</td><td>当前已缓冲到的位置,单位秒。</td></tr>
99
+ <tr><td><code>coverImgUrl</code></td><td><code>string</code></td><td>是</td><td>封面图片地址。</td></tr>
100
+ <tr><td><code>currentTime</code></td><td><code>number</code></td><td>是</td><td>当前播放位置,单位秒。</td></tr>
101
+ <tr><td><code>duration</code></td><td><code>number</code></td><td>是</td><td>音频总时长,单位秒;资源尚未就绪时为 0。</td></tr>
102
+ <tr><td><code>epname</code></td><td><code>string</code></td><td>是</td><td>专辑名称。</td></tr>
103
+ <tr><td><code>offCanplay</code></td><td><code>(callback?: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>取消 canplay 监听;省略 callback 时移除该事件的全部监听。</td></tr>
104
+ <tr><td><code>offEnded</code></td><td><code>(callback?: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>取消 ended 监听;省略 callback 时移除该事件的全部监听。</td></tr>
105
+ <tr><td><code>offError</code></td><td><code>(callback?: BackgroundAudioManagerErrorCallback) =&gt; void</code></td><td>是</td><td>取消 error 监听;省略 callback 时移除全部错误监听。</td></tr>
106
+ <tr><td><code>offNext</code></td><td><code>(callback?: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>取消 next 监听;省略 callback 时移除该事件的全部监听。</td></tr>
107
+ <tr><td><code>offPause</code></td><td><code>(callback?: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>取消 pause 监听;省略 callback 时移除该事件的全部监听。</td></tr>
108
+ <tr><td><code>offPlay</code></td><td><code>(callback?: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>取消 play 监听;省略 callback 时移除该事件的全部监听。</td></tr>
109
+ <tr><td><code>offPrev</code></td><td><code>(callback?: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>取消 prev 监听;省略 callback 时移除该事件的全部监听。</td></tr>
110
+ <tr><td><code>offSeeked</code></td><td><code>(callback?: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>取消 seeked 监听;省略 callback 时移除该事件的全部监听。</td></tr>
111
+ <tr><td><code>offSeeking</code></td><td><code>(callback?: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>取消 seeking 监听;省略 callback 时移除该事件的全部监听。</td></tr>
112
+ <tr><td><code>offStop</code></td><td><code>(callback?: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>取消 stop 监听;省略 callback 时移除该事件的全部监听。</td></tr>
113
+ <tr><td><code>offTimeUpdate</code></td><td><code>(callback?: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>取消 timeupdate 监听;省略 callback 时移除该事件的全部监听。</td></tr>
114
+ <tr><td><code>offWaiting</code></td><td><code>(callback?: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>取消 waiting 监听;省略 callback 时移除该事件的全部监听。</td></tr>
115
+ <tr><td><code>onCanplay</code></td><td><code>(callback: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>监听音频可以开始播放的事件。</td></tr>
116
+ <tr><td><code>onEnded</code></td><td><code>(callback: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>监听自然播放结束事件。</td></tr>
117
+ <tr><td><code>onError</code></td><td><code>(callback: BackgroundAudioManagerErrorCallback) =&gt; void</code></td><td>是</td><td>监听播放、资源或占用冲突错误。</td></tr>
118
+ <tr><td><code>onNext</code></td><td><code>(callback: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>监听用户在豆包背景播放控件中点击下一首的事件。</td></tr>
119
+ <tr><td><code>onPause</code></td><td><code>(callback: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>监听暂停事件。</td></tr>
120
+ <tr><td><code>onPlay</code></td><td><code>(callback: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>监听开始播放事件。</td></tr>
121
+ <tr><td><code>onPrev</code></td><td><code>(callback: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>监听用户在豆包背景播放控件中点击上一首的事件。</td></tr>
122
+ <tr><td><code>onSeeked</code></td><td><code>(callback: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>监听完成跳转播放位置的事件。</td></tr>
123
+ <tr><td><code>onSeeking</code></td><td><code>(callback: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>监听开始跳转播放位置的事件。</td></tr>
124
+ <tr><td><code>onStop</code></td><td><code>(callback: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>监听停止事件。</td></tr>
125
+ <tr><td><code>onTimeUpdate</code></td><td><code>(callback: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>监听播放进度更新事件。</td></tr>
126
+ <tr><td><code>onWaiting</code></td><td><code>(callback: BackgroundAudioManagerEventCallback) =&gt; void</code></td><td>是</td><td>监听因缓冲不足而等待的事件。</td></tr>
127
+ <tr><td><code>pause</code></td><td><code>() =&gt; void</code></td><td>是</td><td>暂停播放。</td></tr>
128
+ <tr><td><code>paused</code></td><td><code>boolean</code></td><td>是</td><td>当前是否暂停。</td></tr>
129
+ <tr><td><code>play</code></td><td><code>() =&gt; void</code></td><td>是</td><td>播放音频;调用前需要先设置 src。</td></tr>
130
+ <tr><td><code>playbackRate</code></td><td><code>number</code></td><td>是</td><td>播放速度,默认为 1。</td></tr>
131
+ <tr><td><code>seek</code></td><td><code>(position: number) =&gt; void</code></td><td>是</td><td>跳转到指定播放位置,position 的单位为秒且不能为负数。</td></tr>
132
+ <tr><td><code>singer</code></td><td><code>string</code></td><td>是</td><td>歌手或作者名称。</td></tr>
133
+ <tr><td><code>src</code></td><td><code>string</code></td><td>是</td><td>音频资源地址,支持 HTTP、HTTPS 地址。</td></tr>
134
+ <tr><td><code>startTime</code></td><td><code>number</code></td><td>是</td><td>开始播放的位置,单位秒,默认为 0。</td></tr>
135
+ <tr><td><code>stop</code></td><td><code>() =&gt; void</code></td><td>是</td><td>停止播放并释放当前背景音频占用。</td></tr>
136
+ <tr><td><code>title</code></td><td><code>string</code></td><td>是</td><td>音频标题,用于豆包背景播放信息展示。</td></tr>
137
+ <tr><td><code>webUrl</code></td><td><code>string</code></td><td>是</td><td>音频关联页面地址。</td></tr>
138
+ </tbody>
139
+ </table>
140
+
141
+ ### 返回示例
142
+
143
+ ```json
144
+ {
145
+ "src": "",
146
+ "title": "",
147
+ "epname": "",
148
+ "singer": "",
149
+ "coverImgUrl": "",
150
+ "webUrl": "",
151
+ "startTime": 0,
152
+ "currentTime": 0,
153
+ "duration": 0,
154
+ "paused": true,
155
+ "buffered": 0,
156
+ "playbackRate": 1
157
+ }
158
+ ```
159
+
160
+ ## 错误处理
161
+
162
+ 管理器操作失败时通过错误事件回调返回。错误对象和通用错误码见 [通用错误处理](./common-errors.md#错误返回)。
163
+
164
+ ### 失败示例
165
+
166
+ ```json
167
+ {
168
+ "errCode": -1001,
169
+ "errMsg": "background audio src is empty"
170
+ }
171
+ ```
172
+
173
+ ### 错误码
174
+
175
+ #### 事件错误码
176
+
177
+ <table>
178
+ <thead>
179
+ <tr><th>错误字段</th><th>值</th><th>错误信息</th><th>平台</th><th>触发条件</th><th>处理建议</th></tr>
180
+ </thead>
181
+ <tbody>
182
+ <tr><td><code>event.errCode</code></td><td><code>-1001</code></td><td><code>background audio src is empty</code></td><td>Android、iOS</td><td>未设置 src 就调用 play</td><td>设置有效 src 后重试。</td></tr>
183
+ <tr><td><code>event.errCode</code></td><td><code>-1002</code></td><td><code>background audio play failed</code></td><td>Android</td><td>播放器启动失败</td><td>检查资源地址和网络状态后重试。</td></tr>
184
+ <tr><td><code>event.errCode</code></td><td><code>-1003</code></td><td><code>background audio seek failed</code></td><td>Android、iOS</td><td>播放位置跳转失败</td><td>等待 canplay 后在音频时长范围内重试。</td></tr>
185
+ <tr><td><code>event.errCode</code></td><td><code>-1004</code></td><td><code>background audio player unavailable</code></td><td>Android、iOS</td><td>播放器无法创建或已经不可用</td><td>重新设置 src 后重试。</td></tr>
186
+ <tr><td><code>event.errCode</code></td><td><code>-1005</code></td><td><code>background audio is occupied by another applet</code></td><td>Android、iOS</td><td>另一应用插件正在占用背景音频</td><td>提示用户结束其他背景音频后重试。</td></tr>
187
+ </tbody>
188
+ </table>
189
+
190
+ ## 平台差异
191
+
192
+ - **iOS**:部分系统播放器错误会在 onError 中返回系统错误码和错误信息,请为未识别的 errCode 提供兜底处理。
193
+
194
+ ## 已知限制与注意事项
195
+
196
+ - 背景音频管理器是全局单例;后一次调用获取到的是同一实例和同一组播放状态。
197
+
198
+ <a id="saveimagetophotosalbum"></a>
199
+ ### saveImageToPhotosAlbum()
200
+
201
+ # saveImageToPhotosAlbum
202
+
203
+ 保存图片到系统相册。
204
+
205
+ 需要先确保应用已具备写入系统相册的权限。
206
+
207
+ ## 扫码预览
208
+ ![扫码预览 saveImageToPhotosAlbum](https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=doubao%3A%2F%2Fdoubao_apps%3Fapp_id%3Ddb_1McM5Ni%26path%3D%252Fpages%252Fapi%252Fmedia%252Fsave-image-to-photos-album%252Findex)
209
+
210
+ ## 支持版本
211
+
212
+ 前端库版本不低于 `0.0.26`。
213
+
214
+ ## 支持平台
215
+
216
+ <table>
217
+ <thead>
218
+ <tr><th>平台</th><th>支持情况</th></tr>
219
+ </thead>
220
+ <tbody>
221
+ <tr><td>Android</td><td>支持</td></tr>
222
+ <tr><td>iOS</td><td>支持</td></tr>
223
+ <tr><td>PC</td><td>不支持</td></tr>
224
+ <tr><td>HarmonyOS</td><td>不支持</td></tr>
225
+ </tbody>
226
+ </table>
227
+
228
+ ## 支持场景
229
+
230
+ <table>
231
+ <thead>
232
+ <tr><th>场景</th><th>支持情况</th></tr>
233
+ </thead>
234
+ <tbody>
235
+ <tr><td>页面</td><td>支持</td></tr>
236
+ <tr><td>卡片</td><td>不支持</td></tr>
237
+ </tbody>
238
+ </table>
239
+
240
+ ## 接入准备
241
+
242
+ ### 权限要求
243
+
244
+ <table>
245
+ <thead>
246
+ <tr><th>类型</th><th>标识</th><th>是否必须</th><th>平台</th><th>说明</th></tr>
247
+ </thead>
248
+ <tbody>
249
+ <tr><td>系统权限</td><td>相册写入权限</td><td>按条件</td><td>Android、iOS</td><td>系统版本要求相册或外部存储写入授权时需要授予</td></tr>
250
+ </tbody>
251
+ </table>
252
+
253
+ ### 授权行为
254
+
255
+ - **Android**:API 不主动展示应用授权弹窗。系统版本要求外部存储写入权限且权限未授予时,保存会失败;请引导用户在系统设置中开启后重试。
256
+ - **iOS**:首次写入系统相册时由系统请求相册写入权限。用户拒绝或撤销后保存失败;请引导用户在系统设置中开启后重试。
257
+
258
+ ### 前置条件
259
+
260
+ - 传入豆包应用插件可访问、存在且可解码的本地图片路径
261
+
262
+ ## 调用方式
263
+
264
+ ### 异步 API
265
+
266
+ ```typescript
267
+ saveImageToPhotosAlbum(params: SaveImageToPhotosAlbumParams): Promise<object>
268
+ ```
269
+
270
+ ## 入参
271
+
272
+ <table>
273
+ <thead>
274
+ <tr><th>名称</th><th>类型</th><th>必填</th><th>默认值</th><th>约束</th><th>说明</th></tr>
275
+ </thead>
276
+ <tbody>
277
+ <tr><td><code>filePath</code></td><td><code>string</code></td><td>是</td><td>-</td><td>-</td><td>需要保存的图片文件路径。支持临时文件路径或持久文件路径,不支持网络图片路径。</td></tr>
278
+ </tbody>
279
+ </table>
280
+
281
+ ## 调用示例
282
+
283
+ ```typescript
284
+ import { saveImageToPhotosAlbum } from '@doubao-dev/framework/api';
285
+
286
+ await saveImageToPhotosAlbum({
287
+ filePath: '/path/to/image.png'
288
+ });
289
+ ```
290
+
291
+ ## 成功返回
292
+
293
+ 无返回字段。
294
+
295
+ ### 返回示例
296
+
297
+ ```json
298
+ {}
299
+ ```
300
+
301
+ <a id="previewimage"></a>
302
+ ### previewImage()
303
+
304
+ # previewImage
305
+
306
+ 预览图片。
307
+
308
+ ## 扫码预览
309
+ ![扫码预览 previewImage](https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=doubao%3A%2F%2Fdoubao_apps%3Fapp_id%3Ddb_1McM5Ni%26path%3D%252Fpages%252Fapi%252Fmedia%252Fpreview-image%252Findex)
310
+
311
+ ## 使用限制
312
+
313
+ > [!WARNING]
314
+ > **Android、iOS**:只按字符串形式与 urls 中的完整图片地址匹配,数字下标不能定位图片;传入数字下标时会从第一张图片开始预览。
315
+ > **Android、iOS**:调用时忽略 referrerPolicy,预览请求不会应用该策略;调用方配置的 Referrer 策略不生效。
316
+
317
+ ## 支持版本
318
+
319
+ 前端库版本不低于 `0.0.26`。
320
+
321
+ ## 支持平台
322
+
323
+ <table>
324
+ <thead>
325
+ <tr><th>平台</th><th>支持情况</th></tr>
326
+ </thead>
327
+ <tbody>
328
+ <tr><td>Android</td><td>支持</td></tr>
329
+ <tr><td>iOS</td><td>支持</td></tr>
330
+ <tr><td>PC</td><td>不支持</td></tr>
331
+ <tr><td>HarmonyOS</td><td>不支持</td></tr>
332
+ </tbody>
333
+ </table>
334
+
335
+ ## 支持场景
336
+
337
+ <table>
338
+ <thead>
339
+ <tr><th>场景</th><th>支持情况</th></tr>
340
+ </thead>
341
+ <tbody>
342
+ <tr><td>页面</td><td>支持</td></tr>
343
+ <tr><td>卡片</td><td>支持</td></tr>
344
+ </tbody>
345
+ </table>
346
+
347
+ ## 接入准备
348
+
349
+ ### 前置条件
350
+
351
+ - urls 至少包含一个有效图片地址;需要指定首图时传入 urls 中的完整图片地址
352
+
353
+ ## 调用方式
354
+
355
+ ### 异步 API
356
+
357
+ ```typescript
358
+ previewImage(params: PreviewImageParams): Promise<object>
359
+ ```
360
+
361
+ ## 入参
362
+
363
+ <table>
364
+ <thead>
365
+ <tr><th>名称</th><th>类型</th><th>必填</th><th>默认值</th><th>约束</th><th>说明</th></tr>
366
+ </thead>
367
+ <tbody>
368
+ <tr><td><code>current</code></td><td><code>string | number</code></td><td>否</td><td><code>urls 中的第一张</code></td><td>-</td><td>当前显示图片的链接,或当前显示图片的下标。不填时显示 `urls` 中的第一张。Android、iOS:只按字符串形式与 urls 中的完整图片地址匹配,数字下标不能定位图片。</td></tr>
369
+ <tr><td><code>referrerPolicy</code></td><td><code>string</code></td><td>否</td><td><code>-</code></td><td>-</td><td>预览页使用的 Referrer 策略。Android、iOS:调用时忽略 referrerPolicy,预览请求不会应用该策略。</td></tr>
370
+ <tr><td><code>showmenu</code></td><td><code>boolean</code></td><td>否</td><td><code>true</code></td><td>-</td><td>是否显示长按菜单,菜单支持保存图片至本地相册。</td></tr>
371
+ <tr><td><code>urls</code></td><td><code>string[]</code></td><td>是</td><td>-</td><td>-</td><td>需要预览的图片链接列表。</td></tr>
372
+ </tbody>
373
+ </table>
374
+
375
+ ## 调用示例
376
+
377
+ ```typescript
378
+ import { previewImage } from '@doubao-dev/framework/api';
379
+
380
+ await previewImage({
381
+ urls: ['https://example.com/a.png', 'https://example.com/b.png'],
382
+ current: 'https://example.com/a.png'
383
+ });
384
+ ```
385
+
386
+ ## 成功返回
387
+
388
+ 无返回字段。
389
+
390
+ ### 返回示例
391
+
392
+ ```json
393
+ {}
394
+ ```
395
+
396
+ <a id="getimageinfo"></a>
397
+ ### getImageInfo()
398
+
399
+ # getImageInfo
400
+
401
+ 获取图片信息。
402
+
403
+ ## 扫码预览
404
+ ![扫码预览 getImageInfo](https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=doubao%3A%2F%2Fdoubao_apps%3Fapp_id%3Ddb_1McM5Ni%26path%3D%252Fpages%252Fapi%252Fmedia%252Fget-image-info%252Findex)
405
+
406
+ ## 支持版本
407
+
408
+ 前端库版本不低于 `0.0.26`。
409
+
410
+ ## 支持平台
411
+
412
+ <table>
413
+ <thead>
414
+ <tr><th>平台</th><th>支持情况</th></tr>
415
+ </thead>
416
+ <tbody>
417
+ <tr><td>Android</td><td>支持</td></tr>
418
+ <tr><td>iOS</td><td>支持</td></tr>
419
+ <tr><td>PC</td><td>不支持</td></tr>
420
+ <tr><td>HarmonyOS</td><td>不支持</td></tr>
421
+ </tbody>
422
+ </table>
423
+
424
+ ## 支持场景
425
+
426
+ <table>
427
+ <thead>
428
+ <tr><th>场景</th><th>支持情况</th></tr>
429
+ </thead>
430
+ <tbody>
431
+ <tr><td>页面</td><td>支持</td></tr>
432
+ <tr><td>卡片</td><td>不支持</td></tr>
433
+ </tbody>
434
+ </table>
435
+
436
+ ## 接入准备
437
+
438
+ ### 前置条件
439
+
440
+ - src 为豆包应用插件可访问的本地图片路径,或可直接下载的 HTTP、HTTPS 图片地址
441
+
442
+ ## 使用说明
443
+
444
+ - 网络图片会产生下载流量;如需重复读取,建议先下载为本地临时文件。
445
+
446
+ ## 调用方式
447
+
448
+ ### 异步 API
449
+
450
+ ```typescript
451
+ getImageInfo(params: GetImageInfoParams): Promise<GetImageInfoResult>
452
+ ```
453
+
454
+ ## 入参
455
+
456
+ <table>
457
+ <thead>
458
+ <tr><th>名称</th><th>类型</th><th>必填</th><th>默认值</th><th>约束</th><th>说明</th></tr>
459
+ </thead>
460
+ <tbody>
461
+ <tr><td><code>src</code></td><td><code>string</code></td><td>是</td><td>-</td><td>-</td><td>图片路径,可以是相对路径、临时文件路径、存储文件路径或网络图片路径。</td></tr>
462
+ </tbody>
463
+ </table>
464
+
465
+ ## 调用示例
466
+
467
+ ```typescript
468
+ import { getImageInfo } from '@doubao-dev/framework/api';
469
+
470
+ const { width, height, path } = await getImageInfo({
471
+ src: '/tmp/image.png'
472
+ });
473
+
474
+ console.log(width, height, path);
475
+ ```
476
+
477
+ ## 成功返回
478
+
479
+ <table>
480
+ <thead>
481
+ <tr><th>名称</th><th>类型</th><th>必返</th><th>说明</th></tr>
482
+ </thead>
483
+ <tbody>
484
+ <tr><td><code>height</code></td><td><code>number</code></td><td>是</td><td>图片原始高度,单位 px,不考虑旋转。</td></tr>
485
+ <tr><td><code>orientation</code></td><td><code>ImageOrientation</code></td><td>是</td><td>图片方向。</td></tr>
486
+ <tr><td><code>path</code></td><td><code>string</code></td><td>是</td><td>图片路径;网络图片返回原始网络地址,本地图片返回可访问的本地路径。</td></tr>
487
+ <tr><td><code>type</code></td><td><code>string</code></td><td>是</td><td>图片格式。</td></tr>
488
+ <tr><td><code>width</code></td><td><code>number</code></td><td>是</td><td>图片原始宽度,单位 px,不考虑旋转。</td></tr>
489
+ </tbody>
490
+ </table>
491
+
492
+ ### 返回示例
493
+
494
+ ```json
495
+ {
496
+ "height": 1080,
497
+ "orientation": "up",
498
+ "path": "appletfile://temp/example.jpg",
499
+ "type": "jpeg",
500
+ "width": 1920
501
+ }
502
+ ```
503
+
504
+ ## 错误处理
505
+
506
+ 错误对象和通用错误码见 [通用错误处理](./common-errors.md#错误返回)。
507
+
508
+ ### 失败示例
509
+
510
+ ```json
511
+ {
512
+ "errNo": 104,
513
+ "errMsg": "src cannot be empty"
514
+ }
515
+ ```
516
+
517
+ ### 错误码
518
+
519
+ <table>
520
+ <thead>
521
+ <tr><th>errNo</th><th>errMsg</th><th>平台</th><th>触发条件</th><th>处理建议</th></tr>
522
+ </thead>
523
+ <tbody>
524
+ <tr><td><code>104</code></td><td><code>src cannot be empty</code></td><td>Android</td><td>src 为空字符串</td><td>传入非空的本地图片路径或 HTTP、HTTPS 地址。</td></tr>
525
+ <tr><td><code>104</code></td><td><code>src must not be empty</code></td><td>iOS</td><td>src 为空字符串</td><td>传入非空的本地图片路径或 HTTP、HTTPS 地址。</td></tr>
526
+ <tr><td><code>203</code></td><td><code>file does not exist</code></td><td>Android</td><td>本地图片文件不存在</td><td>检查路径仍在有效期内并重新获取文件。</td></tr>
527
+ <tr><td><code>203</code></td><td><code>file not found</code></td><td>iOS</td><td>本地图片文件不存在</td><td>检查路径仍在有效期内并重新获取文件。</td></tr>
528
+ </tbody>
529
+ </table>
530
+
531
+ ## 平台差异
532
+
533
+ - **iOS**:网络图片下载到临时目录时不保留扩展名,type 可能返回 unknown;如需稳定识别格式,请以图片内容自行判断。
534
+
535
+ <a id="chooseimage"></a>
536
+ ### chooseImage()
537
+
538
+ # chooseImage
539
+
540
+ 选择图片。
541
+
542
+ ## 扫码预览
543
+ ![扫码预览 chooseImage](https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=doubao%3A%2F%2Fdoubao_apps%3Fapp_id%3Ddb_1McM5Ni%26path%3D%252Fpages%252Fapi%252Fmedia%252Fchoose-image%252Findex)
544
+
545
+ ## 使用限制
546
+
547
+ > [!WARNING]
548
+ > **Android、iOS**:选择结果不受 sizeType 影响;调用方无法控制返回图片尺寸。
549
+ > **Android、iOS**:仅当数组只包含 camera 时打开相机;其他组合均打开相册,user 和 environment 不生效;传入多个来源或 user、environment 时实际入口与配置不一致。
550
+
551
+ ## 支持版本
552
+
553
+ 前端库版本不低于 `0.0.26`。
554
+
555
+ ## 支持平台
556
+
557
+ <table>
558
+ <thead>
559
+ <tr><th>平台</th><th>支持情况</th></tr>
560
+ </thead>
561
+ <tbody>
562
+ <tr><td>Android</td><td>支持</td></tr>
563
+ <tr><td>iOS</td><td>支持</td></tr>
564
+ <tr><td>PC</td><td>不支持</td></tr>
565
+ <tr><td>HarmonyOS</td><td>不支持</td></tr>
566
+ </tbody>
567
+ </table>
568
+
569
+ ## 支持场景
570
+
571
+ <table>
572
+ <thead>
573
+ <tr><th>场景</th><th>支持情况</th></tr>
574
+ </thead>
575
+ <tbody>
576
+ <tr><td>页面</td><td>支持</td></tr>
577
+ <tr><td>卡片</td><td>不支持</td></tr>
578
+ </tbody>
579
+ </table>
580
+
581
+ ## 接入准备
582
+
583
+ ### 权限要求
584
+
585
+ <table>
586
+ <thead>
587
+ <tr><th>类型</th><th>标识</th><th>是否必须</th><th>平台</th><th>说明</th></tr>
588
+ </thead>
589
+ <tbody>
590
+ <tr><td>系统权限</td><td>相册访问权限</td><td>按条件</td><td>Android、iOS</td><td>从相册选择图片时,系统或豆包图片选择器可能按系统版本请求访问权限</td></tr>
591
+ <tr><td>系统权限</td><td>相机权限</td><td>按条件</td><td>Android、iOS</td><td>sourceType 只传 camera 时需要使用相机</td></tr>
592
+ </tbody>
593
+ </table>
594
+
595
+ ### 授权行为
596
+
597
+ - **Android**:API 直接打开豆包图片选择器或相机。系统需要权限时会由对应选择器发起申请;拒绝或撤销后选择失败,请在系统设置中开启相册或相机权限后重试。
598
+ - **iOS**:API 直接打开豆包相册选择器或系统相机。首次需要时系统会请求相册或相机权限;拒绝或撤销后选择失败,请在系统设置中开启后重试。
599
+
600
+ ### 前置条件
601
+
602
+ - 在可展示图片选择器的前台页面中,由用户操作触发调用
603
+
604
+ ## 使用说明
605
+
606
+ - 图片属于用户数据,仅在业务必需时选择,并及时释放不再使用的临时文件。
607
+
608
+ ## 调用方式
609
+
610
+ ### 异步 API
611
+
612
+ ```typescript
613
+ chooseImage(params?: ChooseImageParams): Promise<ChooseImageResult>
614
+ ```
615
+
616
+ ## 入参
617
+
618
+ <table>
619
+ <thead>
620
+ <tr><th>名称</th><th>类型</th><th>必填</th><th>默认值</th><th>约束</th><th>说明</th></tr>
621
+ </thead>
622
+ <tbody>
623
+ <tr><td><code>count</code></td><td><code>number</code></td><td>否</td><td><code>9</code></td><td>正整数</td><td>最多可选图片张数。使用相机时固定返回一张图片。</td></tr>
624
+ <tr><td><code>imageId</code></td><td><code>string</code></td><td>否</td><td><code>-</code></td><td>-</td><td>H5 场景下可复用的 input 元素 ID。</td></tr>
625
+ <tr><td><code>sizeType</code></td><td><code>ChooseImageSizeType[]</code></td><td>否</td><td><code>-</code></td><td>-</td><td>允许返回的图片尺寸类型。Android、iOS:选择结果不受 sizeType 影响。</td></tr>
626
+ <tr><td><code>sourceType</code></td><td><code>ChooseImageSourceType[]</code></td><td>否</td><td><code>[&quot;album&quot;]</code></td><td>-</td><td>允许选择的图片来源。Android、iOS:仅当数组只包含 camera 时打开相机;其他组合均打开相册,user 和 environment 不生效。</td></tr>
627
+ </tbody>
628
+ </table>
629
+
630
+ ## 调用示例
631
+
632
+ ```typescript
633
+ import { chooseImage } from '@doubao-dev/framework/api';
634
+
635
+ const { tempFilePaths } = await chooseImage({
636
+ count: 1,
637
+ sourceType: ['album']
638
+ });
639
+
640
+ console.log(tempFilePaths);
641
+ ```
642
+
643
+ ## 成功返回
644
+
645
+ <table>
646
+ <thead>
647
+ <tr><th>名称</th><th>类型</th><th>必返</th><th>说明</th></tr>
648
+ </thead>
649
+ <tbody>
650
+ <tr><td><code>tempFilePaths</code></td><td><code>string[]</code></td><td>是</td><td>图片临时文件路径列表。</td></tr>
651
+ <tr><td><code>tempFiles</code></td><td><code>ChooseImageFile[]</code></td><td>是</td><td>图片临时文件信息列表。</td></tr>
652
+ <tr><td><code>tempFiles[].originalFileObj</code></td><td><code>File</code></td><td>否</td><td>原始浏览器 File 对象。</td></tr>
653
+ <tr><td><code>tempFiles[].path</code></td><td><code>string</code></td><td>是</td><td>本地临时文件路径。</td></tr>
654
+ <tr><td><code>tempFiles[].size</code></td><td><code>number</code></td><td>是</td><td>文件大小,单位 B。</td></tr>
655
+ <tr><td><code>tempFiles[].type</code></td><td><code>string</code></td><td>否</td><td>文件 MIME 类型。</td></tr>
656
+ </tbody>
657
+ </table>
658
+
659
+ ### 返回示例
660
+
661
+ ```json
662
+ {
663
+ "tempFilePaths": ["appletfile://temp/example.jpg"],
664
+ "tempFiles": [
665
+ {
666
+ "path": "appletfile://temp/example.jpg",
667
+ "size": 245760,
668
+ "type": "image/jpeg"
669
+ }
670
+ ]
671
+ }
672
+ ```
673
+
674
+ ## 平台差异
675
+
676
+ - 使用相机时固定返回一张图片。
677
+
678
+ <a id="compressimage"></a>
679
+ ### compressImage()
680
+
681
+ # compressImage
682
+
683
+ 压缩图片。
684
+
685
+ ## 扫码预览
686
+ ![扫码预览 compressImage](https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=doubao%3A%2F%2Fdoubao_apps%3Fapp_id%3Ddb_1McM5Ni%26path%3D%252Fpages%252Fapi%252Fmedia%252Fcompress-image%252Findex)
687
+
688
+ ## 支持版本
689
+
690
+ 前端库版本不低于 `0.0.26`。
691
+
692
+ ## 支持平台
693
+
694
+ <table>
695
+ <thead>
696
+ <tr><th>平台</th><th>支持情况</th></tr>
697
+ </thead>
698
+ <tbody>
699
+ <tr><td>Android</td><td>支持</td></tr>
700
+ <tr><td>iOS</td><td>支持</td></tr>
701
+ <tr><td>PC</td><td>不支持</td></tr>
702
+ <tr><td>HarmonyOS</td><td>不支持</td></tr>
703
+ </tbody>
704
+ </table>
705
+
706
+ ## 支持场景
707
+
708
+ <table>
709
+ <thead>
710
+ <tr><th>场景</th><th>支持情况</th></tr>
711
+ </thead>
712
+ <tbody>
713
+ <tr><td>页面</td><td>支持</td></tr>
714
+ <tr><td>卡片</td><td>不支持</td></tr>
715
+ </tbody>
716
+ </table>
717
+
718
+ ## 接入准备
719
+
720
+ ### 前置条件
721
+
722
+ - src 指向豆包应用插件可访问、存在且可解码的本地图片
723
+
724
+ ## 调用方式
725
+
726
+ ### 异步 API
727
+
728
+ ```typescript
729
+ compressImage(params: CompressImageParams): Promise<CompressImageResult>
730
+ ```
731
+
732
+ ## 入参
733
+
734
+ <table>
735
+ <thead>
736
+ <tr><th>名称</th><th>类型</th><th>必填</th><th>默认值</th><th>约束</th><th>说明</th></tr>
737
+ </thead>
738
+ <tbody>
739
+ <tr><td><code>compressedHeight</code></td><td><code>number</code></td><td>否</td><td><code>-</code></td><td>正数,且与 compressedWidth 同时传入</td><td>输出图片高度,单位 px。仅在 `compressedWidth` 同时为正数时调整尺寸。</td></tr>
740
+ <tr><td><code>compressedWidth</code></td><td><code>number</code></td><td>否</td><td><code>-</code></td><td>正数,且与 compressedHeight 同时传入</td><td>输出图片宽度,单位 px。仅在 `compressedHeight` 同时为正数时调整尺寸。</td></tr>
741
+ <tr><td><code>quality</code></td><td><code>number</code></td><td>否</td><td><code>80</code></td><td>0 至 100</td><td>JPEG 输出质量。</td></tr>
742
+ <tr><td><code>src</code></td><td><code>string</code></td><td>是</td><td>-</td><td>-</td><td>图片路径。</td></tr>
743
+ </tbody>
744
+ </table>
745
+
746
+ ## 调用示例
747
+
748
+ ```typescript
749
+ import { compressImage } from '@doubao-dev/framework/api';
750
+
751
+ const { tempFilePath } = await compressImage({
752
+ src: '/tmp/image.png',
753
+ quality: 80
754
+ });
755
+
756
+ console.log(tempFilePath);
757
+ ```
758
+
759
+ ## 成功返回
760
+
761
+ <table>
762
+ <thead>
763
+ <tr><th>名称</th><th>类型</th><th>必返</th><th>说明</th></tr>
764
+ </thead>
765
+ <tbody>
766
+ <tr><td><code>tempFilePath</code></td><td><code>string</code></td><td>是</td><td>压缩后 JPEG 图片的临时文件路径。</td></tr>
767
+ </tbody>
768
+ </table>
769
+
770
+ ### 返回示例
771
+
772
+ ```json
773
+ {
774
+ "tempFilePath": "appletfile://temp/compressed-example.jpg"
775
+ }
776
+ ```
777
+
778
+ ## 错误处理
779
+
780
+ 错误对象和通用错误码见 [通用错误处理](./common-errors.md#错误返回)。
781
+
782
+ ### 失败示例
783
+
784
+ ```json
785
+ {
786
+ "errNo": 104,
787
+ "errMsg": "src cannot be empty"
788
+ }
789
+ ```
790
+
791
+ ### 错误码
792
+
793
+ <table>
794
+ <thead>
795
+ <tr><th>errNo</th><th>errMsg</th><th>平台</th><th>触发条件</th><th>处理建议</th></tr>
796
+ </thead>
797
+ <tbody>
798
+ <tr><td><code>104</code></td><td><code>src cannot be empty</code></td><td>Android</td><td>src 为空字符串</td><td>传入非空的本地图片路径。</td></tr>
799
+ <tr><td><code>104</code></td><td><code>src must not be empty</code></td><td>iOS</td><td>src 为空字符串</td><td>传入非空的本地图片路径。</td></tr>
800
+ <tr><td><code>203</code></td><td><code>source file does not exist</code></td><td>Android</td><td>本地源图片文件不存在</td><td>检查路径仍在有效期内并重新获取文件。</td></tr>
801
+ </tbody>
802
+ </table>
803
+
804
+ <a id="createinneraudiocontext"></a>
805
+ ### createInnerAudioContext()
806
+
807
+ # createInnerAudioContext
808
+
809
+ 创建一个内部音频上下文。
810
+
811
+ ## 扫码预览
812
+ ![扫码预览 createInnerAudioContext](https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=doubao%3A%2F%2Fdoubao_apps%3Fapp_id%3Ddb_1McM5Ni%26path%3D%252Fpages%252Fapi%252Fmedia%252Fcreate-inner-audio-context%252Findex)
813
+
814
+ ## 支持版本
815
+
816
+ 前端库版本不低于 `0.0.37`。
817
+
818
+ ## 支持平台
819
+
820
+ <table>
821
+ <thead>
822
+ <tr><th>平台</th><th>支持情况</th></tr>
823
+ </thead>
824
+ <tbody>
825
+ <tr><td>Android</td><td>支持</td></tr>
826
+ <tr><td>iOS</td><td>支持</td></tr>
827
+ <tr><td>PC</td><td>不支持</td></tr>
828
+ <tr><td>HarmonyOS</td><td>不支持</td></tr>
829
+ </tbody>
830
+ </table>
831
+
832
+ ## 支持场景
833
+
834
+ <table>
835
+ <thead>
836
+ <tr><th>场景</th><th>支持情况</th></tr>
837
+ </thead>
838
+ <tbody>
839
+ <tr><td>页面</td><td>支持</td></tr>
840
+ <tr><td>卡片</td><td>不支持</td></tr>
841
+ </tbody>
842
+ </table>
843
+
844
+ ## 使用说明
845
+
846
+ 返回的对象拥有独立状态和事件监听。长音频或需要锁屏控制的场景请使用
847
+ `getBackgroundAudioManager()`。
848
+
849
+ - 调用 play 前先设置有效 src;不再使用实例时调用 destroy 释放资源。
850
+
851
+ ## 调用方式
852
+
853
+ ### 同步 API
854
+
855
+ ```typescript
856
+ createInnerAudioContext(): InnerAudioContext
857
+ ```
858
+
859
+ ## 入参
860
+
861
+ 无。
862
+
863
+ ## 调用示例
864
+
865
+ ```typescript
866
+ import { createInnerAudioContext } from '@doubao-dev/framework/api';
867
+
868
+ const audio = createInnerAudioContext();
869
+ audio.onError((error) => console.error(error.errCode, error.errMsg));
870
+ audio.onEnded(() => audio.destroy());
871
+ audio.src = 'https://example.com/audio.mp3';
872
+ audio.play();
873
+ ```
874
+
875
+ ## 返回值
876
+
877
+ <table>
878
+ <thead>
879
+ <tr><th>名称</th><th>类型</th><th>必返</th><th>说明</th></tr>
880
+ </thead>
881
+ <tbody>
882
+ <tr><td><code>autoplay</code></td><td><code>boolean</code></td><td>是</td><td>设置 src 后是否自动播放,默认为 false。</td></tr>
883
+ <tr><td><code>buffered</code></td><td><code>number</code></td><td>是</td><td>当前已缓冲到的位置,单位秒。</td></tr>
884
+ <tr><td><code>currentTime</code></td><td><code>number</code></td><td>是</td><td>当前播放位置,单位秒。</td></tr>
885
+ <tr><td><code>destroy</code></td><td><code>() =&gt; void</code></td><td>是</td><td>销毁当前上下文并释放播放资源;销毁后不能继续调用。</td></tr>
886
+ <tr><td><code>duration</code></td><td><code>number</code></td><td>是</td><td>音频总时长,单位秒;资源尚未就绪时为 0。</td></tr>
887
+ <tr><td><code>loop</code></td><td><code>boolean</code></td><td>是</td><td>是否循环播放,默认为 false。</td></tr>
888
+ <tr><td><code>offCanplay</code></td><td><code>(callback?: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>取消 canplay 监听;省略 callback 时移除该事件的全部监听。</td></tr>
889
+ <tr><td><code>offEnded</code></td><td><code>(callback?: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>取消 ended 监听;省略 callback 时移除该事件的全部监听。</td></tr>
890
+ <tr><td><code>offError</code></td><td><code>(callback?: InnerAudioContextErrorCallback) =&gt; void</code></td><td>是</td><td>取消 error 监听;省略 callback 时移除全部错误监听。</td></tr>
891
+ <tr><td><code>offPause</code></td><td><code>(callback?: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>取消 pause 监听;省略 callback 时移除该事件的全部监听。</td></tr>
892
+ <tr><td><code>offPlay</code></td><td><code>(callback?: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>取消 play 监听;省略 callback 时移除该事件的全部监听。</td></tr>
893
+ <tr><td><code>offSeeked</code></td><td><code>(callback?: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>取消 seeked 监听;省略 callback 时移除该事件的全部监听。</td></tr>
894
+ <tr><td><code>offSeeking</code></td><td><code>(callback?: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>取消 seeking 监听;省略 callback 时移除该事件的全部监听。</td></tr>
895
+ <tr><td><code>offStop</code></td><td><code>(callback?: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>取消 stop 监听;省略 callback 时移除该事件的全部监听。</td></tr>
896
+ <tr><td><code>offTimeUpdate</code></td><td><code>(callback?: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>取消 timeupdate 监听;省略 callback 时移除该事件的全部监听。</td></tr>
897
+ <tr><td><code>offWaiting</code></td><td><code>(callback?: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>取消 waiting 监听;省略 callback 时移除该事件的全部监听。</td></tr>
898
+ <tr><td><code>onCanplay</code></td><td><code>(callback: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>监听音频可以开始播放的事件。</td></tr>
899
+ <tr><td><code>onEnded</code></td><td><code>(callback: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>监听自然播放结束事件。</td></tr>
900
+ <tr><td><code>onError</code></td><td><code>(callback: InnerAudioContextErrorCallback) =&gt; void</code></td><td>是</td><td>监听播放、参数或资源错误。</td></tr>
901
+ <tr><td><code>onPause</code></td><td><code>(callback: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>监听暂停事件。</td></tr>
902
+ <tr><td><code>onPlay</code></td><td><code>(callback: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>监听开始播放事件。</td></tr>
903
+ <tr><td><code>onSeeked</code></td><td><code>(callback: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>监听完成跳转播放位置的事件。</td></tr>
904
+ <tr><td><code>onSeeking</code></td><td><code>(callback: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>监听开始跳转播放位置的事件。</td></tr>
905
+ <tr><td><code>onStop</code></td><td><code>(callback: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>监听停止事件。</td></tr>
906
+ <tr><td><code>onTimeUpdate</code></td><td><code>(callback: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>监听播放进度更新事件。</td></tr>
907
+ <tr><td><code>onWaiting</code></td><td><code>(callback: InnerAudioContextEventCallback) =&gt; void</code></td><td>是</td><td>监听因缓冲不足而等待的事件。</td></tr>
908
+ <tr><td><code>pause</code></td><td><code>() =&gt; void</code></td><td>是</td><td>暂停播放。</td></tr>
909
+ <tr><td><code>paused</code></td><td><code>boolean</code></td><td>是</td><td>当前是否暂停。</td></tr>
910
+ <tr><td><code>play</code></td><td><code>() =&gt; void</code></td><td>是</td><td>播放音频;调用前需要先设置 src。</td></tr>
911
+ <tr><td><code>playbackRate</code></td><td><code>number</code></td><td>是</td><td>播放速度,豆包实际使用范围为 0.5 至 2,默认为 1。</td></tr>
912
+ <tr><td><code>seek</code></td><td><code>(position: number) =&gt; void</code></td><td>是</td><td>跳转到指定播放位置,position 的单位为秒且不能为负数。</td></tr>
913
+ <tr><td><code>src</code></td><td><code>string</code></td><td>是</td><td>音频资源地址,支持 HTTP、HTTPS 地址和豆包应用插件本地文件路径。</td></tr>
914
+ <tr><td><code>startTime</code></td><td><code>number</code></td><td>是</td><td>开始播放的位置,单位秒,默认为 0。</td></tr>
915
+ <tr><td><code>stop</code></td><td><code>() =&gt; void</code></td><td>是</td><td>停止播放并将播放位置归零。</td></tr>
916
+ <tr><td><code>volume</code></td><td><code>number</code></td><td>是</td><td>音量,范围 0 至 1,默认为 1。</td></tr>
917
+ </tbody>
918
+ </table>
919
+
920
+ ### 返回示例
921
+
922
+ ```json
923
+ {
924
+ "src": "",
925
+ "startTime": 0,
926
+ "autoplay": false,
927
+ "loop": false,
928
+ "volume": 1,
929
+ "playbackRate": 1,
930
+ "currentTime": 0,
931
+ "duration": 0,
932
+ "paused": true,
933
+ "buffered": 0
934
+ }
935
+ ```
936
+
937
+ ## 错误处理
938
+
939
+ 管理器操作失败时通过错误事件回调返回。错误对象和通用错误码见 [通用错误处理](./common-errors.md#错误返回)。
940
+
941
+ ### 失败示例
942
+
943
+ ```json
944
+ {
945
+ "errCode": -2003,
946
+ "errMsg": "inner audio src is empty"
947
+ }
948
+ ```
949
+
950
+ ### 错误码
951
+
952
+ #### 事件错误码
953
+
954
+ <table>
955
+ <thead>
956
+ <tr><th>错误字段</th><th>值</th><th>错误信息</th><th>平台</th><th>触发条件</th><th>处理建议</th></tr>
957
+ </thead>
958
+ <tbody>
959
+ <tr><td><code>event.errCode</code></td><td><code>-2002</code></td><td><code>inner audio instance not found</code></td><td>Android、iOS</td><td>实例已销毁或不存在时继续操作</td><td>重新创建上下文,不要继续使用已销毁实例。</td></tr>
960
+ <tr><td><code>event.errCode</code></td><td><code>-2003</code></td><td><code>inner audio src is empty</code></td><td>Android、iOS</td><td>未设置 src 就调用 play</td><td>设置有效 src 后重试。</td></tr>
961
+ <tr><td><code>event.errCode</code></td><td><code>-2004</code></td><td><code>inner audio src is invalid</code></td><td>Android、iOS</td><td>src 无法解析或不受支持</td><td>改用有效的 HTTP、HTTPS 地址或豆包应用插件本地文件路径。</td></tr>
962
+ <tr><td><code>event.errCode</code></td><td><code>-2005</code></td><td><code>inner audio player unavailable</code></td><td>Android、iOS</td><td>播放器无法创建或已不可用</td><td>销毁当前实例,重新创建后重试。</td></tr>
963
+ <tr><td><code>event.errCode</code></td><td><code>-2006</code></td><td><code>inner audio seek failed</code></td><td>Android、iOS</td><td>播放位置跳转失败</td><td>等待 canplay 后在音频时长范围内重试。</td></tr>
964
+ <tr><td><code>event.errCode</code></td><td><code>-2007</code></td><td><code>inner audio play failed</code></td><td>Android、iOS</td><td>音频播放失败</td><td>检查资源地址和网络状态后重试。</td></tr>
965
+ <tr><td><code>event.errCode</code></td><td><code>-2009</code></td><td><code>inner audio playback is interrupted</code></td><td>Android、iOS</td><td>播放被其他音频任务中断</td><td>根据业务需要在中断结束后重新调用 play。</td></tr>
966
+ <tr><td><code>event.errCode</code></td><td><code>-2010</code></td><td><code>inner audio runtime is unavailable</code></td><td>Android、iOS</td><td>当前页面无法创建音频实例</td><td>确保页面仍处于有效状态后重新创建实例。</td></tr>
967
+ <tr><td><code>event.errCode</code></td><td><code>-2012</code></td><td><code>invalid seek position</code></td><td>Android、iOS</td><td>seek 位置不是有限非负数</td><td>传入大于或等于 0 的秒数。</td></tr>
968
+ </tbody>
969
+ </table>
970
+
971
+ <a id="getrecordermanager"></a>
972
+ ### getRecorderManager()
973
+
974
+ # getRecorderManager
975
+
976
+ 获取全局唯一的录音管理器。
977
+
978
+ ## 扫码预览
979
+ ![扫码预览 getRecorderManager](https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=doubao%3A%2F%2Fdoubao_apps%3Fapp_id%3Ddb_1McM5Ni%26path%3D%252Fpages%252Fapi%252Fmedia%252Fget-recorder-manager%252Findex)
980
+
981
+ ## 支持版本
982
+
983
+ 前端库版本不低于 `0.0.36`。
984
+
985
+ ## 支持平台
986
+
987
+ <table>
988
+ <thead>
989
+ <tr><th>平台</th><th>支持情况</th></tr>
990
+ </thead>
991
+ <tbody>
992
+ <tr><td>Android</td><td>支持</td></tr>
993
+ <tr><td>iOS</td><td>支持</td></tr>
994
+ <tr><td>PC</td><td>不支持</td></tr>
995
+ <tr><td>HarmonyOS</td><td>不支持</td></tr>
996
+ </tbody>
997
+ </table>
998
+
999
+ ## 支持场景
1000
+
1001
+ <table>
1002
+ <thead>
1003
+ <tr><th>场景</th><th>支持情况</th></tr>
1004
+ </thead>
1005
+ <tbody>
1006
+ <tr><td>页面</td><td>支持</td></tr>
1007
+ <tr><td>卡片</td><td>不支持</td></tr>
1008
+ </tbody>
1009
+ </table>
1010
+
1011
+ ## 接入准备
1012
+
1013
+ ### 权限要求
1014
+
1015
+ <table>
1016
+ <thead>
1017
+ <tr><th>类型</th><th>标识</th><th>是否必须</th><th>平台</th><th>说明</th></tr>
1018
+ </thead>
1019
+ <tbody>
1020
+ <tr><td>应用权限</td><td><code>scope.record</code></td><td>必须</td><td>Android、iOS</td><td>需要应用录音授权</td></tr>
1021
+ <tr><td>系统权限</td><td>麦克风权限</td><td>必须</td><td>Android、iOS</td><td>需要使用系统麦克风录音</td></tr>
1022
+ </tbody>
1023
+ </table>
1024
+
1025
+ ### 授权行为
1026
+
1027
+ - **Android**:首次调用 start 时会依次申请应用录音授权和系统麦克风权限;pause、resume、stop 不重复申请。拒绝、取消或撤销授权后 start 失败,再次调用 start 会重新发起仍可展示的授权;系统不再允许弹窗时需在系统设置中开启麦克风权限。
1028
+ - **iOS**:首次调用 start 时会申请应用录音授权和系统麦克风权限;pause、resume、stop 不重复申请。拒绝或撤销后 start 失败;再次调用 start 可重新发起应用授权,系统麦克风权限需在系统设置中开启。
1029
+
1030
+ ### 前置条件
1031
+
1032
+ - 在应用权限声明中配置 scope.record,并在调用 start 前注册需要的 onError、onStop 和 onFrameRecorded 监听
1033
+
1034
+ ## 使用说明
1035
+
1036
+ - 录音包含用户敏感数据,仅在用户明确操作后开始,并在不再需要时及时调用 stop。
1037
+ - start.duration 取 1 至 600000 的正整数,单位 ms;start.format 取 aac、pcm 或 wav;start.sampleRate 取 8000、11025、12000、16000、22050、24000、32000、44100 或 48000,单位 Hz。
1038
+ - start.numberOfChannels 取 1 或 2;start.encodeBitRate 为仅在 AAC 录音时生效的正整数,单位 bps;start.frameSize 取 0 或 1 至 4096 的整数,单位 KB。
1039
+
1040
+ ## 调用方式
1041
+
1042
+ ### 同步 API
1043
+
1044
+ ```typescript
1045
+ getRecorderManager(): RecorderManager
1046
+ ```
1047
+
1048
+ ## 入参
1049
+
1050
+ 无。
1051
+
1052
+ ## 调用示例
1053
+
1054
+ ```ts
1055
+ import { getRecorderManager } from '@doubao-dev/framework/api';
1056
+
1057
+ const rm = getRecorderManager();
1058
+ rm.onError((error) => console.error('录音失败', error.errMsg));
1059
+ rm.onStop((result) => console.log('录音完成', result.tempFilePath));
1060
+ rm.start({ duration: 10000, format: 'aac' });
1061
+ ```
1062
+
1063
+ ## 返回值
1064
+
1065
+ <table>
1066
+ <thead>
1067
+ <tr><th>名称</th><th>类型</th><th>必返</th><th>说明</th></tr>
1068
+ </thead>
1069
+ <tbody>
1070
+ <tr><td><code>offError</code></td><td><code>(callback?: RecorderManagerErrorCallback) =&gt; void</code></td><td>是</td><td>取消 error 监听;省略 callback 时移除全部错误监听。</td></tr>
1071
+ <tr><td><code>offFrameRecorded</code></td><td><code>(callback?: RecorderManagerFrameRecordedCallback) =&gt; void</code></td><td>是</td><td>取消 frameRecorded 监听;省略 callback 时移除全部分片事件监听。</td></tr>
1072
+ <tr><td><code>offPause</code></td><td><code>(callback?: RecorderManagerStateCallback) =&gt; void</code></td><td>是</td><td>取消 pause 监听;省略 callback 时移除全部暂停事件监听。</td></tr>
1073
+ <tr><td><code>offResume</code></td><td><code>(callback?: RecorderManagerStateCallback) =&gt; void</code></td><td>是</td><td>取消 resume 监听;省略 callback 时移除全部恢复事件监听。</td></tr>
1074
+ <tr><td><code>offStart</code></td><td><code>(callback?: RecorderManagerStateCallback) =&gt; void</code></td><td>是</td><td>取消 start 监听;省略 callback 时移除全部开始事件监听。</td></tr>
1075
+ <tr><td><code>offStop</code></td><td><code>(callback?: RecorderManagerStopCallback) =&gt; void</code></td><td>是</td><td>取消 stop 监听;省略 callback 时移除全部停止事件监听。</td></tr>
1076
+ <tr><td><code>onError</code></td><td><code>(callback: RecorderManagerErrorCallback) =&gt; void</code></td><td>是</td><td>监听授权、录音状态和录制过程错误;回调参数 errMsg 为错误信息字符串。</td></tr>
1077
+ <tr><td><code>onFrameRecorded</code></td><td><code>(callback: RecorderManagerFrameRecordedCallback) =&gt; void</code></td><td>是</td><td>监听录音分片事件;需要在 start 时把 frameSize 设置为大于 0。回调参数包含 ArrayBuffer 类型的 frameBuffer 和布尔值 isLastFrame。</td></tr>
1078
+ <tr><td><code>onPause</code></td><td><code>(callback: RecorderManagerStateCallback) =&gt; void</code></td><td>是</td><td>监听录音暂停事件。</td></tr>
1079
+ <tr><td><code>onResume</code></td><td><code>(callback: RecorderManagerStateCallback) =&gt; void</code></td><td>是</td><td>监听录音恢复事件。</td></tr>
1080
+ <tr><td><code>onStart</code></td><td><code>(callback: RecorderManagerStateCallback) =&gt; void</code></td><td>是</td><td>监听录音开始事件。</td></tr>
1081
+ <tr><td><code>onStop</code></td><td><code>(callback: RecorderManagerStopCallback) =&gt; void</code></td><td>是</td><td>监听录音停止事件。回调参数包含 tempFilePath(字符串)、duration(毫秒)和 fileSize(字节)。</td></tr>
1082
+ <tr><td><code>pause</code></td><td><code>() =&gt; void</code></td><td>是</td><td>暂停正在进行的录音。</td></tr>
1083
+ <tr><td><code>resume</code></td><td><code>() =&gt; void</code></td><td>是</td><td>恢复已暂停的录音。</td></tr>
1084
+ <tr><td><code>start</code></td><td><code>(options?: RecorderManagerStartOptions) =&gt; void</code></td><td>是</td><td>开始录音;省略 options 时使用默认录音配置。duration 默认 60000 ms,format 默认 aac,sampleRate 默认 44100 Hz,numberOfChannels 默认 1,encodeBitRate 默认 128000 bps,frameSize 默认 0 KB。</td></tr>
1085
+ <tr><td><code>stop</code></td><td><code>() =&gt; void</code></td><td>是</td><td>停止录音并触发 onStop。</td></tr>
1086
+ </tbody>
1087
+ </table>
1088
+
1089
+ ## 平台差异
1090
+
1091
+ - **Android**:format 为 pcm 或 wav 时,必须把 frameSize 设置为 1 至 4096;输出文件为 WAV。
1092
+ - frameSize 大于 0 时使用 PCM 数据分片并输出 WAV 文件,encodeBitRate 不生效。
1093
+
1094
+ ## 相关类型
1095
+
1096
+ <a id="backgroundaudiomanagereventcallback"></a>
1097
+ ### BackgroundAudioManagerEventCallback
1098
+
1099
+ 背景音频普通事件回调。
1100
+
1101
+ #### Type
1102
+
1103
+ `() => void`
1104
+
1105
+ <a id="backgroundaudiomanagererrorcallback"></a>
1106
+ ### BackgroundAudioManagerErrorCallback
1107
+
1108
+ 背景音频错误事件回调。
1109
+
1110
+ #### Type
1111
+
1112
+ `(error: BackgroundAudioError) => void`
1113
+
1114
+ <a id="backgroundaudiomanager"></a>
1115
+ ### BackgroundAudioManager
1116
+
1117
+ 全局唯一背景音频管理器。
1118
+
1119
+ #### Properties
1120
+
1121
+ • **src**: `string` - 音频资源地址,支持 HTTP、HTTPS 地址
1122
+ • **title**: `string` - 音频标题,用于豆包背景播放信息展示
1123
+ • **epname**: `string` - 专辑名称
1124
+ • **singer**: `string` - 歌手或作者名称
1125
+ • **coverImgUrl**: `string` - 封面图片地址
1126
+ • **webUrl**: `string` - 音频关联页面地址
1127
+ • **startTime**: `number` - 开始播放的位置,单位秒,默认为 0
1128
+ • **currentTime**: `number` - 当前播放位置,单位秒
1129
+ • **duration**: `number` - 音频总时长,单位秒;资源尚未就绪时为 0
1130
+ • **paused**: `boolean` - 当前是否暂停
1131
+ • **buffered**: `number` - 当前已缓冲到的位置,单位秒
1132
+ • **playbackRate**: `number` - 播放速度,默认为 1
1133
+ • **play**: `() => void` - 播放音频;调用前需要先设置 src
1134
+ • **pause**: `() => void` - 暂停播放
1135
+ • **stop**: `() => void` - 停止播放并释放当前背景音频占用
1136
+ • **seek**: `(position: number) => void` - 跳转到指定播放位置,position 的单位为秒且不能为负数
1137
+ • **onCanplay**: `(callback: BackgroundAudioManagerEventCallback) => void` - 监听音频可以开始播放的事件
1138
+ • **offCanplay**: `(callback?: BackgroundAudioManagerEventCallback) => void` - 取消 canplay 监听;省略 callback 时移除该事件的全部监听
1139
+ • **onPlay**: `(callback: BackgroundAudioManagerEventCallback) => void` - 监听开始播放事件
1140
+ • **offPlay**: `(callback?: BackgroundAudioManagerEventCallback) => void` - 取消 play 监听;省略 callback 时移除该事件的全部监听
1141
+ • **onPause**: `(callback: BackgroundAudioManagerEventCallback) => void` - 监听暂停事件
1142
+ • **offPause**: `(callback?: BackgroundAudioManagerEventCallback) => void` - 取消 pause 监听;省略 callback 时移除该事件的全部监听
1143
+ • **onStop**: `(callback: BackgroundAudioManagerEventCallback) => void` - 监听停止事件
1144
+ • **offStop**: `(callback?: BackgroundAudioManagerEventCallback) => void` - 取消 stop 监听;省略 callback 时移除该事件的全部监听
1145
+ • **onEnded**: `(callback: BackgroundAudioManagerEventCallback) => void` - 监听自然播放结束事件
1146
+ • **offEnded**: `(callback?: BackgroundAudioManagerEventCallback) => void` - 取消 ended 监听;省略 callback 时移除该事件的全部监听
1147
+ • **onTimeUpdate**: `(callback: BackgroundAudioManagerEventCallback) => void` - 监听播放进度更新事件
1148
+ • **offTimeUpdate**: `(callback?: BackgroundAudioManagerEventCallback) => void` - 取消 timeupdate 监听;省略 callback 时移除该事件的全部监听
1149
+ • **onError**: `(callback: BackgroundAudioManagerErrorCallback) => void` - 监听播放、资源或占用冲突错误
1150
+ • **offError**: `(callback?: BackgroundAudioManagerErrorCallback) => void` - 取消 error 监听;省略 callback 时移除全部错误监听
1151
+ • **onWaiting**: `(callback: BackgroundAudioManagerEventCallback) => void` - 监听因缓冲不足而等待的事件
1152
+ • **offWaiting**: `(callback?: BackgroundAudioManagerEventCallback) => void` - 取消 waiting 监听;省略 callback 时移除该事件的全部监听
1153
+ • **onSeeking**: `(callback: BackgroundAudioManagerEventCallback) => void` - 监听开始跳转播放位置的事件
1154
+ • **offSeeking**: `(callback?: BackgroundAudioManagerEventCallback) => void` - 取消 seeking 监听;省略 callback 时移除该事件的全部监听
1155
+ • **onSeeked**: `(callback: BackgroundAudioManagerEventCallback) => void` - 监听完成跳转播放位置的事件
1156
+ • **offSeeked**: `(callback?: BackgroundAudioManagerEventCallback) => void` - 取消 seeked 监听;省略 callback 时移除该事件的全部监听
1157
+ • **onPrev**: `(callback: BackgroundAudioManagerEventCallback) => void` - 监听用户在豆包背景播放控件中点击上一首的事件
1158
+ • **offPrev**: `(callback?: BackgroundAudioManagerEventCallback) => void` - 取消 prev 监听;省略 callback 时移除该事件的全部监听
1159
+ • **onNext**: `(callback: BackgroundAudioManagerEventCallback) => void` - 监听用户在豆包背景播放控件中点击下一首的事件
1160
+ • **offNext**: `(callback?: BackgroundAudioManagerEventCallback) => void` - 取消 next 监听;省略 callback 时移除该事件的全部监听
1161
+
1162
+ <a id="backgroundaudioerror"></a>
1163
+ ### BackgroundAudioError
1164
+
1165
+ 背景音频错误信息。
1166
+
1167
+ #### Properties
1168
+
1169
+ • **errCode?**: `number` - 错误码。部分系统播放错误可能不提供稳定的业务码
1170
+ • **errMsg**: `string` - 错误信息
1171
+
1172
+ <a id="saveimagetophotosalbumparams"></a>
1173
+ ### SaveImageToPhotosAlbumParams
1174
+
1175
+ 保存图片到系统相册的请求参数。
1176
+
1177
+ #### Properties
1178
+
1179
+ • **filePath**: `string` - 需要保存的图片文件路径。支持临时文件路径或持久文件路径,不支持网络图片路径
1180
+
1181
+ <a id="previewimageparams"></a>
1182
+ ### PreviewImageParams
1183
+
1184
+ 预览图片的请求参数。
1185
+
1186
+ #### Properties
1187
+
1188
+ • **urls**: `string[]` - 需要预览的图片链接列表
1189
+ • **current?**: `string | number` - 当前显示图片的链接,或当前显示图片的下标。不填时显示 urls 中的第一张
1190
+ • **showmenu?**: `boolean` - 是否显示长按菜单,菜单支持保存图片至本地相册
1191
+ • **referrerPolicy?**: `string` - 预览页使用的 Referrer 策略
1192
+
1193
+ <a id="getimageinfoparams"></a>
1194
+ ### GetImageInfoParams
1195
+
1196
+ 获取图片信息的请求参数。
1197
+
1198
+ #### Properties
1199
+
1200
+ • **src**: `string` - 图片路径,可以是相对路径、临时文件路径、存储文件路径或网络图片路径
1201
+
1202
+ <a id="imageorientation"></a>
1203
+ ### ImageOrientation
1204
+
1205
+ 图片方向枚举。
1206
+
1207
+ #### Type
1208
+
1209
+ `| 'up'
1210
+ | 'up-mirrored'
1211
+ | 'down'
1212
+ | 'down-mirrored'
1213
+ | 'left-mirrored'
1214
+ | 'right'
1215
+ | 'right-mirrored'
1216
+ | 'left'`
1217
+
1218
+ <a id="getimageinforesult"></a>
1219
+ ### GetImageInfoResult
1220
+
1221
+ 图片信息结果。
1222
+
1223
+ #### Properties
1224
+
1225
+ • **height**: `number` - 图片原始高度,单位 px,不考虑旋转
1226
+ • **orientation**: `ImageOrientation` - 图片方向
1227
+ • **path**: `string` - 图片路径;网络图片返回原始网络地址,本地图片返回可访问的本地路径
1228
+ • **type**: `string` - 图片格式
1229
+ • **width**: `number` - 图片原始宽度,单位 px,不考虑旋转
1230
+
1231
+ <a id="chooseimagesizetype"></a>
1232
+ ### ChooseImageSizeType
1233
+
1234
+ 可选的图片尺寸类型。
1235
+
1236
+ #### Type
1237
+
1238
+ `'original' | 'compressed'`
1239
+
1240
+ <a id="chooseimagesourcetype"></a>
1241
+ ### ChooseImageSourceType
1242
+
1243
+ 可选的图片来源类型。
1244
+
1245
+ #### Type
1246
+
1247
+ `'album' | 'camera' | 'user' | 'environment'`
1248
+
1249
+ <a id="chooseimageparams"></a>
1250
+ ### ChooseImageParams
1251
+
1252
+ 选择图片的请求参数。
1253
+
1254
+ #### Properties
1255
+
1256
+ • **count?**: `number` - 最多可选图片张数。使用相机时固定返回一张图片
1257
+ • **sizeType?**: `ChooseImageSizeType[]` - 允许返回的图片尺寸类型
1258
+ • **sourceType?**: `ChooseImageSourceType[]` - 允许选择的图片来源
1259
+ • **imageId?**: `string` - H5 场景下可复用的 input 元素 ID
1260
+
1261
+ <a id="chooseimagefile"></a>
1262
+ ### ChooseImageFile
1263
+
1264
+ 选择图片返回的单个文件信息。
1265
+
1266
+ #### Properties
1267
+
1268
+ • **path**: `string` - 本地临时文件路径
1269
+ • **size**: `number` - 文件大小,单位 B
1270
+ • **type?**: `string` - 文件 MIME 类型
1271
+ • **originalFileObj?**: `File` - 原始浏览器 File 对象
1272
+
1273
+ <a id="chooseimageresult"></a>
1274
+ ### ChooseImageResult
1275
+
1276
+ 选择图片结果。
1277
+
1278
+ #### Properties
1279
+
1280
+ • **tempFilePaths**: `string[]` - 图片临时文件路径列表
1281
+ • **tempFiles**: `ChooseImageFile[]` - 图片临时文件信息列表
1282
+
1283
+ <a id="compressimageparams"></a>
1284
+ ### CompressImageParams
1285
+
1286
+ 压缩图片的请求参数。
1287
+
1288
+ #### Properties
1289
+
1290
+ • **src**: `string` - 图片路径
1291
+ • **quality?**: `number` - JPEG 输出质量
1292
+ • **compressedWidth?**: `number` - 输出图片宽度,单位 px。仅在 compressedHeight 同时为正数时调整尺寸
1293
+ • **compressedHeight?**: `number` - 输出图片高度,单位 px。仅在 compressedWidth 同时为正数时调整尺寸
1294
+
1295
+ <a id="compressimageresult"></a>
1296
+ ### CompressImageResult
1297
+
1298
+ 压缩图片结果。
1299
+
1300
+ #### Properties
1301
+
1302
+ • **tempFilePath**: `string` - 压缩后 JPEG 图片的临时文件路径
1303
+
1304
+ <a id="inneraudiocontexteventcallback"></a>
1305
+ ### InnerAudioContextEventCallback
1306
+
1307
+ 内部音频普通事件回调。
1308
+
1309
+ #### Type
1310
+
1311
+ `() => void`
1312
+
1313
+ <a id="inneraudiocontexterrorcallback"></a>
1314
+ ### InnerAudioContextErrorCallback
1315
+
1316
+ 内部音频错误事件回调。
1317
+
1318
+ #### Type
1319
+
1320
+ `(error: InnerAudioError) => void`
1321
+
1322
+ <a id="inneraudiocontext"></a>
1323
+ ### InnerAudioContext
1324
+
1325
+ 内部音频上下文。
1326
+
1327
+ #### Properties
1328
+
1329
+ • **src**: `string` - 音频资源地址,支持 HTTP、HTTPS 地址和豆包应用插件本地文件路径
1330
+ • **startTime**: `number` - 开始播放的位置,单位秒,默认为 0
1331
+ • **autoplay**: `boolean` - 设置 src 后是否自动播放,默认为 false
1332
+ • **loop**: `boolean` - 是否循环播放,默认为 false
1333
+ • **volume**: `number` - 音量,范围 0 至 1,默认为 1
1334
+ • **playbackRate**: `number` - 播放速度,豆包实际使用范围为 0.5 至 2,默认为 1
1335
+ • **currentTime**: `number` - 当前播放位置,单位秒
1336
+ • **duration**: `number` - 音频总时长,单位秒;资源尚未就绪时为 0
1337
+ • **paused**: `boolean` - 当前是否暂停
1338
+ • **buffered**: `number` - 当前已缓冲到的位置,单位秒
1339
+ • **play**: `() => void` - 播放音频;调用前需要先设置 src
1340
+ • **pause**: `() => void` - 暂停播放
1341
+ • **stop**: `() => void` - 停止播放并将播放位置归零
1342
+ • **seek**: `(position: number) => void` - 跳转到指定播放位置,position 的单位为秒且不能为负数
1343
+ • **destroy**: `() => void` - 销毁当前上下文并释放播放资源;销毁后不能继续调用
1344
+ • **onCanplay**: `(callback: InnerAudioContextEventCallback) => void` - 监听音频可以开始播放的事件
1345
+ • **offCanplay**: `(callback?: InnerAudioContextEventCallback) => void` - 取消 canplay 监听;省略 callback 时移除该事件的全部监听
1346
+ • **onPlay**: `(callback: InnerAudioContextEventCallback) => void` - 监听开始播放事件
1347
+ • **offPlay**: `(callback?: InnerAudioContextEventCallback) => void` - 取消 play 监听;省略 callback 时移除该事件的全部监听
1348
+ • **onPause**: `(callback: InnerAudioContextEventCallback) => void` - 监听暂停事件
1349
+ • **offPause**: `(callback?: InnerAudioContextEventCallback) => void` - 取消 pause 监听;省略 callback 时移除该事件的全部监听
1350
+ • **onStop**: `(callback: InnerAudioContextEventCallback) => void` - 监听停止事件
1351
+ • **offStop**: `(callback?: InnerAudioContextEventCallback) => void` - 取消 stop 监听;省略 callback 时移除该事件的全部监听
1352
+ • **onEnded**: `(callback: InnerAudioContextEventCallback) => void` - 监听自然播放结束事件
1353
+ • **offEnded**: `(callback?: InnerAudioContextEventCallback) => void` - 取消 ended 监听;省略 callback 时移除该事件的全部监听
1354
+ • **onTimeUpdate**: `(callback: InnerAudioContextEventCallback) => void` - 监听播放进度更新事件
1355
+ • **offTimeUpdate**: `(callback?: InnerAudioContextEventCallback) => void` - 取消 timeupdate 监听;省略 callback 时移除该事件的全部监听
1356
+ • **onError**: `(callback: InnerAudioContextErrorCallback) => void` - 监听播放、参数或资源错误
1357
+ • **offError**: `(callback?: InnerAudioContextErrorCallback) => void` - 取消 error 监听;省略 callback 时移除全部错误监听
1358
+ • **onWaiting**: `(callback: InnerAudioContextEventCallback) => void` - 监听因缓冲不足而等待的事件
1359
+ • **offWaiting**: `(callback?: InnerAudioContextEventCallback) => void` - 取消 waiting 监听;省略 callback 时移除该事件的全部监听
1360
+ • **onSeeking**: `(callback: InnerAudioContextEventCallback) => void` - 监听开始跳转播放位置的事件
1361
+ • **offSeeking**: `(callback?: InnerAudioContextEventCallback) => void` - 取消 seeking 监听;省略 callback 时移除该事件的全部监听
1362
+ • **onSeeked**: `(callback: InnerAudioContextEventCallback) => void` - 监听完成跳转播放位置的事件
1363
+ • **offSeeked**: `(callback?: InnerAudioContextEventCallback) => void` - 取消 seeked 监听;省略 callback 时移除该事件的全部监听
1364
+
1365
+ <a id="inneraudioerror"></a>
1366
+ ### InnerAudioError
1367
+
1368
+ 内部音频错误信息。
1369
+
1370
+ #### Properties
1371
+
1372
+ • **errCode?**: `number` - 错误码。部分系统播放错误可能不提供该字段
1373
+ • **errMsg**: `string` - 错误信息
1374
+
1375
+ <a id="recordermanagerstartoptions"></a>
1376
+ ### RecorderManagerStartOptions
1377
+
1378
+ 开始录音的配置参数。
1379
+
1380
+ #### Properties
1381
+
1382
+ • **duration?**: `number` - 录音时长,单位 ms
1383
+ • **format?**: `RecorderFormat` - 录音格式。Android 录制 pcm 或 wav 时必须同时设置大于 0 的 frameSize
1384
+ • **sampleRate?**: `RecorderSampleRate` - 采样率
1385
+ • **numberOfChannels?**: `RecorderNumberOfChannels` - 录音通道数
1386
+ • **encodeBitRate?**: `number` - AAC 编码码率,单位 bps;分片录音输出 PCM/WAV 时不生效
1387
+ • **frameSize?**: `number` - 帧大小,单位 KB。大于 0 时通过 onFrameRecorded 回调分片数据,并输出 WAV 文件
1388
+
1389
+ <a id="recordermanagerstatecallback"></a>
1390
+ ### RecorderManagerStateCallback
1391
+
1392
+ #### Type
1393
+
1394
+ `() => void`
1395
+
1396
+ <a id="recordermanagerstopcallback"></a>
1397
+ ### RecorderManagerStopCallback
1398
+
1399
+ #### Type
1400
+
1401
+ `(event: RecorderManagerStopEvent) => void`
1402
+
1403
+ <a id="recordermanagererrorcallback"></a>
1404
+ ### RecorderManagerErrorCallback
1405
+
1406
+ #### Type
1407
+
1408
+ `(event: RecorderManagerErrorEvent) => void`
1409
+
1410
+ <a id="recordermanagerframerecordedcallback"></a>
1411
+ ### RecorderManagerFrameRecordedCallback
1412
+
1413
+ #### Type
1414
+
1415
+ `(event: RecorderManagerFrameRecordedEvent) => void`
1416
+
1417
+ <a id="recordermanager"></a>
1418
+ ### RecorderManager
1419
+
1420
+ 全局唯一的录音管理器。通过 getRecorderManager 获取实例。
1421
+
1422
+ #### Properties
1423
+
1424
+ • **start**: `(options?: RecorderManagerStartOptions) => void` - 开始录音;省略 options 时使用默认录音配置。duration 默认 60000 ms,format 默认 aac,sampleRate 默认 44100 Hz,numberOfChannels 默认 1,encodeBitRate 默认 128000 bps,frameSize 默认 0 KB
1425
+ • **pause**: `() => void` - 暂停正在进行的录音
1426
+ • **resume**: `() => void` - 恢复已暂停的录音
1427
+ • **stop**: `() => void` - 停止录音并触发 onStop
1428
+ • **onStart**: `(callback: RecorderManagerStateCallback) => void` - 监听录音开始事件
1429
+ • **offStart**: `(callback?: RecorderManagerStateCallback) => void` - 取消 start 监听;省略 callback 时移除全部开始事件监听
1430
+ • **onPause**: `(callback: RecorderManagerStateCallback) => void` - 监听录音暂停事件
1431
+ • **offPause**: `(callback?: RecorderManagerStateCallback) => void` - 取消 pause 监听;省略 callback 时移除全部暂停事件监听
1432
+ • **onResume**: `(callback: RecorderManagerStateCallback) => void` - 监听录音恢复事件
1433
+ • **offResume**: `(callback?: RecorderManagerStateCallback) => void` - 取消 resume 监听;省略 callback 时移除全部恢复事件监听
1434
+ • **onStop**: `(callback: RecorderManagerStopCallback) => void` - 监听录音停止事件。回调参数包含 tempFilePath(字符串)、duration(毫秒)和 fileSize(字节)
1435
+ • **offStop**: `(callback?: RecorderManagerStopCallback) => void` - 取消 stop 监听;省略 callback 时移除全部停止事件监听
1436
+ • **onError**: `(callback: RecorderManagerErrorCallback) => void` - 监听授权、录音状态和录制过程错误;回调参数 errMsg 为错误信息字符串
1437
+ • **offError**: `(callback?: RecorderManagerErrorCallback) => void` - 取消 error 监听;省略 callback 时移除全部错误监听
1438
+ • **onFrameRecorded**: `(callback: RecorderManagerFrameRecordedCallback) => void` - 监听录音分片事件;需要在 start 时把 frameSize 设置为大于 0。回调参数包含 ArrayBuffer 类型的 frameBuffer 和布尔值 isLastFrame
1439
+ • **offFrameRecorded**: `(callback?: RecorderManagerFrameRecordedCallback) => void` - 取消 frameRecorded 监听;省略 callback 时移除全部分片事件监听
1440
+
1441
+ <a id="recorderformat"></a>
1442
+ ### RecorderFormat
1443
+
1444
+ 录音格式。
1445
+
1446
+ #### Type
1447
+
1448
+ `'aac' | 'pcm' | 'wav'`
1449
+
1450
+ <a id="recordersamplerate"></a>
1451
+ ### RecorderSampleRate
1452
+
1453
+ 录音采样率。
1454
+
1455
+ #### Type
1456
+
1457
+ `8000 | 11025 | 12000 | 16000 | 22050 | 24000 | 32000 | 44100 | 48000`
1458
+
1459
+ <a id="recordernumberofchannels"></a>
1460
+ ### RecorderNumberOfChannels
1461
+
1462
+ 录音通道数。
1463
+
1464
+ #### Type
1465
+
1466
+ `1 | 2`
1467
+
1468
+ <a id="recordermanagerstopevent"></a>
1469
+ ### RecorderManagerStopEvent
1470
+
1471
+ 录音停止事件数据。
1472
+
1473
+ #### Properties
1474
+
1475
+ • **tempFilePath**: `string` - 录音文件的临时路径
1476
+ • **duration**: `number` - 录音时长,单位 ms
1477
+ • **fileSize**: `number` - 录音文件大小,单位 B
1478
+
1479
+ <a id="recordermanagererrorevent"></a>
1480
+ ### RecorderManagerErrorEvent
1481
+
1482
+ 录音错误事件数据。
1483
+
1484
+ #### Properties
1485
+
1486
+ • **errMsg**: `string` - 错误信息
1487
+
1488
+ <a id="recordermanagerframerecordedevent"></a>
1489
+ ### RecorderManagerFrameRecordedEvent
1490
+
1491
+ 录音分片事件数据。
1492
+
1493
+ #### Properties
1494
+
1495
+ • **frameBuffer**: `ArrayBuffer` - 当前帧数据,ArrayBuffer 类型
1496
+ • **isLastFrame**: `boolean` - 是否为最后一帧