-1

Android アプリ (クライアント) と Python サーバーの間で Bluetooth 接続を確立しようとしています。ただし、ストリームに問題があります。このコードは aClassCastExceptionをスローしますが、その理由と修正方法がわかりません。アイデアやヒントはありますか?

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

        // Get the BluetoothSocket input and output streams
        try {
            // THIS IS WHERE THE EXCEPTION IS THROWN
            tmpIn = (DataInputStream) socket.getInputStream(); 
            tmpOut = (DataOutputStream) socket.getOutputStream();
        } catch (IOException e) {
            Log.e(TAG, "temp sockets not created", e);
        }
        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }
4

1 に答える 1

0

Socket.getInputStream() は、DataInputStream ではなく、InputStream を返します。Socket.getOutputStream() は、DataOutputStream ではなく、OutputStream を返します。タイプが 100% 確実でない限り、InputStream または OutputStream からサブクラスにキャストしないでください。ただし、生の InputStream および OutputStream から DataInputStream または DataOutputStream を作成することはできます (以下を参照)。

キャストを削除して、コードを次のようにすることができます (mmInStream 変数と mmOutStream 変数が同じである場合は、新しい DataInputStream と新しい DataOutputStream も作成する必要があります)。

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

    // Get the BluetoothSocket input and output streams
    try {
        tmpIn = socket.getInputStream(); 
        tmpOut = socket.getOutputStream();
    } catch (IOException e) {
        Log.e(TAG, "temp sockets not created", e);
    }
    mmInStream = new DataInputStream(tmpIn);
    mmOutStream = new DataOutputStream(tmpOut);
}

(PS. ストリームを閉じることを忘れないでください!)

于 2013-12-09T19:03:41.863 に答える