-1

我正在尝试在我的 Android 应用程序(客户端)和我的 python 服务器之间建立蓝牙连接。但是,我遇到了流的问题。这段代码抛出一个ClassCastException,我不知道为什么以及如何修复它。有什么想法或提示吗?

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() 返回的是 InputStream,而不是 DataInputStream。Socket.getOutputStream() 返回的是 OutputStream,而不是 DataOutputStream。除非您 100% 确定类型,否则不应将 InputStream 或 OutputStream 转换为子类。但是,您可以从原始 InputStreams 和 OutputStreams 创建 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 回答