如何在Android蓝牙文件传输中检测EOF?

时间:2011-04-24 02:31:00

标签: android file bluetooth

我使用现在的经典Google蓝牙聊天代码实现了蓝牙连接。但是,我有一个问题,我似乎无法将我的大脑包裹起来。

读取输入流的方式如下:

public void run() {
    byte[] buffer = new byte[1024];  // buffer store for the stream
    int bytes; // bytes returned from read()

    // Keep listening to the InputStream until an exception occurs
    while (true) {
        try {
            // Read from the InputStream
            bytes = mmInStream.read(buffer);
            // Send the obtained bytes to the UI Activity
            mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                    .sendToTarget();
        } catch (IOException e) {
            break;
        }
    }
}

现在,如果我只打印出原始示例中收到的字符,那就没关系了。但是,假设我想传输图像文件。我不知道文件的大小,所以我不能计算收到的字节或类似的东西。在我的测试中,我似乎从输入流中看不到“-1”,这似乎是从输入流中读取的“标准”。那么我怎么知道我已经到达了正在发送的文件的末尾?

感谢您的帮助和时间。

4 个答案:

答案 0 :(得分:3)

似乎Android蓝牙输入流永远不会返回-1。

我想首先通过发送文件大小设置一个简单的协议,最后EOF信号会有所帮助。

答案 1 :(得分:2)

不,不。据我所知,只有当Socket关闭时,Android才会发送-1。所以一个解决方法可能是重新连接,但我尝试了几个小时并没有让它工作,因为我不明白这里的“特殊”代码(从Stackoverflow线程复制)来设置套接字:

        BluetoothSocket tmp = null;
    Log.d(TAG, "New Connection initialized");
    Method m;
    try {
        m = device.getClass().getMethod("createRfcommSocket",
                new Class[] { int.class });
        tmp = (BluetoothSocket) m.invoke(device, 1);
    } catch (Exception e) {
        e.printStackTrace();
    }
    mmSocket = tmp;

此Socket仅在我的应用程序启动第一个文件传输时才有效。如果我想用一个全新的实例化对象(以及用该代码创建的新Socket)“重新连接”,程序会冻结阻塞方法mmSocket.connect()。似乎方法永远不会结束。这让我疯了......

答案 2 :(得分:1)

尝试

while ((bytes = mmInStream.read(buffer) != -1)

看看是否有帮助。

答案 3 :(得分:1)

试试这个:

        public void run() {
        byte[] buffer;
        ArrayList<Integer> arr_byte = new ArrayList<Integer>();
        while (true) {
            try {
                int data = mmInStream.read();
                if(mmInStream.available()>0) {
                    arr_byte.add(data);
                } else {
                    arr_byte.add(data);
                    buffer = new byte[arr_byte.size()];
                    for(int i = 0 ; i < arr_byte.size() ; i++) {
                        buffer[i] = arr_byte.get(i).byteValue();
                    }
                    Log.e("INPUT",new String(buffer));
                    mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                            .sendToTarget();
                    arr_byte = new ArrayList<Integer>();
                }
            } catch (IOException e) {
                break;
            }
        }
    }