我正在编写一个使用外部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字段中。
所以,我需要知道的是,如何从任何外部源(例如扫描仪,键盘等)捕获标准输入,并在将其放置在我想要的位置之前对其进行操作(表单字段,数据库等) )。
我该怎么做呢?
答案 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
}
});