2

インターネットで見つけたチュートリアルの助けを借りて、Bluetooth デバイスに接続する Android 用アプリを既に作成しました。このアプリは、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;
    }

ご意見ありがとうございます。

4

1 に答える 1

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);


}
于 2013-03-14T22:50:23.843 に答える