蓝牙未连接4.4.2

时间:2014-09-03 18:48:59

标签: java android android-bluetooth

我有一台蓝牙设备连接了我在4.4.2之前尝试的所有Android版本。现在,它没有连接Galaxy Tab 4或S3。 Tab 3与4.1.2连接良好。尝试初始化AcceptThread时,问题似乎发生在BluetoothSocket。我正在使用的代码基于sdk中的聊天示例。

我的接受代码

private class AcceptThread extends Thread {
    // The local server socket
    private BluetoothServerSocket mmServerSocket;
    public boolean successInit = false;

    public AcceptThread() {
        closeAllConnections();          
        BluetoothServerSocket tmp = null;

        // Create a new listening server socket
        while(!successInit) {
            try {
                tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
                successInit= true;
                Log.i("TAG", "Socket Server Created");
            }
            catch(Exception e) {
                Log.i("TAG", e.getMessage());
                successInit = false;
            }
        }

        mmServerSocket = tmp;
    }
    public void run() {
        BluetoothSocket socket = null;

        // Listen to the server socket if we're not connected
        Log.i("BluetoothComService", String.valueOf(mState));
        while (mState != STATE_CONNECTED) {
            try {
                // This is a blocking call and will only return on a
                // successful connection or an exception
                mAdapter.cancelDiscovery();

                socket = BluetoothAdapter.getDefaultAdapter()                           
                     .getRemoteDevice(getThermMAC())
                     .createRfcommSocketToServiceRecord(UUID
                     .fromString("00001101-0000-1000-8000-00805F9B34FB"));

           //   socket = mmServerSocket.accept();  // here socket might be closed or timeout
                Log.e("BluetoothComService", "No accept Exception");
            }catch (IOException e) {
                Log.e("TAG", e.getMessage());
            }
上面的

getThermMAC()是我返回绑定设备地址的方法。

错误

run()中,如果我使用

socket=BluetoothAdapter.getDefaultAdapter()                           
                     .getRemoteDevice(getThermMAC())
                     .createRfcommSocketToServiceRecord(UUID
                     .fromString("00001101-0000-1000-8000-00805F9B34FB"));

然后我在Android框架中NPE的第501行获得了BluetoothSocket.java

int left = b.length;

因此,b似乎是null,但它似乎不是在调试之后。 bbyte[]从我的BluetoothService班级发送的,它会在byte[]内发送一个全新的,已初始化的ConnectedThread,就像sdk示例所做的那样正如我在旧版本上做的那样。

如果我发表评论并尝试使用

socket = mmServerSocket.accept();

过去一直在工作,然后我得到了

bt socket is not in listen state

所以,我不知道如何把它置于“听状态”或为什么不会。有没有人经历过这个或知道如何解决它?或者如果我使用第一个片段(如果这是正确的话),如何避免获得NPE

我找到了

当我收到IOException时,我发现this post导致我here,但这并没有让我任何地方。

注意:赏金消息说4.4.4但是Tab 4上是4.4.2

设备错误

首次通过USB将设备连接到计算机时,我也注意到这些蓝牙错误

09-05 15:18:03.217: E/BluetoothServiceJni(15148): SOCK FLAG = 0 ***********************
09-05 15:18:13.177: E/BluetoothServiceJni(15148): SOCK FLAG = 0 ***********************
09-05 15:18:13.217: E/BluetoothServiceJni(15148): SOCK FLAG = 0 ***********************

但我无法找出那面旗帜的含义。

我意识到BT堆栈4.x(See one of many bug reports

中存在已知错误

minSDK目前是10.但是,如果我找到一个可行的解决方案,那么我可以解决这个问题。

2 个答案:

答案 0 :(得分:1)

尝试代码,在nexus 7上运行android 4.4.2

private boolean refreshDeviceCache(BluetoothGatt gatt){
    try {
        BluetoothGatt localBluetoothGatt = gatt;
        Method localMethod = localBluetoothGatt.getClass().getMethod("refresh", new Class[0]);
        if (localMethod != null) {
           boolean bool = ((Boolean) localMethod.invoke(localBluetoothGatt, new Object[0])).booleanValue();
            return bool;
         }
    } 
    catch (Exception localException) {
        Log.e(TAG, "An exception occured while refreshing device");
    }
    return false;
}


    public boolean connect(final String address) {
           if (mBluetoothAdapter == null || address == null) {
            Log.w(TAG,"BluetoothAdapter not initialized or unspecified address.");
                return false;
        }
            // Previously connected device. Try to reconnect.
            if (mBluetoothGatt != null) {
                Log.d(TAG,"Trying to use an existing mBluetoothGatt for connection.");
              if (mBluetoothGatt.connect()) {
                    return true;
               } else {
                return false;
               }
        }

        final BluetoothDevice device = mBluetoothAdapter
                .getRemoteDevice(address);
        if (device == null) {
            Log.w(TAG, "Device not found.  Unable to connect.");
            return false;
        }

        // We want to directly connect to the device, so we are setting the
        // autoConnect
        // parameter to false.
        mBluetoothGatt = device.connectGatt(MyApp.getContext(), false, mGattCallback));
        refreshDeviceCache(mBluetoothGatt);
        Log.d(TAG, "Trying to create a new connection.");
        return true;

}

答案 1 :(得分:0)

我还使用了相同代码的连接步骤,但这只适用于智能Android设备。

您可以获取要连接的特定设备的BluetoothDevice对象。 之后,您可以通过反射使用BluetoothHeadset的连接和断开连接方法连接到特定的BluetoothDevice。

Class<?> BTHeadset = Class.forName("android.bluetooth.BluetoothHeadset");
        Method conn = BTHeadset.getMethod("connect", new Class[] {BluetoothDevice.class});
               conn.invoke(BTHeadset, new Object[] {btDev});

您可以使用相同的代码通过反射使用disconnect方法断开设备连接。