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

Android中读取/dev/input/event1并在TextView显示二进制内容求助

解决Android 4.4读取/dev/input/event1并显示二进制内容的问题

我来帮你搞定这个问题!你遇到的特殊字符乱码,本质是直接把二进制字节当成普通字符串解析了——毕竟/dev/input/event1是二进制设备文件,直接转字符串肯定会出现不可见字符。要显示成0和1的二进制格式,核心是把读取到的每个字节转换成对应的8位二进制字符串,再拼接起来展示。下面是具体的实现步骤和代码示例:

核心处理逻辑

  • 以字节流方式读取设备文件,避免按字符串直接读取
  • 将单个字节转换为8位二进制字符串(不足8位补前导0,保证格式统一)
  • 在UI线程安全更新TextView(避免主线程阻塞导致ANR)
  • 重要提示:读取/dev/input这类系统设备节点,Android 4.4通常需要Root权限,或者你的应用是系统签名应用,后续记得补充权限相关逻辑

代码示例

1. 用AsyncTask异步读取并转换

public class InputEventReaderTask extends AsyncTask<Void, String, Void> {
    private TextView mOutputTextView;
    private final File mInputEventFile = new File("/dev/input/event1");

    public InputEventReaderTask(TextView textView) {
        mOutputTextView = textView;
    }

    @Override
    protected Void doInBackground(Void... voids) {
        if (!mInputEventFile.exists()) {
            publishProgress("错误:目标文件不存在");
            return null;
        }

        try (FileInputStream fis = new FileInputStream(mInputEventFile)) {
            byte[] buffer = new byte[256]; // 按需调整缓冲区大小
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                StringBuilder binaryContent = new StringBuilder();
                for (int i = 0; i < bytesRead; i++) {
                    // 把有符号byte转成无符号值,再转8位二进制,补前导0
                    String byteBinary = String.format("%8s", 
                        Integer.toBinaryString(buffer[i] & 0xFF)).replace(' ', '0');
                    binaryContent.append(byteBinary).append(" "); // 加空格分隔每个字节
                }
                publishProgress(binaryContent.toString());
            }
        } catch (IOException e) {
            publishProgress("读取失败:" + e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);
        // 在UI线程追加显示内容
        mOutputTextView.append(values[0]);
    }
}

2. 在Activity中启动任务

// 假设你的TextView控件id是tv_binary_output
TextView outputTv = findViewById(R.id.tv_binary_output);
new InputEventReaderTask(outputTv).execute();

关键细节解释

  • buffer[i] & 0xFF:Java的byte是有符号类型,直接转int会补符号位导致二进制字符串异常,用& 0xFF可以把它转为无符号的字节值,保证二进制转换正确
  • String.format("%8s", ...).replace(' ', '0'):确保每个字节都显示为完整的8位二进制,避免出现短位的情况
  • 异步读取:直接在主线程读取文件会触发ANR,所以必须用AsyncTask、协程或者HandlerThread来做后台处理

这样调整后,TextView就能正常显示0和1组成的二进制内容,不会再出现奇怪的特殊字符了!

内容的提问来源于stack exchange,提问作者JoeG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:18:08