0

在阅读了 dot42 评论并查看了 Java 示例后,我设法设置了蓝牙连接,但无法打开连接。我无法确定问题所在。我一步一步地跟着文档。

我的目标设备是在 2.3 Gingerbread 上运行的 HTC Explorer。这是我的代码。

//Target 2.3 (Gingerbread)
[assembly: Application("dot42Application1")]

[assembly: UsesPermission(Android.Manifest.Permission.BLUETOOTH)]
[assembly: UsesPermission(Android.Manifest.Permission.BLUETOOTH_ADMIN)]

namespace dot42Application1
{
    [Activity]
    public class MainActivity : Activity
    {

        private TextView txStatus;

        protected override void OnCreate(Bundle savedInstance)
        {
            base.OnCreate(savedInstance);
            SetContentView(R.Layouts.MainLayout);

            // Find UI controls
            txStatus = FindViewById<TextView>(R.Ids.txStatus);

            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 

            var bt = BluetoothAdapter.GetDefaultAdapter();

            if (bt != null) //If device has not Bluetooth this will be null
            {
                if (bt.IsEnabled()) //Is Bluetooth device enabled?
                {
                    var BT_My_Addr = bt.Address; //Get the devices MAC
                    var BT_Bonded = bt.GetBondedDevices().ToList(); //Get a list of bonded devices- I bonded to a BT2TTL Board earlier.

                    txStatus.Text = BT_My_Addr + System.Environment.NewLine; //Shows my MAC on screen.

                    string BT_Remote_Address = string.Empty;
                    foreach (var BTDevice in BT_Bonded) //Just searchging for string in bonded list
                    {
                        if (BTDevice.Name.Contains("linvor"))  
                        {
                            BT_Remote_Address = BTDevice.Address;
                        }
                    }

                    //Gets remote device
                    var BT_Remote_Device = bt.GetRemoteDevice(BT_Remote_Address);

                    //Create a RFCOMM Socket to remote device using popular UUID ofr BT Serial boards
                    var BTsocket = BT_Remote_Device.CreateInsecureRfcommSocketToServiceRecord(Java.Util.UUID.FromString("00001101-0000-1000-8000-00805F9B34FB"));

                    //Call anyway to make sure there is no discvoerry in the backgorund. It slows stuff down.
                    bt.CancelDiscovery(); 

                    //Exception here? Dont know why :(
                    BTsocket.Connect();

                    //Suppsoed to dump 0 to 99999 to my listening serial device but I never get this far.
                    var BT_Out = BTsocket.GetOutputStream();
                    for (int i = 0; i < 99999; i++)
                    {
                        BT_Out.Write(Encoding.ASCII.GetBytes(i.ToString()));

                    }


                }
                else
                {
                    txStatus.Text = "Bluetooth is disabled :(";
                }

            }
        }
    }

这就是它在创建套接字后显示的内容

在此处输入图像描述

和错误...

在此处输入图像描述

我究竟做错了什么?:(

4

1 回答 1

1

我似乎通过分析互联网上的各种代码片段解决了这个问题。我认为问题在于尝试在该OnCreate方法中做所有事情。我遵循的步骤如下:

  • 在主视图 (MainActivity.xml) 上创建了一个按钮并附加了一个 onClick 方法。

在此处输入图像描述

  • 将方法的所有代码移出OnCreate。(我认为这允许应用程序完全初始化。)使用两种方法为按钮创建了一个事件处理程序。

在此处输入图像描述

  • 这两种方法与我在原始问题中发布的代码相同。当用户单击按钮时,它们被分离出来并被调用。
    • findBT()获取默认适配器。如果没有启用意图过滤器,则检查是否启用了蓝牙。或者,如果是,它将循环遍历绑定列表并匹配设备名称并将 BluetoohDevice 存储在变量中。这是与我的代码不同的另一件事。我不使用 GetRemoteDevice 我只是将设备从 BondedList 分配给我的全局变量。

在此处输入图像描述

在此处输入图像描述

  • openBT()创建 RFCOMM 套接字(这不适用于 unsecure - 它抛出异常但使用安全方法有效!)

在此处输入图像描述

您必须使用 Android 蓝牙控制面板与远程设备配对。此代码不会扫描或连接到未配对的设备。它只会抛出空异常。

我也离开了目标 SDK 2.3.x,但我使用的是 4.x API。

-披露。我不是一个经验丰富的 Android 开发人员,我只是了解 Android 上下文中 Java 应用程序的生命周期。我希望这可以帮助其他尝试做同样的 C# 开发人员。

于 2013-09-13T18:53:16.063 回答