Android底层和中间层共同学习系列之android键盘映射

  1. 介绍
  2. 功能
  3. 键布局映射
  4.         键映射的选择
  5.         文件格式
  6.         键布局映射文件示例
  7. 键字符映射
  8.         键字符映射的选择
  9.         文件格式
  10.         资源二进制文件格式
  11. 完善您自己的驱动
  12. 示列
  13. 介绍:
  14.      本文主要描述了键输入怎么转换成Android应用层的行为信息和怎样自定义键的布局和键的字符映射表,满足设备的需要。
  15. 注:
  16.        Android的应用不仅仅是平板电脑,MID,phone,还可以放到STB机顶盒,智能家庭终端上面去,所以按键的映射是一定要自定义的,不管按键是固定在设备上,还是通过无线设备还是蓝牙遥控,都需要键的映射。
  17.        Android也是基于Linux的核心,大部分时候都是操作系统在调度任务,执行任务。相应的,Android输入系统也是遵循LINUX的input输入输出子系统,关于这部分的分析可以Google,有许多原理方面的分析。Android使用标准的Linux输入事件设备(/dev/event0),驱动描述可以查看内核树头文件include/linux/input.h。如果想深入学习Linux input subsystem,可以访问:http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.24.y.git;a=blob;f=Documentation/input/input.txt
  18. 注:event0是您的keypad/gpio-key注册到内核的节点号,如果有其他的输入设备注册进内核,也可以是event1。
  19. 功能性
  20.    Android输入事件设备,用的是中断(硬件触发)或者轮询结构(软件模拟),捕获设备具体的扫描码,通过input_event()转化成标准的内核可接受的事件。
  21.   键映射驱动的其他主要驱动是建立一个probe函数,用于注册中断或者您的软件模拟的轮询功能函数,硬件初始化,用input_register_device()注册驱动/设备到输入输出系统。
  22.   注:关于probe属于linux设备驱动模型相关知识,可以阅读LDD3或者LINUX设备驱动原理与实践,有很详细的描述。
  23. 下面表描述了从键盘输入最终转成相应应用行为的转化步骤
  24. 步骤                            行为                                                解释  
  25. 1                    窗口管理器从Linux键盘驱动获取键盘事件                             按键消息不指定任何逻辑事件,它只与其硬件位置有关, 也就是说,按键的键盘码没有任何软件含义,映射键盘码
  26. 2                    窗口管理器映射扫描码为键码。                                    当窗口管理器从驱动读到一个键,它利用那个键布局映射文件将扫描码映射为键值。特别的,这个键值就是屏幕显示的条码。例如
  27.                                                                             KEYCODE_DPAD_CENTER是导航五位键的中间的键,即使ALT+G产生一个”?”字符,事实上KEYCODE_G就是这个键值。
  28. 3                           窗口管理器发送扫描码和键码到应用程序`                            扫描码和键码被当前焦点所在界面处理,具体”翻译”要看具体的应用场合。   
  29. 键布局映射
  30. 如何选择一个键布局映射文件
  31. 键布局映射文件通常放在/system/usr/keylayout和/data/usr/keylayout
  32. 对于每一个键盘设备xxx,设置系统属性android.keylayout.xxx,如果没有为自己的硬件设备创建一个特定的设备,Android将去读/system/usr/keylayout/qwerty.kl这个配置文件。
  33. 注:如果设置系统属性,请查看ttp://www.kandroid.org/android_pdk/build_new_device.html
  34. 文件格式:
  35. 键映射文件通常以UTF8文本文件格式存储于设备,通常有如下特性:
  36. 注释:用#表示,以#开头的内容都将被忽略。
  37. 空白:所有的空行被忽略
  38. 键定义:键定义遵循如下格式key SCANCODE KEYCODE [FLAGS…],当扫描码是一个数字,键码定义在你描述的布局文件android.keylayout.xxx,另外可以设置相关的FLAGS:
  39. SHIFT: 当按下,自动加上SHIFT键值
  40. ALT:当按下,自动加上ALT
  41. CAPS:当按下,自动带上CAPS大写
  42. WAKE:当按下,当设备进入睡眠的时候,按下这个键将唤醒,而且发送消息给应用层。
  43. WAKE_DROPPED:当按下,且设备正处于睡眠,设备被唤醒,但是不发送消息给应用层。
  44. 键盘映射文件示例:
  45. android/src/device/product/generic/tuttle2.kl
  46. # Copyright 2007 The Android Open Source Project
  47. key 2     1
  48. key 3     2
  49. key 4     3
  50. key 5     4
  51. key 6     5
  52. key 7     6
  53. key 8     7
  54. key 9     8
  55. key 10    9
  56. key 11    0
  57. key 158   BACK              WAKE_DROPPED
  58. key 230   SOFT_RIGHT        WAKE
  59. key 60    SOFT_RIGHT        WAKE
  60. key 107   ENDCALL           WAKE_DROPPED
  61. key 62    ENDCALL           WAKE_DROPPED
  62. key 229   MENU         WAKE_DROPPED
  63. key 59    MENU         WAKE_DROPPED
  64. key 228   POUND
  65. key 227   STAR
  66. key 231   CALL              WAKE_DROPPED
  67. key 61    CALL              WAKE_DROPPED
  68. key 232   DPAD_CENTER       WAKE_DROPPED
  69. key 108   DPAD_DOWN         WAKE_DROPPED
  70. key 103   DPAD_UP           WAKE_DROPPED
  71. key 102   HOME              WAKE
  72. key 105   DPAD_LEFT         WAKE_DROPPED
  73. key 106   DPAD_RIGHT        WAKE_DROPPED
  74. key 115   VOLUME_UP
  75. key 114   VOLUME_DOWN
  76. key 116   POWER             WAKE
  77. key 212   SLASH
  78. key 16    Q
  79. key 17    W
  80. key 18    E
  81. key 19    R
  82. key 20    T
  83. key 21    Y
  84. key 22    U
  85. key 23    I
  86. key 24    O
  87. key 25    P
  88. key 30    A
  89. key 31    S
  90. key 32    D
  91. key 33    F
  92. key 34    G
  93. key 35    H
  94. key 36    J
  95. key 37    K
  96. key 38    L
  97. key 14    DEL
  98.         
  99. key 44    Z
  100. key 45    X
  101. key 46    C
  102. key 47    V
  103. key 48    B
  104. key 49    N
  105. key 50    M
  106. key 51    COMMA
  107. key 52    PERIOD
  108. key 28    ENTER
  109.         
  110. key 56    ALT_LEFT
  111. key 42    SHIFT_LEFT
  112. key 215   AT
  113. key 57    SPACE
  114. key 53    SLASH
  115. key 127   SYM
  116. key 100   ALT_LEFT
  117. key 399   GRAVE
  118. 键字符映射:
  119. 键字符映射位于:/system/usr/keychars和/data/usr/keychars!
  120. 比如对于一个特定的设备xxx,设置android.keychar.xxx系统属性,用全路径表示去描述所需的键字符映射。如果你没有描述任何一个键字符映射,系统将默认使用/system/usr/keychar/qwerty.kl!
  121. 注:这一点可以在开发板接USB KEYBOARD的时候,将logcat打开看调试信息,会看到default to qwerty.kl类似的信息。
  122. 文件格式:
  123. 键字符映射文件以二进制减少加载时间的形式存储于设备中,键字符映射文件有如下特征:
  124. 注释:以#开始为注释
  125. 空行:所有的空行被忽略
  126. 列定义:当一个事件来临的时候按下组合键。这个事通常是MODIFIER_SHIFT,MODIFIER_CTRL,MODIFIER_ALT的组合。
  127. O                     no modifiers
  128. S                     MODIFIER_SHIFT
  129. C                     MODIFIER_CONTROL
  130. L                     MODIFIER_CAPS_LOCK
  131. A                     MODIFIER_ALT
  132. 键值定义:键值定义遵循如下规则:
  133. 键 扫描码 字符[….]
  134. 扫描码和字符通常是一个十进制的值或者是UTF8字符,可以通过strtol的解析。
  135. 键字符文件的示例:
  136. 下面这个文件来自于android/src/device/product/generic/tuttle2.kcm,代表了一个完整的键字符文件。
  137. 以type开始的语句描述了你所要描述键盘的类型,大体分为三种
  138. 1:NUMERIC,12键的数字键盘
  139. 2:Q14:键盘包括所有的字符,但是可以一键多个字符。
  140. 3:QWERTY键盘包括了所有可能的字符和数字,类似于全键盘。
  141. 下面是一个QWERTY全键盘的定义示例,因为android主要用于手机,手机一般是全键。
  142. # Copyright 2007 The Android Open Source Project
  143. [type=QWERTY]
  144. # keycode   base    caps    fn      caps_fn number  display_label
  145. A           ‘a’     ‘A’     ‘%’     0x00    ‘%’     ‘A’
  146. B           ‘b’     ‘B’     ‘=’     0x00    ‘=’     ‘B’
  147. C           ‘c’     ‘C’     ‘8’     0x00E7  ‘8’     ‘C’
  148. D           ‘d’     ‘D’     ‘5’     0x00    ‘5’     ‘D’
  149. E           ‘e’     ‘E’     ‘2’     0x0301  ‘2’     ‘E’
  150. F           ‘f’     ‘F’     ‘6’     0x00A5  ‘6’     ‘F’
  151. G           ‘g’     ‘G’     ‘-‘     ‘_’     ‘-‘     ‘G’
  152. H           ‘h’     ‘H’     ‘[‘     ‘{‘     ‘[‘     ‘H’
  153. I           ‘i’     ‘I’     ‘
    #define KEY_RESERVED                0
  154. #define KEY_ESC                        1
  155. #define KEY_1                        2
  156. #define KEY_2                        3
  157. #define KEY_3                        4
  158. #define KEY_4                        5
  159. #define KEY_5                        6
  160. #define KEY_6                        7
  161. #define KEY_7                        8
  162. #define KEY_8                        9
  163. #define KEY_9                        10
  164. #define KEY_0                        11
  165. #define KEY_MINUS                12
  166. #define KEY_EQUAL                13
  167. #define KEY_BACKSPACE                14
  168. #define KEY_TAB                        15
  169. #define KEY_Q                        16
  170. #define KEY_W                        17
  171. #define KEY_E                        18
  172. #define KEY_R                        19
  173. #define KEY_T                        20
  174. #define KEY_Y                        21
  175. #define KEY_U                        22
  176. #define KEY_I                        23
  177. #define KEY_O                        24
  178. #define KEY_P                        25
  179. #define KEY_LEFTBRACE                26
  180. #define KEY_RIGHTBRACE                27
  181. #define KEY_ENTER                28
  182. #define KEY_LEFTCTRL                29
  183. #define KEY_A                        30
  184. #define KEY_S                        31
  185. #define KEY_D                        32
  186. #define KEY_F                        33
  187. #define KEY_G                        34
  188. #define KEY_H                        35
  189. #define KEY_J                        36
  190. #define KEY_K                        37
  191. #define KEY_L                        38
  192. #define KEY_SEMICOLON                39
  193. #define KEY_APOSTROPHE                40
  194. #define KEY_GRAVE                41
  195. #define KEY_LEFTSHIFT                42
  196. #define KEY_BACKSLASH                43
  197. #define KEY_Z                        44
  198. #define KEY_X                        45
  199. #define KEY_C                        46
  200. #define KEY_V                        47
  201. #define KEY_B                        48
  202. #define KEY_N                        49
  203. #define KEY_M                        50
  204. #define KEY_COMMA                51
  205. #define KEY_DOT                        52
  206. #define KEY_SLASH                53
  207. #define KEY_RIGHTSHIFT                54
  208. #define KEY_KPASTERISK                55
  209. #define KEY_LEFTALT                56
  210. #define KEY_SPACE                57
  211. #define KEY_CAPSLOCK                58
  212. #define KEY_F1                        59
  213. #define KEY_F2                        60
  214. #define KEY_F3                        61
  215. #define KEY_F4                        62
  216. #define KEY_F5                        63
  217. #define KEY_F6                        64
  218. #define KEY_F7                        65
  219. #define KEY_F8                        66
  220. #define KEY_F9                        67
  221. #define KEY_F10                        68
  222. #define KEY_NUMLOCK                69
  223. #define KEY_SCROLLLOCK                70
  224. #define KEY_KP7                        71
  225. #define KEY_KP8                        72
  226. #define KEY_KP9                        73
  227. #define KEY_KPMINUS                74
  228. #define KEY_KP4                        75
  229. #define KEY_KP5                        76
  230. #define KEY_KP6                        77
  231. #define KEY_KPPLUS                78
  232. #define KEY_KP1                        79
  233. #define KEY_KP2                        80
  234. #define KEY_KP3                        81
  235. #define KEY_KP0                        82
  236. #define KEY_KPDOT                83

  237. #define KEY_ZENKAKUHANKAKU        85
  238. #define KEY_102ND                86
  239. #define KEY_F11                        87
  240. #define KEY_F12                        88
  241. #define KEY_RO                        89
  242. #define KEY_KATAKANA                90
  243. #define KEY_HIRAGANA                91
  244. #define KEY_HENKAN                92
  245. #define KEY_KATAKANAHIRAGANA        93
  246. #define KEY_MUHENKAN                94
  247. #define KEY_KPJPCOMMA                95
  248. #define KEY_KPENTER                96
  249. #define KEY_RIGHTCTRL                97
  250. #define KEY_KPSLASH                98
  251. #define KEY_SYSRQ                99
  252. #define KEY_RIGHTALT                100
  253. #define KEY_LINEFEED                101
  254. #define KEY_HOME                102
  255. #define KEY_UP                        103
  256. #define KEY_PAGEUP                104
  257. #define KEY_LEFT                105
  258. #define KEY_RIGHT                106
  259. #define KEY_END                        107
  260. #define KEY_DOWN                108
  261. #define KEY_PAGEDOWN                109
  262. #define KEY_INSERT                110
  263. #define KEY_DELETE                111
  264. #define KEY_MACRO                112
  265. #define KEY_MUTE                113
  266. #define KEY_VOLUMEDOWN                114
  267. #define KEY_VOLUMEUP                115
  268. #define KEY_POWER                116        /* SC System Power Down */
  269. #define KEY_KPEQUAL                117
  270. #define KEY_KPPLUSMINUS                118
  271. #define KEY_PAUSE                119
  272. #define KEY_SCALE                120        /* AL Compiz Scale (Expose) */

  273. #define KEY_KPCOMMA                121
  274. #define KEY_HANGEUL                122
  275. #define KEY_HANGUEL                KEY_HANGEUL
  276. #define KEY_HANJA                123
  277. #define KEY_YEN                        124
  278. #define KEY_LEFTMETA                125
  279. #define KEY_RIGHTMETA                126
  280. #define KEY_COMPOSE                127

  281. #define KEY_STOP                128        /* AC Stop */
  282. #define KEY_AGAIN                129
  283. #define KEY_PROPS                130        /* AC Properties */
  284. #define KEY_UNDO                131        /* AC Undo */
  285. #define KEY_FRONT                132
  286. #define KEY_COPY                133        /* AC Copy */
  287. #define KEY_OPEN                134        /* AC Open */
  288. #define KEY_PASTE                135        /* AC Paste */
  289. #define KEY_FIND                136        /* AC Search */
  290. #define KEY_CUT                        137        /* AC Cut */
  291. #define KEY_HELP                138        /* AL Integrated Help Center */
  292. #define KEY_MENU                139        /* Menu (show menu) */
  293. #define KEY_CALC                140        /* AL Calculator */
  294. #define KEY_SETUP                141
  295. #define KEY_SLEEP                142        /* SC System Sleep */
  296. #define KEY_WAKEUP                143        /* System Wake Up */
  297. #define KEY_FILE                144        /* AL Local Machine Browser */
  298. #define KEY_SENDFILE                145
  299. #define KEY_DELETEFILE                146
  300. #define KEY_XFER                147
  301. #define KEY_PROG1                148
  302. #define KEY_PROG2                149
  303. #define KEY_WWW                        150        /* AL Internet Browser */
  304. #define KEY_MSDOS                151
  305. #define KEY_COFFEE                152        /* AL Terminal Lock/Screensaver */
  306. #define KEY_SCREENLOCK                KEY_COFFEE
  307. #define KEY_DIRECTION                153
  308. #define KEY_CYCLEWINDOWS        154
  309. #define KEY_MAIL                155
  310. #define KEY_BOOKMARKS                156        /* AC Bookmarks */
  311. #define KEY_COMPUTER                157
  312. #define KEY_BACK                158        /* AC Back */
  313. #define KEY_FORWARD                159        /* AC Forward */
  314. #define KEY_CLOSECD                160
  315. #define KEY_EJECTCD                161
  316. #define KEY_EJECTCLOSECD        162
  317. #define KEY_NEXTSONG                163
  318. #define KEY_PLAYPAUSE                164
  319. #define KEY_PREVIOUSSONG        165
  320. #define KEY_STOPCD                166
  321. #define KEY_RECORD                167
  322. #define KEY_REWIND                168
  323. #define KEY_PHONE                169        /* Media Select Telephone */
  324. #define KEY_ISO                        170
  325. #define KEY_CONFIG                171        /* AL Consumer Control Configuration */
  326. #define KEY_HOMEPAGE                172        /* AC Home */
  327. #define KEY_REFRESH                173        /* AC Refresh */
  328. #define KEY_EXIT                174        /* AC Exit */
  329. #define KEY_MOVE                175
  330. #define KEY_EDIT                176
  331. #define KEY_SCROLLUP                177
  332. #define KEY_SCROLLDOWN                178
  333. #define KEY_KPLEFTPAREN                179
  334. #define KEY_KPRIGHTPAREN        180
  335. #define KEY_NEW                        181        /* AC New */
  336. #define KEY_REDO                182        /* AC Redo/Repeat */

  337. #define KEY_F13                        183
  338. #define KEY_F14                        184
  339. #define KEY_F15                        185
  340. #define KEY_F16                        186
  341. #define KEY_F17                        187
  342. #define KEY_F18                        188
  343. #define KEY_F19                        189
  344. #define KEY_F20                        190
  345. #define KEY_F21                        191
  346. #define KEY_F22                        192
  347. #define KEY_F23                        193
  348. #define KEY_F24                        194

  349. #define KEY_PLAYCD                200
  350. #define KEY_PAUSECD                201
  351. #define KEY_PROG3                202
  352. #define KEY_PROG4                203
  353. #define KEY_DASHBOARD                204        /* AL Dashboard */
  354. #define KEY_SUSPEND                205
  355. #define KEY_CLOSE                206        /* AC Close */
  356. #define KEY_PLAY                207
  357. #define KEY_FASTFORWARD                208
  358. #define KEY_BASSBOOST                209
  359. #define KEY_PRINT                210        /* AC Print */
  360. #define KEY_HP                        211
  361. #define KEY_CAMERA                212
  362. #define KEY_SOUND                213
  363. #define KEY_QUESTION                214
  364. #define KEY_EMAIL                215
  365. #define KEY_CHAT                216
  366. #define KEY_SEARCH                217
  367. #define KEY_CONNECT                218
  368. #define KEY_FINANCE                219        /* AL Checkbook/Finance */
  369. #define KEY_SPORT                220
  370. #define KEY_SHOP                221
  371. #define KEY_ALTERASE                222
  372. #define KEY_CANCEL                223        /* AC Cancel */
  373. #define KEY_BRIGHTNESSDOWN        224
  374. #define KEY_BRIGHTNESSUP        225
  375. #define KEY_MEDIA                226

  376. #define KEY_SWITCHVIDEOMODE        227        /* Cycle between available video
  377.                                            outputs (Monitor/LCD/TV-out/etc) */
  378. #define KEY_KBDILLUMTOGGLE        228
  379. #define KEY_KBDILLUMDOWN        229
  380. #define KEY_KBDILLUMUP                230

  381. #define KEY_SEND                231        /* AC Send */
  382. #define KEY_REPLY                232        /* AC Reply */
  383. #define KEY_FORWARDMAIL                233        /* AC Forward Msg */
  384. #define KEY_SAVE                234        /* AC Save */
  385. #define KEY_DOCUMENTS                235

  386. #define KEY_BATTERY                236

  387. #define KEY_BLUETOOTH                237
  388. #define KEY_WLAN                238
  389. #define KEY_UWB                        239

  390. #define KEY_UNKNOWN                240

  391. #define KEY_VIDEO_NEXT                241        /* drive next video source */
  392. #define KEY_VIDEO_PREV                242        /* drive previous video source */
  393. #define KEY_BRIGHTNESS_CYCLE        243        /* brightness up, after max is min */
  394. #define KEY_BRIGHTNESS_ZERO        244        /* brightness off, use ambient */
  395. #define KEY_DISPLAY_OFF                245        /* display device to off state */

  396. #define KEY_WIMAX                246
复制代码


     0x0302  '[        DISCUZ_CODE_5        ]


     'I'
J           'j'     'J'     ']'     '}'     ']'     'J'
K           'k'     'K'     '"'     '~'     '"'     'K'
L           'l'     'L'     '''     '`'     '''     'L'
M           'm'     'M'     '>'     0x00    '>'     'M'
N           'n'     'N'     '<'     0x0303  '<'     'N'
O           'o'     'O'     '('     0x00    '('     'O'
P           'p'     'P'     ')'     0x00    ')'     'P'
Q           'q'     'Q'     '*'     0x0300  '*'     'Q'
R           'r'     'R'     '3'     0x20AC  '3'     'R'
S           's'     'S'     '4'     0x00DF  '4'     'S'
T           't'     'T'     '+'     0x00A3  '+'     'T'
U           'u'     'U'     '&'     0x0308  '&'     'U'
V           'v'     'V'     '9'     '^'     '9'     'V'
W           'w'     'W'     '1'     0x00    '1'     'W'
X           'x'     'X'     '7'     0xEF00  '7'     'X'
Y           'y'     'Y'     '!'     0x00A1  '!'     'Y'
Z           'z'     'Z'     '#'     0x00    '#'     'Z'

COMMA       ','     ';'     ';'     '|'     ','     ','
PERIOD      '.'     ':'     ':'     0x2026  '.'     '.'
AT          '@'     '0'     '0'     0x2022  '0'     '@'
SLASH       '/'     '?'     '?'     '\'     '/'     '/'

SPACE       0x20    0x20    0x9     0x9     0x20    0x20
NEWLINE     0xa     0xa     0xa     0xa     0xa     0xa

# on pc keyboards
TAB         0x9     0x9     0x9     0x9     0x9     0x9
0           '0'     ')'     ')'     ')'     '0'     '0'
1           '1'     '!'     '!'     '!'     '1'     '1'
2           '2'     '@'     '@'     '@'     '2'     '2'
3           '3'     '#'     '#'     '#'     '3'     '3'
4           '4'     '[        DISCUZ_CODE_5        ]


     '[        DISCUZ_CODE_5        ]


     '[        DISCUZ_CODE_5        ]


     '4'     '4'
5           '5'     '%'     '%'     '%'     '5'     '5'
6           '6'     '^'     '^'     '^'     '6'     '6'
7           '7'     '&'     '&'     '&'     '7'     '7'
8           '8'     '*'     '*'     '*'     '8'     '8'
9           '9'     '('     '('     '('     '9'     '9'

GRAVE         '`'     '~'     '`'     '~'     '`'     '`'
MINUS         '-'     '_'     '-'     '_'     '-'     '-'
EQUALS        '='     '+'     '='     '+'     '='     '='
LEFT_BRACKET  '['     '{'     '['     '{'     '['     '['
RIGHT_BRACKET ']'     '}'     ']'     '}'     ']'     ']'
BACKSLASH     '\'     '|'     '\'     '|'     '\'     '\'
SEMICOLON     ';'     ':'     ';'     ':'     ';'     ';'
APOSTROPHE    '''     '"'     '''     '"'     '''     '''
STAR          '*'     '*'     '*'     '*'     '*'     '*'
POUND         '#'     '#'     '#'     '#'     '#'     '#'
PLUS          '+'     '+'     '+'     '+'     '+'     '+'

资源二进制格式

上面所描述的一段通过makekcharmap工具转换成下面的格式,用户可以通过mmap这个文件,用于进程之间共享大概4K数据,可以节省加载时间。
Offset              Size (bytes)              Description
0x00-0x0b                             The ascii value "keycharmap1" including the null character
0x0c-0x0f                             padding
0x10-0x13                             The number of entries in the modifiers table (COLS)
0x14-0x17                             The number of entries in the characters table (ROWS)
0x18-0x1f                             padding
                4*COLS                 Modifiers table. The modifier mask values that each of the columns in the characters table correspond to.
                                    padding to the next 16 byte boundary

                4*COLS*ROWS         Characters table. The modifier mask values that each of the columns correspond to.

[        DISCUZ_CODE_5        ]

来源:http://www.cmd100.com/bbs/forum-viewthread-tid-2049-extra-page%3D1-ordertype-1.html

    原文作者:B_zhang
    原文地址: https://blog.csdn.net/B_zhang/article/details/7308878
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞