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

时间:2017-03-01 19:43:47

标签: android stdin

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

这是我需要帮助的地方。我需要做的是在我将应用程序放入应用程序的正确表单字段之前,从扫描仪或外部键盘处理进入我的应用程序的数据。

此时,我认为我可以在标准输入处拦截数据,所以这就是我提出的:

activity_main.xml中

<LinearLayout>
    <EditText android:id="@+id/scan_data" />
</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    EditText scannedInput = (EditText)findViewById(R.id.scan_data);

    BufferedReader scanner = new BufferedReader(new InputStreamReader(System.in));

    StringBuilder sBuilder = new StringBuilder();
    String buffer;

    while((buffer = scanner.readLine()) != null){
        sBuilder.append(buffer);
    }

    String[] dataPoints = sBuilder.toString().split("\u003D|\u0026");

    scannedInput.setTextColor(Color.RED);
    scannedInput.setTextSize(34f);
    scannedInput.setText(dataPoints[0]); // or dataPoints[1], dataPoints[2], etc.
}

我写了这个,连接我的扫描仪,扫描了一个RFID标签。令我惊讶的是,整个扫描的字符串出现在我的EditText字段中,而不仅仅是一个部分。经过一些调试后,我发现我可以删除setContentView()之后的所有代码,整个字符串仍显示在我的EditText字段中。

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

我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

简短的回答是您无法访问stdin,Android中没有针对应用的动物。正在将文本注入活动EditText,因为您正在使用的RFID / USB设备将其自身呈现为HID设备。这些由Android子系统自动选取作为输入源,其输入路由到活动视图,就好像它来自键盘一样。

然而,一切都不会丢失。您可以做的是将TextWatcher附加到EditText并操纵Editable中的文字:

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
        }
    });