提交 e98b9d60 编写于 作者: Z zaki

Modify the accessible subsystem document and add the description of the api error code

Signed-off-by: Nzaki <zhoujun141@huawei.com>
Change-Id: I5b687b801855bbf51cea600847e116179706889a
上级 934b06ac
......@@ -11,7 +11,7 @@ GesturePath表示手势路径信息。
## 导入模块
```ts
import GesturePath from "@ohos.accessibility.GesturePath";
import GesturePath from '@ohos.accessibility.GesturePath';
```
## GesturePath
......@@ -43,7 +43,7 @@ constructor(durationTime: number);
**示例:**
```typescript
```ts
let durationTime = 20;
let gesturePath = new GesturePath(durationTime);
```
......@@ -11,7 +11,7 @@ GesturePoint表示手势触摸点。
## 导入模块
```ts
import GesturePoint from "@ohos.accessibility.GesturePoint";
import GesturePoint from '@ohos.accessibility.GesturePoint';
```
## GesturePoint
......@@ -44,7 +44,7 @@ constructor(positionX: number, positionY: number);
**示例:**
```typescript
```ts
let positionX = 1;
let positionY = 2;
let gesturePoint = new GesturePoint(positionX, positionY);
......
......@@ -8,8 +8,8 @@
## 导入模块
```typescript
import config from "@ohos.accessibility.config";
```ts
import config from '@ohos.accessibility.config';
```
## 属性
......@@ -27,171 +27,243 @@ import config from "@ohos.accessibility.config";
| mouseKey | [Config](#config)\<boolean>| 是 | 是 | 表示鼠标键功能启用状态。 |
| mouseAutoClick | [Config](#config)\<number>| 是 | 是 | 表示鼠标自动点击功能启用状态。取值 0~5000,单位为毫秒。 |
| shortkey | [Config](#config)\<boolean>| 是 | 是 | 表示辅助扩展快捷键功能启用状态。 |
| shortkeyTarget | [Config](#config)\<string>| 是 | 是 | 表示辅助扩展快捷键的目标配置。取值为辅助应用的名称,格式为:"bundleName/abilityName"。 |
| shortkeyTarget | [Config](#config)\<string>| 是 | 是 | 表示辅助扩展快捷键的目标配置。取值为辅助应用的名称,格式为:'bundleName/abilityName'。 |
| captions | [Config](#config)\<boolean>| 是 | 是 | 表示辅助字幕功能启用状态。 |
| captionsStyle | [Config](#config)\<[accessibility.CaptionsStyle](./js-apis-accessibility.md#captionsstyle8)>| 是 | 是 | 表示辅助字幕的配置。 |
| captionsStyle | [Config](#config)\<[CaptionsStyle](js-apis-accessibility.md#captionsstyle8)>| 是 | 是 | 表示辅助字幕的配置。 |
## enableAbility
enableAbility(name: string, capability: Array&lt;[accessibility.Capability](./js-apis-accessibility.md#capability)&gt;): Promise&lt;void&gt;;
enableAbility(name: string, capability: Array&lt;accessibility.Capability&gt;): Promise&lt;void&gt;;
启用辅助扩展。
启用辅助扩展,使用Promise异步回调
**系统能力**:SystemCapability.BarrierFree.Accessibility.Core
**参数:**
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| name | string | 是 | 辅助应用的名称,格式为:"bundleName/abilityName"。 |
| capability | Array&lt;[accessibility.Capability](./js-apis-accessibility.md#capability)&gt;) | 是 | 辅助应用的能力属性。 |
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| name | string | 是 | 辅助应用的名称,格式为:'bundleName/abilityName'。 |
| capability | Array&lt;[accessibility.Capability](js-apis-accessibility.md#capability)&gt;) | 是 | 辅助应用的能力属性。 |
**返回值:**
| 类型 | 说明 |
| -------- | -------- |
| Promise&lt;void&gt; | Promise实例,用于返回方法执行结果。 |
| 类型 | 说明 |
| -------- | -------- |
| Promise&lt;void&gt; | 无返回结果的Promise对象。 |
**错误码:**
以下错误码的详细介绍请参见[无障碍子系统错误码](../errorcodes/errorcode-accessibility.md)
| 错误码ID | 错误信息 |
| ------- | -------------------------------- |
| 9300001 | Invalid bundle name or ability name. |
| 9300002 | Target ability already enabled. |
**示例:**
```typescript
config.enableAbility("com.ohos.example/axExtension", ['retrieve'])
.then(() => {
console.info('enable succeed');
}).catch((error) => {
console.error('enable failed');
});
```ts
let name = 'com.ohos.example/axExtension';
let capability = ['retrieve'];
try {
config.enableAbility(name, capability).then(() => {
console.info('enable ability succeed');
}).catch((err) => {
console.error('failed to enable ability, because ' + JSON.stringify(err));
});
} catch (exception) {
console.error('failed to enable ability, because ' + JSON.stringify(exception));
};
```
## enableAbility
enableAbility(name: string, capability: Array&lt;[accessibility.Capability](./js-apis-accessibility.md#capability)&gt;, callback: AsyncCallback&lt;void&gt;): void;
enableAbility(name: string, capability: Array&lt;accessibility.Capability&gt;, callback: AsyncCallback&lt;void&gt;): void;
启用辅助扩展。
启用辅助扩展,使用callback异步回调
**系统能力**:SystemCapability.BarrierFree.Accessibility.Core
**参数:**
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| name | string | 是 | 辅助应用的名称,格式为:"bundleName/abilityName"。 |
| capability | Array&lt;[accessibility.Capability](./js-apis-accessibility.md#capability)&gt; | 是 | 辅助应用的能力属性。 |
| callback | AsyncCallback&lt;void&gt; | 是 | 回调函数,返回方法执行结果。 |
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| name | string | 是 | 辅助应用的名称,格式为:'bundleName/abilityName'。 |
| capability | Array&lt;[accessibility.Capability](js-apis-accessibility.md#capability)&gt; | 是 | 辅助应用的能力属性。 |
| callback | AsyncCallback&lt;void&gt; | 是 | 回调函数。 |
**错误码:**
以下错误码的详细介绍请参见[无障碍子系统错误码](../errorcodes/errorcode-accessibility.md)。
| 错误码ID | 错误信息 |
| ------- | -------------------------------- |
| 9300001 | Invalid bundle name or ability name. |
| 9300002 | Target ability already enabled. |
**示例:**
```typescript
config.enableAbility("com.ohos.example/axExtension", ['retrieve'], (err, data) => {
if (err) {
console.error('enable failed');
return;
}
console.info('enable succeed');
})
```
```ts
let name = 'com.ohos.example/axExtension';
let capability = ['retrieve'];
try {
config.enableAbility(name, capability, (err, data) => {
if (err) {
console.error('failed to enable ability, because ' + JSON.stringify(err));
return;
}
console.info('enable ability succeed');
});
} catch (exception) {
console.error('failed to enable ability, because ' + JSON.stringify(exception));
};
```
## disableAbility
disableAbility(name: string): Promise&lt;void&gt;;
关闭辅助扩展。
关闭辅助扩展,使用Promise异步回调
**系统能力**:SystemCapability.BarrierFree.Accessibility.Core
**参数:**
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| name | string | 是 | 辅助应用的名称,格式为:"bundleName/abilityName"。 |
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| name | string | 是 | 辅助应用的名称,格式为:'bundleName/abilityName'。 |
**返回值:**
| 类型 | 说明 |
| -------- | -------- |
| Promise&lt;void&gt; | Promise实例,用于返回方法执行结果。 |
| 类型 | 说明 |
| -------- | -------- |
| Promise&lt;void&gt; | 无返回结果的Promise对象。 |
**错误码:**
以下错误码的详细介绍请参见[无障碍子系统错误码](../errorcodes/errorcode-accessibility.md)。
| 错误码ID | 错误信息 |
| ------- | -------------------------------- |
| 9300001 | Invalid bundle name or ability name. |
**示例:**
```typescript
config.disableAbility("com.ohos.example/axExtension")
.then(() => {
console.info('disable succeed');
}).catch((error) => {
console.error('disable failed');
});
```
```ts
let name = 'com.ohos.example/axExtension';
try {
config.enableAbility(name).then(() => {
console.info('disable ability succeed');
}).catch((err) => {
console.error('failed to disable ability, because ' + JSON.stringify(err));
});
} catch (exception) {
console.error('failed to disable ability, because ' + JSON.stringify(exception));
};
```
## disableAbility
disableAbility(name: string, callback: AsyncCallback&lt;void&gt;): void;
关闭辅助扩展。
关闭辅助扩展,使用callback异步回调
**系统能力**:SystemCapability.BarrierFree.Accessibility.Core
**参数:**
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| name | string | 是 | 辅助应用的名称,格式为:"bundleName/abilityName"。 |
| callback | AsyncCallback&lt;void&gt; | 是 | 回调函数,返回方法执行结果。 |
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| name | string | 是 | 辅助应用的名称,格式为:'bundleName/abilityName'。 |
| callback | AsyncCallback&lt;void&gt; | 是 | 回调函数。 |
**错误码:**
以下错误码的详细介绍请参见[无障碍子系统错误码](../errorcodes/errorcode-accessibility.md)。
| 错误码ID | 错误信息 |
| ------- | -------------------------------- |
| 9300001 | Invalid bundle name or ability name. |
**示例:**
```typescript
config.disableAbility("com.ohos.example/axExtension", (err, data) => {
if (err) {
console.error('disable failed');
return;
}
console.info('disable succeed');
})
```
```ts
let name = 'com.ohos.example/axExtension';
try {
config.disableAbility(name, (err, data) => {
if (err) {
console.error('failed to enable ability, because ' + JSON.stringify(err));
return;
}
console.info('disable succeed');
});
} catch (exception) {
console.error('failed to enable ability, because ' + JSON.stringify(exception));
};
```
## on('enableAbilityListsStateChanged')
## on('enabledAccessibilityExtensionListChange')
on(type: 'enableAbilityListsStateChanged', callback: Callback&lt;void&gt;): void;
on(type: 'enabledAccessibilityExtensionListChange', callback: Callback&lt;void&gt;): void;
添加启用的辅助扩展的列表变化监听。
添加启用的辅助扩展的列表变化监听,使用callback异步回调
**系统能力**:SystemCapability.BarrierFree.Accessibility.Core
**参数:**
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| type | string | 是 | 参数固定为enableAbilityListsStateChanged,监听启用的辅助扩展的列表变化。 |
| callback | Callback&lt;void&gt; | 是 | 回调函数,在启用的辅助扩展的列表变化时通过此函数进行通知。 |
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| type | string | 是 | 参数固定为enabledAccessibilityExtensionListChange,监听启用的辅助扩展的列表变化。 |
| callback | Callback&lt;void&gt; | 是 | 回调函数,在启用的辅助扩展的列表变化时通过此函数进行通知。 |
**示例:**
```typescript
config.on('enableAbilityListsStateChanged',() => {
console.info('ax extension ability enable list changed');
});
```
```ts
try {
config.on('enabledAccessibilityExtensionListChange', () => {
console.info('subscribe enabled accessibility extension list change state success');
}).catch((err) => {
console.error('failed to subscribe enabled accessibility extension list change state, because ' +
JSON.stringify(err));
});
} catch (exception) {
console.error('failed to subscribe enabled accessibility extension list change state, because ' +
JSON.stringify(exception));
};
```
## off('enableAbilityListsStateChanged')
## off('enabledAccessibilityExtensionListChange')
off(type: 'enableAbilityListsStateChanged', callback?: Callback&lt;void&gt;): void;
off(type: 'enabledAccessibilityExtensionListChange', callback?: Callback&lt;void&gt;): void;
取消启用的辅助扩展的列表变化监听。
取消启用的辅助扩展的列表变化监听,使用callback异步回调
**系统能力**:SystemCapability.BarrierFree.Accessibility.Core
**参数:**
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| type | string | 否 | 参数固定为enableAbilityListsStateChanged,监听启用的辅助扩展的列表变化。 |
| callback | Callback&lt;void&gt; | 否 | 要取消的监听回调函数。 |
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| type | string | 否 | 参数固定为enabledAccessibilityExtensionListChange,监听启用的辅助扩展的列表变化。 |
| callback | Callback&lt;void&gt; | 否 | 要取消的监听回调函数。 |
**示例:**
```typescript
config.off('enableAbilityListsStateChanged');
```
```ts
try {
config.off('enabledAccessibilityExtensionListChange', () => {
console.info('unSubscribe enabled accessibility extension list change state success');
}).catch((err) => {
console.error('failed to unSubscribe enabled accessibility extension list change state, because ' +
JSON.stringify(err));
});
} catch (exception) {
console.error('failed to unSubscribe enabled accessibility extension list change state, because ' +
JSON.stringify(exception));
};
```
## Config
......@@ -201,152 +273,178 @@ off(type: 'enableAbilityListsStateChanged', callback?: Callback&lt;void&gt;): vo
set(value: T): Promise&lt;void&gt;;
设置属性。
设置属性,使用Promise异步回调
**系统能力**:SystemCapability.BarrierFree.Accessibility.Core
**参数:**
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| value | T | 是 | 设置的属性值。 |
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| value | T | 是 | 设置的属性值。 |
**返回值:**
| 类型 | 说明 |
| -------- | -------- |
| Promise&lt;void&gt; | Promise实例,用于返回方法执行结果。 |
| 类型 | 说明 |
| -------- | -------- |
| Promise&lt;void&gt; | 无返回结果的Promise对象。 |
**示例:**
```typescript
config.highContrastText.set(true)
.then(() => {
console.info('highContrastText set succeed');
}).catch((error) => {
console.error('highContrastText set failed');
});
```
```ts
let value = true;
try {
config.highContrastText.set(value).then(() => {
console.info('set highContrastText succeed');
}).catch((err) => {
console.error('failed to set highContrastText, because ' + JSON.stringify(err));
});
} catch (exception) {
console.error('failed to set config, because ' + JSON.stringify(exception));
};
```
### set
set(value: T, callback: AsyncCallback&lt;void&gt;): void;
设置属性。
设置属性,使用callback异步回调
**系统能力**:SystemCapability.BarrierFree.Accessibility.Core
**参数:**
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| value | T | 是 | 设置的属性值。 |
| callback | AsyncCallback&lt;void&gt; | 是 | 回调函数,返回方法执行结果。 |
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| value | T | 是 | 设置的属性值。 |
| callback | AsyncCallback&lt;void&gt; | 是 | 回调函数。 |
**示例:**
```typescript
config.highContrastText.set(true, (err, data) => {
if (err) {
console.error('highContrastText set failed');
return;
}
console.info('highContrastText set succeed');
})
```
```ts
let value = true;
try {
config.highContrastText.set(value, (err, data) => {
if (err) {
console.error('failed to set highContrastText, because ' + JSON.stringify(err));
return;
}
console.info('set highContrastText succeed');
});
} catch (exception) {
console.error('failed to set config, because ' + JSON.stringify(exception));
};
```
### get
get(): Promise&lt;T&gt;;
获取属性。
获取属性,使用Promise异步回调
**系统能力**:SystemCapability.BarrierFree.Accessibility.Core
**返回值:**
| 类型 | 说明 |
| -------- | -------- |
| Promise&lt;T&gt; | Promise实例,用于返回属性值。 |
| 类型 | 说明 |
| -------- | -------- |
| Promise&lt;T&gt; | Promise对象,返回对应属性值。 |
**示例:**
```typescript
config.highContrastText.get()
.then((value) => {
console.info('highContrastText get succeed');
}).catch((error) => {
console.error('highContrastText get failed');
});
```
```ts
let value;
config.highContrastText.get().then((data) => {
value = data;
console.info('get highContrastText success');
}).catch((err) => {
console.error('failed to get highContrastText, because ' + JSON.stringify(err));
});
```
### get
get(callback: AsyncCallback&lt;T&gt;): void;
获取属性。
获取属性,使用callback异步回调
**系统能力**:SystemCapability.BarrierFree.Accessibility.Core
**参数:**
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| callback | AsyncCallback&lt;void&gt; | 是 | 回调函数,返回属性值。 |
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| callback | AsyncCallback&lt;void&gt; | 是 | 回调函数,返回属性值。 |
**示例:**
```typescript
config.highContrastText.get((err, data) => {
if (err) {
console.error('highContrastText get failed');
return;
}
console.info('highContrastText get succeed');
})
```
```ts
let value;
config.highContrastText.get((err, data) => {
if (err) {
console.error('failed to get highContrastText, because ' + JSON.stringify(err));
return;
}
value = data;
console.info('get highContrastText success');
});
```
### on
on(callback: Callback&lt;T&gt;): void;
添加属性变化监听。
添加属性变化监听,使用callback异步回调
**系统能力**:SystemCapability.BarrierFree.Accessibility.Core
**参数:**
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| callback | Callback&lt;T&gt; | 是 | 回调函数,在属性变化时通过此函数进行通知。 |
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| callback | Callback&lt;T&gt; | 是 | 回调函数,在属性变化时通过此函数进行通知。 |
**示例:**
```typescript
config.highContrastText.on(() => {
console.info('highContrastText changed');
});
```
```ts
try {
config.highContrastText.on((err, data) => {
if (err) {
console.error('failed subscribe highContrastText, because ' + JSON.stringify(err));
return;
}
console.info('subscribe highContrastText success');
});
} catch (exception) {
console.error('failed subscribe highContrastText, because ' + JSON.stringify(exception));
}
```
### off
off(callback?: Callback&lt;T&gt;): void;
取消属性变化监听。
取消属性变化监听,使用callback异步回调
**系统能力**:SystemCapability.BarrierFree.Accessibility.Core
**参数:**
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| callback | Callback&lt;T&gt; | 否 | 要取消的监听回调函数。 |
| 参数名 | 参数类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| callback | Callback&lt;T&gt; | 否 | 要取消的监听回调函数。 |
**示例:**
```typescript
config.highContrastText.off();
```
```ts
config.highContrastText.off((err, data) => {
if (err) {
console.error('failed unSubscribe highContrastText, because ' + JSON.stringify(err));
return;
}
console.info('unSubscribe highContrastText success');
});
```
## DaltonizationColorFilter
......
......@@ -94,8 +94,10 @@ onConnect(): void;
**示例:**
```ts
onConnect(): void {
console.log("AxExtensionAbility onConnect");
class MyAccessibilityExtensionAbility extends AccessibilityExtensionAbility {
onConnect() {
console.log('AxExtensionAbility onConnect');
}
};
```
......@@ -110,8 +112,10 @@ onDisconnect(): void;
**示例:**
```ts
onDisconnect(): void {
console.log("AxExtensionAbility onDisconnect");
class MyAccessibilityExtensionAbility extends AccessibilityExtensionAbility {
onDisconnect() {
console.log('AxExtensionAbility onDisconnect');
}
};
```
......@@ -127,15 +131,17 @@ onAccessibilityEvent(event: AccessibilityEvent): void;
| 参数名 | 参数类型 | 必填 | 说明 |
| ----- | ---------------------------------------- | ---- | --------------- |
| event | [AccessibilityEvent](accessibilityevent) | 是 | 无障碍事件回调函数。无返回值。 |
| event | [AccessibilityEvent](#accessibilityevent) | 是 | 无障碍事件回调函数。无返回值。 |
**示例:**
```ts
onAccessibilityEvent(event: AccessibilityEvent): void {
console.log("AxExtensionAbility onAccessibilityEvent");
if (event.eventType == 'click') {
console.log("AxExtensionAbility onAccessibilityEvent: click");
class MyAccessibilityExtensionAbility extends AccessibilityExtensionAbility {
onAccessibilityEvent(event) {
console.log('AxExtensionAbility onAccessibilityEvent');
if (event.eventType == 'click') {
console.log('AxExtensionAbility onAccessibilityEvent: click');
}
}
};
```
......@@ -157,12 +163,14 @@ onKeyEvent(keyEvent: KeyEvent): boolean;
**示例:**
```ts
onKeyEvent(keyEvent: inputEventClient.KeyEvent): boolean {
console.log("AxExtensionAbility onKeyEvent");
if (keyEvent.keyCode == 22) {
console.log("AxExtensionAbility onKeyEvent: intercept 22");
return true;
class MyAccessibilityExtensionAbility extends AccessibilityExtensionAbility {
onKeyEvent(keyEvent) {
console.log('AxExtensionAbility onKeyEvent');
if (keyEvent.keyCode == 22) {
console.log('AxExtensionAbility onKeyEvent: intercept 22');
return true;
}
return false;
}
return false;
};
```
# 无障碍子系统错误码
## 9300001 输入无效的包名称或者Ability名称
**错误信息**
Invalid bundle name or ability name.
**错误描述**
当输入的包名称或者Ability名称无效时,方法将返回该错误码。
**可能原因**
该错误码表示输入无效的包名称或者Ability名称,可能原因如下:
1. 包名称不存在。
2. 包里面没有对应的Ability。
**处理步骤**
1. 检查包名称是否正确。
2. 检查包名对应的Ability是否正确。
## 9300002 目标Ability已启用
**错误信息**
Target ability already enabled.
**错误描述**
当目标Ability已启用时,方法将返回该错误码。
**可能原因**
该错误码表示目标Ability已启用,可能原因是目标Ability已经启用,无法再次启用。
**处理步骤**
1. 停止该目标Ability。
2. 重新启用该目标Ability。
## 9300003 不具备执行该操作的无障碍权限
**错误信息**
Do not have accessibility right for this operation.
**错误描述**
当应用执行了用户在启用无障碍扩展应用时没有开启的辅助操作时,方法将返回该错误码。
**可能原因**
该错误码表示应用不具备该操作的无障碍权限,可能原因是应用执行了用户在启用无障碍扩展应用时没有开启的辅助操作。
**处理步骤**
1. 尝试向用户提示请求执行无障碍辅助操作的必要性,并获取用户授权。
2. 重新启用无障碍扩展应用,并开启所需的辅助操作。
## 9300004 属性不存在
**错误信息**
This property does not exist.
**错误描述**
当输入无障碍节点元素中不存在的属性时,方法将返回该错误码。
**可能原因**
该错误码表示输入了无效的无障碍节点元素的属性,可能原因是无障碍节点元素中不存在该属性。
**处理步骤**
检查无障碍节点元素中是否存在该属性。
## 9300005 不支持该操作
**错误信息**
This action is not supported.
**错误描述**
当应用执行无障碍节点元素不支持的操作时,方法将返回该错误码。
**可能原因**
该错误码表示执行了无障碍节点元素不支持的操作,可能原因是无障碍节点元素不支持执行该操作。
**处理步骤**
确认该无障碍节点元素支持的操作列表中是否包含该操作。
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册