You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 01:27:17