OutputStream в DataOutputStream для связи через Bluetooth

Я уже писал с помощью учебников я нашел в Интернете приложение для Android, которое подключается к устройству Bluetooth. Это приложение использовало объекты InputStream и OutputStream для подключения и установления соединения. Поскольку мне нужно было передать небольшой объем данных, это решение было в порядке, потому что я мог отправлять только байты.

Теперь я хотел бы изменить свой старый код, чтобы использовать DataInputStream и DataOutputStream для простой отправки сложных данных. Я попытался изменить свой исходный код, просто добавив идентификатор данных перед моими InputStream и OutputStream, но это создало ошибку в моем коде. Может ли кто-нибудь объяснить мне, как правильно использовать DataInputStream и DataOutputStream, чтобы я не получал ошибок. Это мой старый код:

 private class ConnectedThread extends Thread {
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;

    public ConnectedThread(BluetoothSocket socket) {
        InputStream tmpIn = null;
        OutputStream tmpOut = null;

        // Get the input and output streams, using temp objects because
        // member streams are final
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) { }

        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }

    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);        // Get number of bytes and message in "buffer"
                hBluetooth.obtainMessage(RECEIVE_MESSAGE, bytes, -1, buffer).sendToTarget();        // Send to message queue Handler
            } catch (IOException e) {
                break;
            }
        }
    }

    /* Call this from the main activity to send data to the remote device */
    public void send(String message) {
        if(D)   Log.d(TAG, "...Data to send: " + message + "...");
        if (btSocket != null && btSocket.isConnected()) {

        byte[] msgBuffer = message.getBytes();
        try {
            mmOutStream.write(msgBuffer);
            Log.e(TAG, "Int" +msgBuffer);
        } catch (IOException e) {
            Log.d(TAG, "...Error data send: " + e.getMessage() + "...");     
          }
        }

    }

а вот измененная версия:

 private class ConnectedThread extends Thread {
     DataInputStream mmInStream;
     DataOutputStream mmOutStream;


    public ConnectedThread(BluetoothSocket socket) {
       InputStream tmpIn = null;
       OutputStream tmpOut = null;

        mmInStream = new DataInputStream(tmpIn);
        mmOutStream = new DataOutputStream(tmpOut);

        // Get the input and output streams, using temp objects because
        // member streams are final
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) { }

        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }

Спасибо за любой вклад!


person Mathieu660    schedule 14.03.2013    source источник
comment
это создало какую ошибку в моем коде?   -  person user207421    schedule 15.03.2013


Ответы (1)


ЕСЛИ я правильно понял ваш вопрос, сделайте что-то вроде этого, чтобы получить объекты DataInputStream и DataOutputStream:

  mmInStream = new DataInputStream(tmpIn);
  mmOutStream = new DataInputStream(tmpOut);

Переменные будут объявлены, как показано ниже, вне класса, если вам нужно, чтобы они были глобальными, как я вижу из вашего редактирования, которое вы сделали:

   DataInputStream mmInStream;
   DataOutputStream mmOutStream;

РЕДАКТИРОВАТЬ Для обновленного вопроса:

public ConnectedThread(BluetoothSocket socket) {
   InputStream tmpIn = null;
   OutputStream tmpOut = null;


    // Get the input and output streams, using temp objects because
    // member streams are final
    try {
        tmpIn = socket.getInputStream();
        tmpOut = socket.getOutputStream();
    } catch (IOException e) { }

    mmInStream = new DataInputStream(tmpIn);
    mmOutStream = new DataOutputStream(tmpOut);


}
person user_CC    schedule 14.03.2013
comment
Я думаю, что это решение точно такое же, как моя модифицированная версия, которая работает неправильно? - person Mathieu660; 15.03.2013
comment
нет, это не в вашем вы отбрасываете объекты. Вам нужно создать объекты DataInputStream и DataoutputStream, используя правильный конструктор; developer.android.com/reference/java/io/DataInputStream.html developer.android.com/reference/java/io/DataOutputStream.html Попробуйте и дайте мне знать большое спасибо - person user_CC; 15.03.2013
comment
Хорошо, я сделал некоторые изменения, как вы можете видеть в исходном сообщении, но теперь у меня есть несоответствие типов в mmInStream = tmpIn; и mmOutStream = tmpOut; Может я что-то не так делаю.... - person Mathieu660; 15.03.2013
comment
посмотрите на мой ответ, сделайте так: mmInStream = new DataInputStream(tmpIn); mmOutStream = новый поток ввода данных (tmpOut); - person user_CC; 15.03.2013
comment
Я посмотрел модифицированную версию в своем посте. - person Mathieu660; 15.03.2013
comment
посмотрите на мой обновленный ответ; На самом деле вы сделали это до получения потоков, после создания объектов используйте новые объекты потока данных. - person user_CC; 15.03.2013
comment
ОК, отлично, это работает, поэтому мы поместили простой поток в объект потока данных! Я понимаю. спасибо это работает - person Mathieu660; 15.03.2013