【问题标题】:Bluetooth paired devices connection problems蓝牙配对设备连接问题
【发布时间】:2013-08-27 12:55:13
【问题描述】:

我遇到了连接问题。起初它有效,而不是它不,除非我取消配对设备。 我已经得到了所有可能发生的异常,套接字关闭、管道关闭、连接被拒绝、端口已在使用等。

我知道 android pre 4.2 (https://code.google.com/p/android/issues/detail?id=37725) 上的蓝牙存在问题。

我在连接这些设备时遇到问题的设备:

  • HTC one(android 4.2)
  • 三星galaxy s2(android 4.1.2)
  • 关系 4 (4.3)
  • 三星 Galaxy S4 (4.2)

另一个小问题是,配对设备未存储(主要在 nexus 4 和 sgs2 上)。

这是我的代码:

private static final UUID MY_UUID_SECURE = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); //this is the other one that I've tried: fa87c0d0-afac-11de-8a39-0800200c9a66");

private static final String NAME = "BluetoothConnector";

public void listenForConnection() throws IOException, BluetoothException {
//first close the socket if it is open
closeSocket();

BluetoothServerSocket mServerSocket = null;
try {
    mServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID_SECURE); //ioexception here!         
} catch (IOException e) {
    if (Build.VERSION.SDK_INT >= 9) {
        try { //this is a stupid hack, http://stackoverflow.com/questions/6480480/rfcomm-connection-between-two-android-devices
            Method m = mBluetoothAdapter.getClass().getMethod("listenUsingRfcommOn", new Class[] { int.class });
            mServerSocket = (BluetoothServerSocket) m.invoke(mBluetoothAdapter, PORT);
        } catch (Exception ex) {
            Log.e(ex);
            throw e;
        }
    } else {
        throw e;
    }
}

while (!isCancelled) {
    try {
        socket = mServerSocket.accept();
    } catch (IOException e) {
        if (socket != null) {
            try {
                socket.close();
            } finally {
                socket = null;
            }
        }
        throw e;
    }

    if (socket == null) {
        throw new BluetoothException("Socket connection connected, but null");
    } else {
        isConnected = true;
        break; // everything is ok
    }
}
}



public void connect(String address) throws IOException, BluetoothException {
mBluetoothAdapter.cancelDiscovery();

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);

try {
    socket = device.createRfcommSocketToServiceRecord(MY_UUID_SECURE);
} catch (IOException e1) {
    Log.e(e1);

    if (Build.VERSION.SDK_INT >= 9) {
        try {
            Method m = device.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
            socket = (BluetoothSocket) m.invoke(device, PORT);
        } catch (Exception e) {
            Log.e(e);
            throw e1;
        }
    } else {
        throw e1;
    }
}

// Make a connection to the BluetoothSocket
try {
    // This is a blocking call and will only return on a
    // successful connection or an exception
    socket.connect();
} catch (IOException e) {
    Log.e(e);
    // Close the socket
    try {
        socket.close();
    } catch (IOException e2) {
        Log.e(e2);
        Log.wtf("unable to close() socket during connection failure");
    }
    throw e;
}

}

private void closeSocket() {
    try {
        if (socket != null) {
            socket.close();
            socket = null;
            Log.d("Socket closed");
        }
    } catch (IOException e) {
        Log.e(e);
        Log.wtf("close() of connect socket failed");
    }
}

我尝试更改 uuid(也是随机的),尝试查看较旧的 sdk 示例。 那么这里有什么问题呢?

编辑:试图澄清:问题通常出现,当 2 个已配对、连接、成功通信的设备(由用户)断开连接时。之后,它们将无法重新连接,除非它们被重新启动或手动取消配对。

【问题讨论】:

    标签: android sockets bluetooth


    【解决方案1】:

    您正在尝试以这种方式配对:

    private void TwitPairedDevice() {
        buttonTwitPairDevice.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Set<BluetoothDevice> fetchPairedDevices=bluetooth.getBondedDevices();
                Iterator<BluetoothDevice> iterator=fetchPairedDevices.iterator();
                while(iterator.hasNext())
                {
                    final BluetoothDevice pairBthDevice=iterator.next();
                    final String addressPairedDevice=pairBthDevice.getAddress();
                    AsyncTask<Integer, Void, Void> asynchPairDevice=new AsyncTask<Integer, Void, Void>() {
    
                        @Override
                        protected Void doInBackground(Integer... params) {
                            try {
                                socket=pairBthDevice.createRfcommSocketToServiceRecord(uuid);
                                socket.connect();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            return null;
                        }
    
                        }
                    };asynchPairDevice.execute();
                }
            }
        });
    }
    

    连接付费设备:

        private void FetchPairedDevices() {
            Set<BluetoothDevice> pairedDevices=bluetooth.getBondedDevices();
            for(BluetoothDevice pairedBthDevice:pairedDevices)
            {
                listPairedDevice.add(pairedBthDevice.getName());
            }
            listviewPairedDevice.setAdapter(adapterPairedDevice);
            listviewPairedDevice.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                        long arg3) {
                    Object listPairedName=arg0.getItemAtPosition(arg2);
                    String selectedPairedName=listPairedName.toString();
                    Set<BluetoothDevice> bthDeviceChecking=bluetooth.getBondedDevices();
                    for(final BluetoothDevice bthDevice:bthDeviceChecking)
                    {
                        if(bthDevice.getName().contains(selectedPairedName))
                        {
                            listPairDevice.clear();
                            listPairDevice.add(bthDevice);
                            final String addressPairedDevice=bthDevice.getAddress();
                            AsyncTask<Integer, Void, Void> asynTask=new AsyncTask<Integer,Void,Void>() {
                                @Override
                                protected Void doInBackground(Integer... params) {
                                    try {
                                        socket=bthDevice.createRfcommSocketToServiceRecord(uuid);
                                        socket.connect();
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }
                                    return null;
                                }
    };
                            asynTask.execute(arg2);
                        }
                    }
                }
            });
        }
    

    【讨论】:

    • 在我的情况下,遍历所有可用的配对设备是没有意义的。我希望用户连接到特定设备。
    • k 您将在列表视图中显示您的配对设备,然后单击您想要的配对设备来配对该设备...我发布了一些用于连接配对设备的代码,请参阅...
    【解决方案2】:

    现在安卓上的蓝牙好像坏了。

    没有确定的方法可以连接 2 台设备,但始终有效。 Some people 正在使用非官方的方式来执行此操作,但这不适用于所有设备。

    我对目前市场上排名前 10 位的设备进行了一些内部测试,因此在大约 90 次测试运行之后,被黑的方法在 75% 的时间内都有效,这还不够好。

    例如,htc oneX 将只处理传入的蓝牙请求,作为蓝牙免提设备(它正在成功连接!),但无法发送消息。

    在实现完整的蓝牙功能后,我们决定将其从我们的应用程序中删除,并在没有它的情况下发布它。我们将在稍后的版本中切换到 wifi。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2015-10-26
      • 2016-06-08
      • 1970-01-01
      相关资源
      最近更新 更多