android键盘映射

Android HID设备(键盘、遥控等)功能实现流程及键值映射关系 (Human Interface Device,人机接口设备)是USB设备中常用的,是直接与人交互的USB设备,例如键盘、遥控器、鼠标与游戏杆等。在USB设备中,HID设备的成本较低。之前文章中整理了android中各种功能键值定义,那么从键盘按键到安卓设备控制生效的流程是怎样的呢?EventHub从evdev驱动程序中读取原始事件,并使用键盘的按键布局映射将 Linux 按键代码(有时也称扫描代码)映射到 Android 按键代码中。将消费原始事件,并更新元键状态。 阅读详情

转:http://blog.chinaunix.net/u3/90973/showart_2207472.html

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

介绍 功能
键布局映射
        键映射的选择
        文件格式
        键布局映射文件示例
键字符映射
        键字符映射的选择
        文件格式
        资源二进制文件格式
完善您自己的驱动
介绍:
     本文主要描述了键输入怎么转换成Android应用层的行为信息和怎样自定义键的布局和键的字符映射表,满足设备的需要。
注:
       Android的应用不仅仅是平板电脑,MID,phone,还可以放到STB机顶盒,智能家庭终端上面去,所以按键的映射是一定要自定义的,不管按键是固定在设备上,还是通过无线设备还是蓝牙遥控,都需要键的映射。
       Android也是基于Linux的核心,大部分时候都是操作系统在调度任务,执行任务。相应的,Android输入系统也是遵循LINUX的input 输入输出子系统,关于这部分的分析可以Google,有许多原理方面的分析。Android使用标准的Linux输入事件设备(/dev /event0),驱动描述可以查看内核树头文件include/linux/input.h。如果想深入学习Linux input subsystem,可以访问:http://git.kernel.org/?p=linux/k ... /linux-2.6.24.y.git ;a=blob;f=Documentation/input/input.txt
注:event0是您的keypad/gpio-key注册到内核的节点号,如果有其他的输入设备注册进内核,也可以是event1。
功能性
   Android输入事件设备,用的是中断(硬件触发)或者轮询结构(软件模拟),捕获设备具体的扫描码,通过input_event()转化成标准的内核可接受的事件。
  键映射驱动的其他主要驱动是建立一个probe函数,用于注册中断或者您的软件模拟的轮询功能函数,硬件初始化,用input_register_device()注册驱动/设备到输入输出系统。
  注:关于probe属于linux设备驱动模型相关知识,可以阅读LDD3或者LINUX设备驱动原理与实践,有很详细的描述。
下面表描述了从键盘输入最终转成相应应用行为的转化步骤
步 骤                                                        行为                                                                                                解释  
1                                        窗口管理器从Linux键盘驱动获取键盘事件                                                         按键消息不指定任何逻辑事件,它只与其硬件位置有关, 也就是说,按键的键盘码没有任何软件含义,映射键盘码
2                                        窗口管理器映射扫描码为键码。                                                                        当窗口管理器从驱动读到一个键,它利用那个键布局映射文件将扫描码映射为键值。特别的,这个键值就是屏幕显示的条码。例如
                                                                                                                                                        KEYCODE_DPAD_CENTER是导航五位键的中间的键,即使ALT+G产生一个"?"字符,事实上KEYCODE_G就是这个键值。
3                                       窗口管理器发送扫描码和键码到应用程序`                                                        扫描码和键码被当前焦点所在界面处理,具体"翻译"要看具体的应用场合。       
键布局映射
如何选择一个键布局映射文件
键布局映射文件通常放在/system/usr/keylayout和/data/usr/keylayout
对于每一个键盘设备xxx,设置系统属性android.keylayout.xxx,如果没有为自己的硬件设备创建一个特定的设备,Android将去读/system/usr/keylayout/qwerty.kl这个配置文件。
注:如果设置系统属性,请查看ttp://www.kandroid.org/android_pdk/build_new_device.html
文件格式:
键映射文件通常以UTF8文本文件格式存储于设备,通常有如下特性:
注释:用#表示,以#开头的内容都将被忽略。
空白:所有的空行被忽略
键定义:键定义遵循如下格式key SCANCODE KEYCODE [FLAGS...],当扫描码是一个数字,键码定义在你描述的布局文件android.keylayout.xxx,另外可以设置相关的FLAGS:
SHIFT: 当按下,自动加上SHIFT键值
ALT:当按下,自动加上ALT
CAPS:当按下,自动带上CAPS大写
WAKE:当按下,当设备进入睡眠的时候,按下这个键将唤醒,而且发送消息给应用层。
WAKE_DROPPED:当按下,且设备正处于睡眠,设备被唤醒,但是不发送消息给应用层。
键盘映射文件示例:
android/src/device/product/generic/tuttle2.kl
# Copyright 2007 The Android Open Source Project
key 2     1
key 3     2
key 4     3
key 5     4
key 6     5
key 7     6
key 8     7
key 9     8
key 10    9
key 11    0
key 158   BACK              WAKE_DROPPED
key 230   SOFT_RIGHT        WAKE
key 60    SOFT_RIGHT        WAKE
key 107   ENDCALL           WAKE_DROPPED
key 62    ENDCALL           WAKE_DROPPED
key 229   MENU         WAKE_DROPPED
key 59    MENU         WAKE_DROPPED
key 228   POUND
key 227   STAR
key 231   CALL              WAKE_DROPPED
key 61    CALL              WAKE_DROPPED
key 232   DPAD_CENTER       WAKE_DROPPED
key 108   DPAD_DOWN         WAKE_DROPPED
key 103   DPAD_UP           WAKE_DROPPED
key 102   HOME              WAKE
key 105   DPAD_LEFT         WAKE_DROPPED
key 106   DPAD_RIGHT        WAKE_DROPPED
key 115   VOLUME_UP
key 114   VOLUME_DOWN
key 116   POWER             WAKE
key 212   SLASH
key 16    Q
key 17    W
key 18    E
key 19    R
key 20    T
key 21    Y
key 22    U
key 23    I
key 24    O
key 25    P
key 30    A
key 31    S
key 32    D
key 33    F
key 34    G
key 35    H
key 36    J
key 37    K
key 38    L
key 14    DEL
        
key 44    Z
key 45    X
key 46    C
key 47    V
key 48    B
key 49    N
key 50    M
key 51    COMMA
key 52    PERIOD
key 28    ENTER
        
key 56    ALT_LEFT
key 42    SHIFT_LEFT
key 215   AT
key 57    SPACE
key 53    SLASH
key 127   SYM
key 100   ALT_LEFT
key 399   GRAVE
键字符映射:
键字符映射位于:/system/usr/keychars和/data/usr/keychars!
比如对于一个特定的设备xxx,设置android.keychar.xxx系统属性,用全路径表示去描述所需的键字符映射。如果你没有描述任何一个键字符映射,系统将默认使用/system/usr/keychar/qwerty.kl!
注:这一点可以在开发板接USB KEYBOARD的时候,将logcat打开看调试信息,会看到default to qwerty.kl类似的信息。
文件格式:
键字符映射文件以二进制减少加载时间的形式存储于设备中,键字符映射文件有如下特征:
注释:以#开始为注释
空行:所有的空行被忽略
列定义:当一个事件来临的时候按下组合键。这个事通常是MODIFIER_SHIFT,MODIFIER_CTRL,MODIFIER_ALT的组合。
O                                         no modifiers
S                                         MODIFIER_SHIFT
C                                         MODIFIER_CONTROL
L                                         MODIFIER_CAPS_LOCK
A                                         MODIFIER_ALT
键值定义:键值定义遵循如下规则:
键 扫描码 字符[....]
扫描码和字符通常是一个十进制的值或者是UTF8字符,可以通过strtol的解析。
键字符文件的示例:
下面这个文件来自于android/src/device/product/generic/tuttle2.kcm,代表了一个完整的键字符文件。
以type开始的语句描述了你所要描述键盘的类型,大体分为三种
1:NUMERIC,12键的数字键盘
2:Q14:键盘包括所有的字符,但是可以一键多个字符。
3:QWERTY键盘包括了所有可能的字符和数字,类似于全键盘。
下面是一个QWERTY全键盘的定义示例,因为android主要用于手机,手机一般是全键。
# Copyright 2007 The Android Open Source Project
[type=QWERTY]
# keycode   base    caps    fn      caps_fn number  display_label
A           'a'     'A'     '%'     0x00    '%'     'A'
B           'b'     'B'     '='     0x00    '='     'B'
C           'c'     'C'     '8'     0x00E7  '8'     'C'
D           'd'     'D'     '5'     0x00    '5'     'D'
E           'e'     'E'     '2'     0x0301  '2'     'E'
F           'f'     'F'     '6'     0x00A5  '6'     'F'
G           'g'     'G'     '-'     '_'     '-'     'G'
H           'h'     'H'     '['     '{'     '['     'H'
I           'i'     'I'     '$'     0x0302  '$'     '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'     '$'     '$'     '$'     '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.
完善你自己的键盘事件驱动(略)


http://blog.163.com/bluesky_07_06_1/blog/static/1644400832010513101529517/

Android KEYCODE键值对应大全 Android KEYCODE键值对应大全 KEYCODE列表电话键键名 描述 键值KEYCODE_CALL 拨号键5 KEYCODE_ENDCALL 挂机键6 KEYCODE_HOME 按键Home3 KEYCODE_MENU 菜单键82 KEYCODE_BACK 返回键4 KEYCODE_SEARCH 搜索键84 KEYCODE_CAMERA 拍照键27 KEYCODE_FOCUS 拍照对焦键80 KEYCODE_POWER 电源... 阅读详情

相关推荐

Android平台开发:Android按键映射与识别

通过获取按键事件并根据按键的键码进行映射,我们可以执行各种操作或功能。此外,我们还可以自定义按键的映射,以满足特定的应用需求。在本文中,我们将探讨如何在Android应用程序中实现按键映射和识别的过程,并提供相应的源代码示例。在这个方法中,我们可以获取按键的键码(KeyCode)以及按键的动作(Action)。按键映射是将按键的键码映射到特定的操作或功能的过程。我们可以使用这些常量来判断用户按下的是哪个按键,并根据需要执行相应的操作。除了使用系统定义的按键常量外,我们还可以自定义按键映射。

PixelEnigma的博客 583

Android Activity中捕获KEYCODE_DPAD_CENTER按键

Activity可以正捕获到按键的down和up事件, 当输入DPAD_CENTER按键是后,只接收到了一次ACTION_UP, 且Activity后续onKeyDown、onKeyUp都没有监听到按键进来。

ansondroider的博客 1784

Android Studio与IntelliJ IDEA的高效键盘映射指南

本文还有配套的精品资源,点击获取 简介:在Android Studio中优化键盘映射可以大幅提升开发效率,减少对鼠标的依赖。本文详细指导如何自定义键盘映射,并介绍了适用于其他基于IntelliJ IDEA的开发环境的设置方法。自定义快捷键,如代码补全、格式化代码、搜索文本、跳转到定义等常用功能,以及如何通过安装插件进一步增强IDE功能。 1. Android St...

weixin_33597080的博客 1436

Android用户空间的处理及移植需要注意的情况

<br />本文节选于电子工业出版社 北京博文视点资讯有限公司推出的《Android系统级深入开发——移植与调试》一书第08章,作者为韩超和梁泉。本书是一本全面介绍Android系统级开发的作品,全书以移植和调试为重点。作者以实际的开发经验为基础,以软件工程思想为指导,完成了本书。本书介绍了从Android开源工程到一个基于实际硬件产品中的主要工作,一方面让读者清晰把握各个子系统的架构,另一方面让读者把握移植这个开发核心环节的要点。本书适合Linux开发人员、移动设备开发人员、Android系统框架层和底层

zhjp4295216的专栏 837

西门子smart能搜到cpu但连接当前IP地址失败

将ip地址改到同一网段 本机为192.168.1.119就是192.168.1.1网段,但plc在192.168.0.1网段,所以显示ip连接失败,改为同一网段192.168.1.xxx即可(为避免ip冲突尽量改到200往后最大255)如果显示这一步,那么你的物理连接是没有问题的,应当是plc和电脑并不在同一网段导致的问题。输入ipconfig 查看本机网段与plc是否为同一网段。此电脑就不在同一网段所有造成通讯失败,接下来解决这个问题。win+r打开运行,打开cmd。再次尝试,如果还是报错,那么。

weixin_62678581的博客 9864

Switch游戏安装新思路:抛弃Commander One,试试这款免费的Mac神器OpenMTP

本文介绍了Mac用户安装Switch游戏的新选择——免费工具OpenMTP,对比收费软件Commander One,OpenMTP在MTP连接稳定性和文件管理上更具优势。详细解析了OpenMTP的安装配置、核心功能及实战操作,帮助用户高效完成游戏安装,特别适合已破解并安装DBI的Switch用户。

weixin_30664051的博客 582

安卓蓝牙键盘按键映射_android键盘映射

'6' 0x00A5 '6' 'F'G 'g' 'G' '-' '_' '-' 'G'H 'h' 'H' '[' '{' '[' 'H'I 'i' 'I' '$' 0x0302 '$' 'I'J ...

weixin_39747296的博客 1750

保姆级教程:用Wokwi玩转ESP32 MicroPython仿真(含库文件配置指南)

本教程详细介绍了如何使用Wokwi平台进行ESP32 MicroPython仿真开发,包括库文件配置、传感器数据模拟和REPL调试技巧。通过Wokwi的仿真调试系统,开发者可以在浏览器中快速验证代码逻辑,提高开发效率,特别适合物联网项目的快速迭代。

weixin_29195615的博客 443

android 鼠标映射 专业版,安卓otg鼠标映射软件 安卓otg键盘映射

有没有什么软件可以映射鼠标键盘的.用OTG手机打开蓝牙,搜索目标,连接Bluetooth Keyoad,手机会出现配对信心。直接在键盘上输入4位数字,并回车就可以连接上。通过小米手机遥控电脑的鼠标、键盘。让您的小米变成无线鼠标、无线键盘以及无线重力感应手柄!模拟触控鼠标、键盘、重力感应手柄、多媒体遥控器、PPT遥控。还可以控制电脑锁屏、关机等操作。躺床上看电影时,不用离开温暖的被窝。体验无线重力感...

weixin_39696665的博客 7664

FastApi教程

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。

小石潭记丶 1561

GD32F103RCT6/GD32F303RCT6(6.2)USART串口实战:从寄存器配置到DMA高效传输

本文详细介绍了GD32F103RCT6和GD32F303RCT6的USART串口通信实战,从寄存器配置到DMA高效传输的全过程。通过具体的代码示例和优化建议,帮助开发者快速掌握串口通信的关键技术,提升嵌入式开发效率。特别强调了DMA在高速数据传输中的优势和应用技巧。

weixin_33725239的博客 308

更改Android 默认键盘映射值

更改Android InputManagerService默认键盘映射值 在通常情况下我们使用android手机或者平板连接外接键盘,默认的外接键盘映射值都是美式键盘,或者说是标准键盘,然而全世界并非只是用这一种键盘,在意大利,日本等国还拥有自己独特的键盘,因此就需要设置他们自己的键盘映射值 frameworks/base/packages/InputDevices/res/raw/keyboa...

Easyhood的博客 2222

【亲测有效】OpenClaw Gateway 出现 “(no output)“ 卡死问题完整解决指南:从手动重启到 systemd Watchdog 自动恢复

最近在使用 OpenClaw(自托管 AI 助手框架,前身 Clawdbot/Moltbot)时,遇到了一个非常常见的顽疾:TUI(终端界面)或 Telegram 等通道经常显示 "(no output)",消息发出去后机器人完全没反应,看起来像是卡死了。

hampeter的博客 8609

Qt键盘-Android键盘映射

Qt键盘-Android键盘映射

m0_60259116的博客 1024

k8s infiniband 和 RoCE(RDMA over Converged Ethernet)

vendors 为设备厂商编号,注意这里不是 ibv_devinfo 命令看到的vendor_id 的值,而是 lspci -n |grep “网卡的bdf” 得到的。如上文所述,启动了两个测试 pod ,登录其中一个 pod(该 pod roce 设备 ip 为 10.56.217.79)如上文所述,启动了两个测试 pod ,登录其中一个 pod(该 pod ip 为 10.96.225.24)说明:文中用到的镜像是自定义的,文末有其Dockerfile 文件。修改该文件,增加污点容忍的内容,如下。

weixin_40548182的博客 1794

moveit——基于octomap的碰撞检测

机械臂对棚顶进行碰撞检测。

如果想成为中心,那么就到中心去吧。 1355

android 键盘映射、定义

键布局映射文件通常放在/system/usr/keylayout和/data/usr/keylayout

jimbo的专栏 2586

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

安卓蓝牙键盘按键映射_安卓手游键盘映射工具(凤凰系统键盘映射) v2.0 最新版...

安卓手游键盘映射工具(凤凰系统键盘映射)凤凰os 键盘映射是凤凰系统为安卓平台手游提供的一款键盘映射功能,新版更新了不少的使用操作,优化了游戏带操作体验,让你把安卓手游玩出电脑版的感觉。凤凰os 键盘映射介绍凤凰系统自升级至v2.0版本之后备受用户好评,其中键盘映射v1.5在游戏操作体验上的优化为整个系统增色不少。日前,键盘映射再次迎来升级,最新的v2.0版本更是打造了史上最强安卓FPS游戏操作体...

weixin_39705931的博客 5443

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android键盘映射之三

在系统启动后,android 会通过      static const char *device_path = "/dev/input";     bool EventHub::penPlatformInput(void)     res = scan_dir(device_path);  通过下面的函数打开设备。  int EventHub::pen_device(c

zxy12175968的专栏 665

Android 键盘映射

如何选择一个键布局映射文件键布局映射文件通常放在/system/usr/keylayout和/data/usr/keylayout 对于每一个键盘设备xxx,设置系统属性android.keylayout.xxx,如果没有为自己的硬件设备创建一个特定的设备,Android将去读/system/usr/keylayout/qwerty.kl这个配置文件。 文件格式:键映射文件通常以UTF8...

weixin_30485379的博客 131

android键盘映射之三

在系统启动后,android 会通过     static const char *device_path = "/dev/input";     bool EventHub::penPlatformInput(void)     res = scan_dir(device_path); 通过下面的函数打开设备。 int EventHub::pen_device(cons

batoom的专栏 1317

告别虚拟键盘烦恼:Docker-Android物理键盘完美映射指南

你还在为Android模拟器虚拟键盘打字效率低下而困扰吗?开发测试时频繁切换窗口输入验证码、填写表单的操作是否让你抓狂?本文将带你通过Docker-Android的键盘映射功能,将物理键盘变成模拟器的"输入利器",实现如同操作实体手机般的流畅体验。 读完本文你将掌握: - 物理键盘与模拟器按键的精准映射配置 - 三星Galaxy系列设备的键盘布局自定义方法 - 横竖屏切换时的键盘适配技巧 - 通...

gitblog_00867的博客 546

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

                                                                                          Android底层和中间层共同学习系列之android键盘映射                            (转载请说明来自国内最大Android社区androidin底层驱动论坛分支,国内最大li

4434
上一篇: Android的MediaPlayer架构介绍
下一篇: 读取图像中的 EXIF 信息(不全,能够读取部分)
eustoma
博客等级 码龄18年 79粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值