如何从标准输入(stdin)捕获进入Android应用程序的数据?

如何从标准输入(stdin)捕获进入Android应用程序的数据?,android,stdin,Android,Stdin,我正在编写一个使用外部USB条形码/RFID扫描仪的应用程序。扫描仪是标准的HID,在我的Android设备上运行良好。我将其插入,点击扫描按钮,数据就会在文本编辑应用程序中弹出。标准USB键盘也是如此。我将其插入,开始输入,数据就会显示在文本编辑应用程序中 这就是我需要帮助的地方。我需要做的是操作从扫描仪或外部键盘进入我的应用程序的数据,然后才能将其放入应用程序的正确表单字段中 在这一点上,我想我可以在标准输入端截取数据,所以我想到了: 活动\u main.xml <LinearLayo

我正在编写一个使用外部USB条形码/RFID扫描仪的应用程序。扫描仪是标准的HID,在我的Android设备上运行良好。我将其插入,点击扫描按钮,数据就会在文本编辑应用程序中弹出。标准USB键盘也是如此。我将其插入,开始输入,数据就会显示在文本编辑应用程序中

这就是我需要帮助的地方。我需要做的是操作从扫描仪或外部键盘进入我的应用程序的数据,然后才能将其放入应用程序的正确表单字段中

在这一点上,我想我可以在标准输入端截取数据,所以我想到了:

活动\u main.xml

<LinearLayout>
    <EditText android:id="@+id/scan_data" />
</LinearLayout>
我写了这个,连接了我的扫描仪,扫描了一个RFID标签。令我惊讶的是,整个扫描字符串显示在我的EditText字段中,而不仅仅是一部分。经过一些调试,我发现我可以删除
setContentView()
之后的所有代码,并且整个字符串仍然显示在我的EditText字段中

因此,我需要知道的是,我如何从任何外部源(例如,扫描仪、键盘等)捕获stdin,并在将其放置在我想要的位置(表单字段、数据库等)之前对其进行操作


我怎样才能做到这一点呢?

简单的回答是,你不能访问stdin,Android应用程序中没有这样的动物。由于您使用的RFID/USB设备本身显示为HID设备,因此正在将文本注入活动的
EditText
。Android子系统会自动将其作为输入源,并将其输入路由到活动视图,就像来自键盘一样

然而,一切都没有失去。您可以将
TextWatcher
附加到您的
EditText
并在
可编辑的
中操作文本:

EditText et = (EditText)findViewById(R.id.whatever_your_id);
et.addTextChangedListener(new TextWatcher() {
        @Override
        void afterTextChanged (Editable s) {
            //  Make your changes to 's' here, carefully as your changes will
            //  cause this method to be called again!
        }

        @Override
        void beforeTextChanged(CharSequence s, int start, int count, int after) {
            //  Nothing to do here
        }

        @Override
        void onTextChanged(CharSequence s, int start, int before, int count) {
            //  Nothing to do here
        }
    });

谢谢你的意见。不过,一个简短的问题。当我扫描一个标签时,假设代码是“0123456789”,然后s变成:“0”然后是“01”然后是“012”然后是“0123”然后是“01234”,然后是“012345”。。。等等关于如何处理这个问题有什么建议吗?这是因为添加的每个字符都在更改可编辑的
。扫描仪是否发送字符终止符,如换行符?因为您试图使用
readline()
,所以我假设它可以。如果是这样的话,你可以关掉它,只有在它到达后才进行操作。这里的缺点是,文本字段将在设置最终修改的字符串之前显示未修改的字符串。更复杂的方法是使用一个小型状态机,它接受修改后的输入并将其添加到实例变量中;换行符到达后进行更改并设置为
s
。否。。。完全没有换行符。输入刚刚停止。如果我要扫描一个新的条形码/RFID,那么它将在第一个条形码停止的地方开始打印;我无法事先知道要多长时间。当TextWatcher不再读取任何输入时,有什么东西我可以关闭按键告诉我吗?
TextWatcher
不会读取输入,当输入从HID设备异步到达时,它会收到通知。如果你想利用这么多的“空闲”时间来操作它,你就必须做得更精细一些,运行某种
计时器
来更新文本。
EditText et = (EditText)findViewById(R.id.whatever_your_id);
et.addTextChangedListener(new TextWatcher() {
        @Override
        void afterTextChanged (Editable s) {
            //  Make your changes to 's' here, carefully as your changes will
            //  cause this method to be called again!
        }

        @Override
        void beforeTextChanged(CharSequence s, int start, int count, int after) {
            //  Nothing to do here
        }

        @Override
        void onTextChanged(CharSequence s, int start, int before, int count) {
            //  Nothing to do here
        }
    });