UROVO DT40设备条码扫描按键适配EditText及数据PC读取开发求助
UROVO DT40 库存管理APP开发问题解答
1. 设备扫描键触发、扫描结果自动填充EditText实现
优博讯DT40的扫描头默认支持广播模式输出结果,是兼容性最好、实现最简单的方案,不需要处理复杂的按键事件拦截,也不依赖页面焦点:
- 提前在设备自带的「扫描设置」中确认输出模式为广播输出,优博讯设备默认扫描广播Action为
android.intent.action.SCAN_RESULT,扫描结果字符串存在Extra字段scandata中,不需要额外集成SDK。 - 在Activity中动态注册扫描广播接收器,接收到结果后直接填充到当前获得焦点的输入框即可,参考实现代码:
// 先定义广播接收相关常量 private static final String SCAN_ACTION = "android.intent.action.SCAN_RESULT"; private BroadcastReceiver scanReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (SCAN_ACTION.equals(intent.getAction())) { // 拿到扫描结果,自动去除首尾空白 String scanResult = intent.getStringExtra("scandata").trim(); // 找当前获得焦点的输入框填充 View focusView = getCurrentFocus(); if (focusView instanceof TextInputEditText) { ((TextInputEditText) focusView).setText(scanResult); // 可选:填充完自动移动焦点到下一个输入框,提升录入效率 focusView.focusSearch(View.FOCUS_DOWN).requestFocus(); } } } }; @Override protected void onResume() { super.onResume(); // 页面可见时注册扫描广播 IntentFilter filter = new IntentFilter(SCAN_ACTION); registerReceiver(scanReceiver, filter); } @Override protected void onPause() { super.onPause(); // 页面不可见时注销广播,避免内存泄漏 unregisterReceiver(scanReceiver); }
不要用按键事件监听的方式实现,不同固件版本扫描键的keycode可能有差异,适配成本高。
2. Adapter数据持久化、PC可读取实现
你现有代码有两个核心问题,会导致功能完全不符合预期:
- 调用
adapter.toString()拿到的不是列表里的业务数据,是ArrayAdapter对象的内存地址字符串,存到文件里完全是无效内容 - 用
openFileOutput()存储的文件在应用私有目录下,PC通过MTP连接设备时默认无权访问,根本读不到
正确实现逻辑如下:
- 直接操作你绑定Adapter的数据源
listitems,不要从Adapter里取数据 - 存储格式选标准CSV格式,用分号分隔两列内容,PC端用Excel、记事本都可以直接打开
- 存储路径选设备公共Documents目录,安卓10及以上分区存储模式下不需要申请额外存储权限,PC连接后可以直接在对应目录找到文件
- 存完之后主动通知系统刷新媒体库,避免PC连接后看不到刚生成的文件
修正后的保存逻辑代码:
// 先替换saveBtn的点击逻辑 saveBtn.setOnClickListener(v -> { if (listitems.size() > 0) { // 拼接CSV格式内容,第一行加表头方便PC端识别 StringBuilder dataBuilder = new StringBuilder(); dataBuilder.append("条码,备注\n"); // 替换为你实际的两列字段名 for (String item : listitems) { dataBuilder.append(item).append("\n"); } writeToFile(dataBuilder.toString()); Toast.makeText(MainActivity.this, "保存成功!", Toast.LENGTH_LONG).show(); } }); // 替换原有writeToFile方法 private void writeToFile(String data) { try { // 存到公共Documents目录,PC可直接读取 File docDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS); if (!docDir.exists()) { docDir.mkdirs(); } File saveFile = new File(docDir, "库存记录_" + System.currentTimeMillis() + ".csv"); OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(saveFile), "GBK"); // 用GBK编码是为了PC端Excel打开不乱码,如果只用记事本打开可以换成UTF-8 writer.write(data); writer.close(); // 通知系统刷新媒体库,PC立刻能看到文件 Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); mediaScanIntent.setData(Uri.fromFile(saveFile)); sendBroadcast(mediaScanIntent); } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "保存失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } }
如果你的设备是安卓13及以上版本,不需要申请任何存储权限;如果是安卓9及以下版本,需要在Manifest里加WRITE_EXTERNAL_STORAGE权限,并且动态申请后再执行存储逻辑。
内容的提问来源于stack exchange,提问作者teck94
相关产品推荐
相关产品推荐

