{"id":1841,"date":"2023-03-29T21:53:48","date_gmt":"2023-03-29T13:53:48","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1841"},"modified":"2023-04-22T09:12:14","modified_gmt":"2023-04-22T01:12:14","slug":"android-scanner-communicates-through-usb-data-instead-of-serial-data-dispatchkeyevent-replaces-edittext-control","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/29\/android-scanner-communicates-through-usb-data-instead-of-serial-data-dispatchkeyevent-replaces-edittext-control\/","title":{"rendered":"Android\u626b\u7801\u5668\u901a\u8fc7USB\u6570\u636e\u901a\u4fe1\u800c\u4e0d\u662f\u4e32\u53e3\u6570\u636e\u901a\u4fe1\uff01dispatchKeyEvent\u4ee3\u66ffEditText\u63a7\u4ef6"},"content":{"rendered":"<h2>\u62e6\u622adispatchKeyEvent\u65b9\u6cd5<\/h2>\n<h3>\u91cd\u5199dispatchKeyEvent\u65b9\u6cd5<\/h3>\n<pre><code class=\"language-java\">@Override\npublic boolean dispatchKeyEvent(KeyEvent event) {\n    toolScanner.analysisKeyEvent(event);\n    return true;\n}<\/code><\/pre>\n<p><!-- more --><\/p>\n<h3>\u76f8\u5173\u903b\u8f91\u5904\u7406\u5de5\u5177\u7c7b\uff1aUsbTransferDataUtils<\/h3>\n<pre><code class=\"language-java\">\/**\n * \u626b\u63cf\u4e8b\u4ef6\u5904\u7406\n *\/\npublic class UsbTransferDataUtils {\n    private final Handler mHandler;\n    private boolean mCaps;\n    private IOnScanSuccessListener mOnScanSuccessListener;\n    private StringBuffer mStringBufferResult;\n    private Runnable mScanningFishedRunnable;\n\n    public UsbTransferDataUtils(IOnScanSuccessListener onScanSuccessListener) {\n        mOnScanSuccessListener = onScanSuccessListener;\n        mStringBufferResult = new StringBuffer();\n        mHandler = new Handler();\n        mScanningFishedRunnable = new Runnable() {\n            @Override\n            public void run() {\n                performScanSuccess();\n            }\n        };\n    }\n\n    public void analysisKeyEvent(KeyEvent event) {\n        int keyCode = event.getKeyCode(); \/\/\u5b57\u6bcd\u5927\u5c0f\u5199\u5224\u65ad\n        checkLetterStatus(event);\n        if (event.getAction() == KeyEvent.ACTION_DOWN) {\n            char aChar = getInputCode(event);\n            if (aChar != 0) {\n                mStringBufferResult.append(aChar);\n            }\n            if (keyCode == KeyEvent.KEYCODE_ENTER) { \/\/\u82e5\u4e3a\u56de\u8f66\u952e\uff0c\u76f4\u63a5\u8fd4\u56de\n                mHandler.removeCallbacks(mScanningFishedRunnable);\n                mHandler.post(mScanningFishedRunnable);\n            } else { \/\/\u5ef6\u8fdfpost\uff0c\u82e5500ms\u5185\uff0c\u6709\u5176\u4ed6\u4e8b\u4ef6\n                mHandler.removeCallbacks(mScanningFishedRunnable);\n                mHandler.postDelayed(mScanningFishedRunnable, 500);\n            }\n        }\n    }\n\n    private void checkLetterStatus(KeyEvent event) {\n        int keyCode = event.getKeyCode();\n        if (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT || keyCode == KeyEvent.KEYCODE_SHIFT_LEFT) {\n            if (event.getAction() == KeyEvent.ACTION_DOWN) { \/\/\u6309\u7740shift\u952e\uff0c\u8868\u793a\u5927\u5199\n                mCaps = true;\n            } else { \/\/\u677e\u5f00shift\u952e\uff0c\u8868\u793a\u5c0f\u5199\n                mCaps = false;\n            }\n        }\n    }\n\n    \/\/\u83b7\u53d6\u626b\u63cf\u5185\u5bb9 6921734962300\n    private char getInputCode(KeyEvent event) {\n        int keyCode = event.getKeyCode();\n        char aChar;\n        if (keyCode &gt;= KeyEvent.KEYCODE_A &amp;&amp; keyCode &lt;= KeyEvent.KEYCODE_Z) { \/\/\u5b57\u6bcd\n            aChar = (char) ((mCaps ? &#039;A&#039; : &#039;a&#039;) + keyCode - KeyEvent.KEYCODE_A);\n        } else if (keyCode &gt;= KeyEvent.KEYCODE_0 &amp;&amp; keyCode &lt;= KeyEvent.KEYCODE_9) { \/\/\u6570\u5b57\n            aChar = (char) (&#039;0&#039; + keyCode - KeyEvent.KEYCODE_0);\n        } else { \/\/\u5176\u4ed6\u7b26\u53f7\n            switch (keyCode) {\n                case KeyEvent.KEYCODE_PERIOD:\n                    aChar = &#039;.&#039;;\n                    break;\n                case KeyEvent.KEYCODE_MINUS:\n                    aChar = mCaps ? &#039;_&#039; : &#039;-&#039;;\n                    break;\n                case KeyEvent.KEYCODE_SLASH:\n                    aChar = &#039;\/&#039;;\n                    break;\n                case KeyEvent.KEYCODE_BACKSLASH:\n                    aChar = mCaps ? &#039;|&#039; : &#039;\\\\&#039;;\n                    break;\n                default:\n                    aChar = 0;\n                    break;\n            }\n        }\n        return aChar;\n    }\n\n    \/\/\u63a5\u53e3\u56de\u8c03\n    public interface IOnScanSuccessListener {\n        void onScanSuccess(String barcode);\n    }\n\n    private void performScanSuccess() {\n        String barcode = mStringBufferResult.toString();\n        if (mOnScanSuccessListener != null) mOnScanSuccessListener.onScanSuccess(barcode);\n        mStringBufferResult.setLength(0);\n    }\n}<\/code><\/pre>\n<h3>\u5904\u7406\u56de\u8c03\u7ed3\u679c<\/h3>\n<pre><code> \/**\n * s\u626b\u63cf\u4e8b\u4ef6\u76d1\u542c\n *\n * @param barcode\n *\/\n@Override\npublic void onScanSuccess(String barcode) {\n    mealCode = barcode;\n    Log.e(&quot;yezhou&quot;, barcode);\n    if (mealCode.length() &gt; 0) {\n        \/\/\u626b\u7801\u8c03\u63a5\u53e3\n\n    }\n}<\/code><\/pre>\n<h2>\u81ea\u5b9a\u4e49Edittext<\/h2>\n<pre><code class=\"language-java\">public class ScannerEditText extends AppCompatEditText implements TextWatcher {\n\n    private ScannerTextInterface textInterface;\n\n    public ScannerEditText(Context context) {\n        super(context);\n    }\n\n    public ScannerEditText(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        addTextChangedListener(this);\n    }\n\n    public void ScannerTextCallBack(ScannerTextInterface anInterface){\n        this.textInterface = anInterface;\n    }\n\n    public interface ScannerTextInterface{\n        void getScavengingText(String s);\n    }\n\n    @Override\n    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {\n\n    }\n\n    @Override\n    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {\n\n    }\n\n    @Override\n    public void afterTextChanged(Editable s) {\n        String str = s.toString();\n        if (str.length() &gt; 2) {\n            if (str.endsWith(&quot;\\n&quot;)) {\n                if (textInterface != null){\n                    textInterface.getScavengingText(str);\n                }\n                s.clear();\n            }\n        }\n    }\n}<\/code><\/pre>\n<p>\u5728\u5bf9\u5e94\u7684<code>Activity implements ScannerEditText.ScannerTextInterface<\/code>\u63a5\u53e3\uff0c\u91cd\u5199\u65b9\u6cd5<code>getScavengingText(String s)<\/code>\u5728\u8fd9\u4e2a\u65b9\u6cd5\u4e2d\u53c2\u6570\u5c31\u662f\u6211\u4eec\u626b\u63cf\u83b7\u53d6\u5230\u7684\u7ed3\u679c<\/p>\n<p>\u95ee\u9898\u7f3a\u9677\uff1a\u91cd\u5199<code>dispatchKeyEvent<\/code>\u65b9\u6cd5\u540e\uff0c\u8fd9\u4e2a\u65b9\u6cd5\u4f9d\u8d56Activity\uff0c\u786e\u5b9e\u53ef\u4ee5\u76d1\u542c\u5230\u626b\u7801\u5668\u901a\u8fc7USB\u4f20\u9012\u8fc7\u6765\u7684\u6570\u636e\uff0c\u4f46\u662f\u5f53\u8fd9\u4e2aActivity\u754c\u9762\u4e0d\u53ef\u89c1\u65f6\u4e5f\u5c31\u662f\u6267\u884c<code>onPause<\/code>\u65b9\u6cd5\u540e\u5c31\u4e0d\u4f1a\u6267\u884c\u8be5\u65b9\u6cd5\u3002\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u4e5f\u662f\u4f9d\u8d56Activity<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u62e6\u622adispatchKeyEvent\u65b9\u6cd5 \u91cd\u5199dispatchKeyEvent\u65b9\u6cd5 @Override pub [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[311],"tags":[472,473],"class_list":["post-1841","post","type-post","status-publish","format-standard","hentry","category-android-advance","tag-usb","tag-473"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1841","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1841"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1841\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}