vic
vic

Reputation: 21

BluetoothChat doesn't work

Hello I want to make conversation between android devices. I use BluetoothChat to do this but it doesn't work I can't read correctly data from another device.

Conversation is :

Me: privet

Device: p Device: rivet

Can you help me?

private class ConnectedThread extends Thread {

    private final InputStream mmInStream;
    private final OutputStream mmOutStream;

    public ConnectedThread(BluetoothSocket socket) {
        Log.d(TAG, "create ConnectedThread");
        mmSocket = socket;
        //InputStream tmpIn = null;
        OutputStream tmpOut = null;
        BufferedInputStream tmpIn=null;

        int INPUT_BUFFER_SIZE=32;
        // Get the BluetoothSocket input and output streams
        try {
            //tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
            tmpIn = new BufferedInputStream(socket.getInputStream(),INPUT_BUFFER_SIZE);

        } catch (IOException e) {
            Log.e(TAG, "temp sockets not created", e);
        }

        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }

    public void run() {
        Log.i(TAG, "BEGIN mConnectedThread");
        byte[] buffer = new byte[1024];
        int bytes;

        // Keep listening to the InputStream while connected
        while (true) {
            try {
                // Read from the InputStream

              bytes = mmInStream.read(buffer);
                // Send the obtained bytes to the UI Activity
                mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer)
                        .sendToTarget();
            } catch (IOException e) {
                Log.e(TAG, "disconnected", e);
                connectionLost();
                break;
            }
        }
    }

Upvotes: 2

Views: 2937

Answers (1)

Madhu Nandan
Madhu Nandan

Reputation: 162

The fix for the solution was to create the string in the connected thread, directly after calling read() on the InputStream, and then passing the string back to the main thread for display. For whatever reason, passing the byte array between threads led to significant repetition and data loss.

Modified run() code:

public void run() {
    byte[] buffer = new byte[256];  // 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);
            String readMessage = new String(buffer, 0, bytes);
            // Send the obtained bytes to the UI Activity
            mHandler.obtainMessage(MESSAGE_READ, bytes, -1, readMessage)
                    .sendToTarget();
        } catch (IOException e) {
            break;
        }
    }
}

And the handler reception:

case MESSAGE_READ:
        // Read in string from message, display to mainText for user
        String readMessage = (String) msg.obj;
        if (msg.arg1 > 0) {
            mainText.append(readMessage);
        }

Upvotes: 1

Related Questions