1# @ohos.app.ability.autoFillManager (自动填充框架) 2 3<!--Kit: Ability Kit--> 4<!--Subsystem: Ability--> 5<!--Owner: @hanchen45; @Luobniz21--> 6<!--Designer: @ccllee1--> 7<!--Tester: @lixueqing513--> 8<!--Adviser: @huipeizi--> 9 10autoFillManager模块为应用提供账号、密码、地址、电话号码等用户信息的自动填充能力。 11 12不同于页面切换时触发的系统自动保存功能,该功能需要由用户手动触发。例如用户在网站上输入了账号密码,并点击“保存”按钮,才能触发相应的自动保存操作。 13 14> **说明:** 15> 16> 本模块首批接口从API version 11 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 17> 18> 本模块接口仅可在Stage模型下使用。 19 20## 导入模块 21 22```ts 23import { autoFillManager } from '@kit.AbilityKit'; 24``` 25 26## AutoSaveCallback 27 28当保存请求完成时所触发的回调接口。 29 30### onSuccess 31 32onSuccess(): void 33 34当保存请求成功时,该回调被调用。 35 36**原子化服务API**:从API version 12开始,该接口支持在原子化服务中使用。 37 38**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 39 40**示例:** 41 42参见[AutoSaveCallback.onFailure](#onfailure)。 43 44### onFailure 45 46onFailure(): void 47 48当保存请求失败时,该回调被调用。 49 50**原子化服务API**:从API version 12开始,该接口支持在原子化服务中使用。 51 52**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 53 54**示例:** 55 56 ```ts 57// Index.ets, 含有账号、密码框等组件的页面 58import { autoFillManager } from '@kit.AbilityKit'; 59import { UIContext } from '@kit.ArkUI'; 60import { BusinessError } from '@kit.BasicServicesKit'; 61 62let uiContext = AppStorage.get<UIContext>("uiContext"); 63let callback: autoFillManager.AutoSaveCallback = { 64 onSuccess: () => { 65 console.info(`save request on success.`); 66 }, 67 onFailure: () => { 68 console.error(`save request on failure.`); 69 } 70}; 71 72@Entry 73@Component 74struct Index { 75 build() { 76 Button('requestAutoSave') 77 .onClick(() => { 78 try { 79 // 发起保存请求 80 autoFillManager.requestAutoSave(uiContext, callback); 81 } catch (error) { 82 console.error(`catch error, code: ${(error as BusinessError).code}, message: ${(error as BusinessError).message}`); 83 } 84 }) 85 } 86} 87 ``` 88 89> **说明:** 90> 91> 示例中从AppStorage中取得的UiContext为预先在EntryAbility(拉起此页面的Ability)中OnWindowStageCreate生命周期获得,并存储到AppStorage中,具体可参考[requestAutoSave](#autofillmanagerrequestautosave)。 92 93## autoFillManager.requestAutoSave 94 95requestAutoSave(context: UIContext, callback?: AutoSaveCallback): void 96 97请求保存表单数据,使用callback异步回调。 98如果当前表单没有提供表单切换的功能,可以通过此接口保存历史表单输入数据,保存请求完成时会触发该回调。 99 100**原子化服务API**:从API version 12开始,该接口支持在原子化服务中使用。 101 102**系统能力**:SystemCapability.Ability.AbilityRuntime.AbilityCore 103 104**参数:** 105 106| 参数名 | 类型 | 必填 | 说明 | 107| -------- | -------- | -------- | -------- | 108| context | [UIContext](../apis-arkui/arkts-apis-uicontext-uicontext.md) | 是 | 将在其中执行保存操作的UI上下文。 | 109| callback | [AutoSaveCallback](#autosavecallback) | 否 | 当保存请求完成时所触发的回调接口。| 110 111**错误码:** 112 113以下错误码的详细介绍请参考[通用错误码](../errorcode-universal.md)和[元能力子系统错误码](errorcode-ability.md)。 114| 错误码ID | 错误信息 | 115| ------- | -------------------------------- | 116| 401 | The parameter check failed. Possible causes: 1. Get instance id failed; 2. Parse instance id failed; 3. The second parameter is not of type callback. | 117| 16000050 | Internal error. | 118 119**示例:** 120 121 ```ts 122// EntryAbility.ets 123import { UIAbility, common } from '@kit.AbilityKit'; 124import { BusinessError } from '@kit.BasicServicesKit'; 125import { window, UIContext } from '@kit.ArkUI'; 126import { hilog } from '@kit.PerformanceAnalysisKit'; 127 128export default class EntryAbility extends UIAbility { 129 onWindowStageCreate(windowStage: window.WindowStage): void { 130 // Main window is created, set main page for this ability 131 hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); 132 let localStorageData: Record<string, string | common.UIAbilityContext> = { 133 'message': "AutoFill Page", 134 'context': this.context, 135 }; 136 let storage = new LocalStorage(localStorageData); 137 windowStage.loadContent('pages/Index', storage, (err, data) => { 138 if (err && err.code) { 139 hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); 140 return; 141 } 142 // Obtain the main window. 143 windowStage.getMainWindow((err: BusinessError, data: window.Window) => { 144 let errCode: number = err?.code; 145 if (errCode) { 146 console.error('Failed to obtain the main window. Cause: ' + JSON.stringify(err)); 147 return; 148 } 149 console.info('Succeeded in obtaining the main window. Data: ' + JSON.stringify(data)); 150 // get UIContext instance. 151 let uiContext: UIContext = windowStage.getMainWindowSync().getUIContext(); 152 PersistentStorage.persistProp("uiContext", uiContext); 153 }) 154 hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); 155 }); 156 } 157} 158 ``` 159 160 ```ts 161 // Index.ets 162import { autoFillManager } from '@kit.AbilityKit'; 163import { UIContext } from '@kit.ArkUI'; 164import { BusinessError } from '@kit.BasicServicesKit'; 165 166@Entry 167@Component 168struct Index { 169 build() { 170 Row() { 171 Column() { 172 Text('Hello World') 173 .fontSize(50) 174 .fontWeight(FontWeight.Bold) 175 } 176 177 Button('requestAutoSave') 178 .onClick(() => { 179 let uiContext = AppStorage.get<UIContext>("uiContext"); 180 console.info("uiContext: ", JSON.stringify(uiContext)); 181 try { 182 // 发起保存请求 183 autoFillManager.requestAutoSave(uiContext, { 184 onSuccess: () => { 185 console.info(`save request on success.`); 186 }, 187 onFailure: () => { 188 console.error(`save request on failure.`); 189 } 190 }); 191 } catch (error) { 192 console.error(`catch error, code: ${(error as BusinessError).code}, message: ${(error as BusinessError).message}`); 193 } 194 }) 195 .width('100%') 196 } 197 .height('100%') 198 } 199} 200 ``` 201