# CodelabInputFilter **Repository Path**: qthy/codelab-input-filter ## Basic Information - **Project Name**: CodelabInputFilter - **Description**: 1.了解InputFilter 2.自定义一个限制输入字节长度的InputFilter - **Primary Language**: Kotlin - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-04-23 - **Last Updated**: 2023-05-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: Android, InputFilter ## README # CodelabInputFilter #### 背景 Android 8.1 起因:在8.1设备上开发热点设置功能时,wifiap输入SSID,底层的限制是字节长度是32, 如果SSID长度设置到底层 输入框限制输入字符长度是32,在UTF-8编码下一个中文汉字字节长度是3, 原生设置的做法是输入的总字节超过32将提交按钮不可用, 但是我们想做成直接在输入时做限制类似 InputFilter.LengthFilter 于是自定义一个InputFilter来限制输入字符的字节长度 #### 问题分析 设置的SSID字节长度超过32后,打开热点时的错误日志 ~~~ 02-23 15:02:33.373 1069 1705 E WifiService: Continue with Single SAP Mode. 02-23 15:02:33.399 765 765 I wificond: Command: softap create softap0 (len=21) 02-23 15:02:33.699 765 765 D QCSDK : Interface created is softap0 - Ok 02-23 15:02:34.574 765 765 E wificond: softap0 02-23 15:02:34.601 765 765 I wificond: New interface event callback registered 02-23 15:02:34.601 1069 1069 D WifiService: handleWifiApStateChange: currentState=12 previousState=11 errorCode= -1 ifaceName=softap0 mode=1 02-23 15:02:34.656 765 765 D QCSDK : qsapsetSoftap, softap, setsoftap, 8 02-23 15:02:34.656 765 765 D QCSDK : ARG: 1 - softap 02-23 15:02:34.656 765 765 D QCSDK : ARG: 2 - setsoftap 02-23 15:02:34.656 765 765 D QCSDK : ARG: 3 - softap0 02-23 15:02:34.656 765 765 D QCSDK : ARG: 4 - 409006b人人人人人人人人人人人人人人挺丰富非常烦烦烦烦烦吃 02-23 15:02:34.656 765 765 D QCSDK : ARG: 5 - visible 02-23 15:02:34.656 765 765 D QCSDK : ARG: 6 - 1 02-23 15:02:34.656 765 765 D QCSDK : ARG: 7 - wpa2-psk 02-23 15:02:34.656 765 765 D QCSDK : ARG: 8 - 12345678 02-23 15:02:34.656 765 765 D QCSDK : CMD INPUT [set interface=softap0][255] 02-23 15:02:34.656 765 765 E QCSDK : INI FILE PROP NOT PRESENT: Use default path (null) 02-23 15:02:34.656 765 765 E QCSDK : Cmd: interface Argument :softap0 02-23 15:02:34.656 765 765 D QCSDK : cmd=interface, Val:softap0, INI:0 02-23 15:02:34.657 765 765 D QCSDK : Updated:interface=softap0 02-23 15:02:34.657 765 765 D QCSDK : 02-23 15:02:34.658 765 765 D QCSDK : CMD OUTPUT [success] 02-23 15:02:34.658 765 765 D QCSDK : len :7 02-23 15:02:34.658 765 765 D QCSDK : 02-23 15:02:34.658 765 765 D QCSDK : CMD INPUT [set ssid=409006b人人人人人人人人人人人人人人挺丰富非常烦烦烦烦烦吃][7] 02-23 15:02:34.658 765 765 E QCSDK : INI FILE PROP NOT PRESENT: Use default path (null) 02-23 15:02:34.658 765 765 E QCSDK : Cmd: ssid Argument :409006b人人人人人人人人人人人人人人挺丰富非常烦烦烦烦烦吃 02-23 15:02:34.658 765 765 D QCSDK : CMD OUTPUT [failur] 02-23 15:02:34.658 765 765 D QCSDK : len :6 02-23 15:02:34.658 765 765 D QCSDK : 02-23 15:02:34.658 765 765 E QCSDK : Failed to set ssid 02-23 15:02:34.658 765 765 E wificond: SSIDs must be <= 32 bytes long 02-23 15:02:34.659 765 765 F libc : Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 765 (wificond), pid 765 (wificond) 02-23 15:02:34.659 765 765 F libc : Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 765 (wificond), pid 765 (wificond) 02-23 15:02:34.703 7428 7428 F DEBUG : pid: 765, tid: 765, name: wificond >>> /system/bin/wificond <<< 02-23 15:02:34.703 7428 7428 F DEBUG : pid: 765, tid: 765, name: wificond >>> /system/bin/wificond <<< 02-23 15:02:34.721 7428 7428 F DEBUG : #01 pc 000000000002ef9c /system/bin/wificond (android::wificond::ApInterfaceImpl::QcWriteHostapdConfig(std::__1::vector> const&, bool, int, android::wifi_system::HostapdManager::EncryptionType, std::__1::vector> const&)+1564) 02-23 15:02:34.721 7428 7428 F DEBUG : #01 pc 000000000002ef9c /system/bin/wificond (android::wificond::ApInterfaceImpl::QcWriteHostapdConfig(std::__1::vector> const&, bool, int, android::wifi_system::HostapdManager::EncryptionType, std::__1::vector> const&)+1564) 02-23 15:02:34.721 7428 7428 F DEBUG : #02 pc 0000000000038b40 /system/bin/wificond (android::wificond::ApInterfaceBinder::writeHostapdConfig(std::__1::vector> const&, bool, int, int, std::__1::vector> const&, bool*)+72) 02-23 15:02:34.721 7428 7428 F DEBUG : #02 pc 0000000000038b40 /system/bin/wificond (android::wificond::ApInterfaceBinder::writeHostapdConfig(std::__1::vector> const&, bool, int, int, std::__1::vector> const&, bool*)+72) 02-23 15:02:34.721 7428 7428 F DEBUG : #03 pc 0000000000036608 /system/bin/wificond (android::net::wifi::BnApInterface::onTransact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+480) 02-23 15:02:34.721 7428 7428 F DEBUG : #08 pc 0000000000021ad4 /system/bin/wificond ((anonymous namespace)::WatchFdCallback::handleEvent(int, int, void*)+48) 02-23 15:02:34.721 7428 7428 F DEBUG : #11 pc 00000000000216bc /system/bin/wificond (android::wificond::LooperBackedEventLoop::Poll()+48) 02-23 15:02:34.721 7428 7428 F DEBUG : #11 pc 00000000000216bc /system/bin/wificond (android::wificond::LooperBackedEventLoop::Poll()+48) 02-23 15:02:34.721 7428 7428 F DEBUG : #12 pc 0000000000011894 /system/bin/wificond (main+1164) 02-23 15:02:34.722 7428 7428 F DEBUG : #14 pc 0000000000011340 /system/bin/wificond (_start_main+80) ~~~ 原生设置关于字节长度限制的实现 ~~~ java // Settings\src\com\android\settings\wifi\WifiApDialog.java private void validate() { String mSsidString = mSsid.getText().toString(); if ((mSsid != null && mSsid.length() == 0) || ((mSecurityTypeIndex == WPA2_INDEX) && mPassword.length() < 8) || (mSsid != null && // 总字节超过32将提交按钮不可用 Charset.forName("UTF-8").encode(mSsidString).limit() > 32)) { getButton(BUTTON_SUBMIT).setEnabled(false); } else { getButton(BUTTON_SUBMIT).setEnabled(true); } } ~~~ #### 步骤 1. 学习InputFilter.LengthFilter实现 2. 自定义一个限制输入字节长度的InputFilter