Подтвердить что ты не робот

Bluetooth не подключается к 4.4.2

У меня есть Bluetooth-устройство, подключенное во всех версиях Android, которое я пробовал до 4.4.2. Теперь он не подключается к Galaxy Tab 4 или S3. Вкладка 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"));

тогда я получаю NPE в строке 501 BluetoothSocket.java в фреймворке Android, который является этой строкой

int left = b.length;

Итак, кажется, что b - null, но, похоже, он не после отладки. b - это byte[], который отправляется из моего класса BluetoothService, который отправляет новый, инициализированный byte[] из ConnectedThread, как это делает пример sdk, и как я делал это в более старых версиях.

Если я прокомментирую это и попытаюсь использовать

socket = mmServerSocket.accept();

который работал в прошлом, затем я получаю

bt socket is not in listen state

Итак, я не знаю, как записать его в "состояние прослушивания" или почему это не так. Кто-нибудь испытал это или знает, как обходиться? Или как не получать NPE, если я использую первый фрагмент (если это даже правильно).

Я нашел

Когда я получал IOException, я нашел этот пост, который привел меня здесь, но это hasn 't получил меня где-нибудь.

Примечание: Сообщение о бонусе говорит 4.4.4, но это 4.4.2 на вкладке 4

Ошибки устройства

Я также замечаю эти ошибки Bluetooth, когда я впервые подключаю свое устройство к компьютеру через 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 stack 4.x(См. один из многих отчетов об ошибках)

minSDK в настоящее время 10. Хотя, если я нахожу рабочее решение, то я могу обойти это.

4b9b3361

Ответ 1

Попробуйте этот код, это работает android 4.4.2 на nexus 7

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;

}

Ответ 2

Я также использовал шаги подключения с использованием того же кода, но это может работать только для устройств Smart 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});

тот же код, который вы можете использовать для отсоединения устройства, используя метод разъединения с помощью отражения.