C# 如何使用蓝牙插座从游戏控制器接收按钮事件?

C# 如何使用蓝牙插座从游戏控制器接收按钮事件?,c#,android,sockets,bluetooth,xamarin.android,C#,Android,Sockets,Bluetooth,Xamarin.android,目前,我与游戏控制器的蓝牙连接正常。现在我正在尝试捕捉按钮事件,但这并不是那么容易。我有以下代码: private Stream mmInStream; private Stream mmOutStream; public BluetoothController() { } public void Read(BluetoothSocket socket) { Stream tmpIn = null; S

目前,我与游戏控制器的蓝牙连接正常。现在我正在尝试捕捉按钮事件,但这并不是那么容易。我有以下代码:

    private Stream mmInStream;
    private Stream mmOutStream;

    public BluetoothController()
    {

    }

    public void Read(BluetoothSocket socket)
    {
        Stream tmpIn = null;
        Stream tmpOut = null;

        try
        {
            tmpIn = socket.InputStream;
            tmpOut = socket.OutputStream;
        }
        catch (IOException ex)
        {
            throw ex;
        }

        mmInStream = tmpIn;
        mmOutStream = tmpOut;

        Thread thread = new Thread(new ThreadStart(Run));
        thread.Start();
    }

    protected void Run()
    {
        byte[] buffer = new byte[1024];
        int bytes;

        while (true)
        {
            try
            {
                // Thanks to @spaceplane
                if (mmInStream.IsDataAvailable())
                {
                    // Read from the InputStream
                    bytes = mmInStream.Read(buffer, 0, buffer.Length);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
当我按下gamecontroller上的按钮时,它不会进入下一行:

if (mmInStream.IsDataAvailable())
这里出了什么问题?

mmInStream.read()
如果流中当前没有可读取的数据,则阻塞。因此,如果没有数据,它将被困在那里等待。在从流中读取之前,您应该检查是否有可用的数据。改变

bytes=mmInStream.Read(buffer,0,buffer.Length)


问题解决了。我不需要蓝牙插座。我只是使用了覆盖方法“KeyDown”和“keydup”。现在效果很好:)

如果您需要一个套接字,并且出现了IOException:read failed之类的异常,套接字可能已关闭,那么您应该在此处阅读我的修复程序:


IOException:读取失败,套接字可能已关闭-Android 4.3上的蓝牙

谢谢@spaceplane。这就行了!但当我按下游戏控制器上的一个按钮时,它不会进入if语句中。。。但应该可以使用流从游戏控制器读取数据,对吗?问题解决了,请查看我的帖子:
if(mmInStream.available() > 0) {
  bytes = mmInStream.Read(buffer, 0, buffer.Length);
}