2013-07-20 5 views
11

У меня была эта проблема некоторое время, и я не смог ее понять.android bluetooth не может подключиться

У меня есть приложение для Android, которое помещает все сопряженные устройства в список. Когда вы нажимаете один из элементов списка, он инициирует запрос на подключение к этому устройству Bluetooth.

Я могу получить список устройств с их адресами без проблем. Проблема в том, что как только я пытаюсь подключиться, я получаю IOException в socket.connect();

Сообщение об ошибке выглядит следующим образом: «Не удалось прочитать подключения, разъем может закрыто или таймаут, прочитать RET: -1»

Вот мой код. ANY предложения будут оценены. Я довольно застрял на этом.

fyi: методы onEvent - это библиотека, которая упрощает обратные вызовы ... эта часть работает. Когда пользователь нажимает на список элементов, этот метод называется «общественного недействительными OnEvent (EventMessage.DeviceSelected событие)»

public class EcoDashActivity extends BaseActivity { 

public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 


private BluetoothAdapter mBluetoothAdapter; 
private int REQUEST_ENABLE_BT = 100; 
private ArrayList<BluetoothDevice> mDevicesList; 
private BluetoothDeviceDialog mDialog; 
private ProgressDialog progressBar; 
private int progressBarStatus = 0; 
private Handler progressBarHandler = new Handler(); 


@Override 
public void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.main); 

    mDevicesList = new ArrayList<BluetoothDevice>(); 

    // Register the BroadcastReceiver 
    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
    registerReceiver(mReceiver, filter); 

    setupBluetooth(); 
} 

private void setupBluetooth() { 
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
    if (mBluetoothAdapter == null) { 
     // Device does not support Bluetooth 
     Toast.makeText(this, "Device does not support Bluetooth", Toast.LENGTH_SHORT).show(); 
    } 

    if (!mBluetoothAdapter.isEnabled()) { 
     Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 
    } else { 
     searchForPairedDevices(); 
     mDialog = new BluetoothDeviceDialog(this, mDevicesList); 
     mDialog.show(getFragmentManager(), ""); 
    } 

} 

private void searchForPairedDevices() { 

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); 
    // If there are paired devices 
    if (pairedDevices.size() > 0) { 
     // Loop through paired devices 
     for (BluetoothDevice device : pairedDevices) { 
      // Add the name and address to an array adapter to show in a ListView 
      mDevices.add(device.getName() + "\n" + device.getAddress()); 
      mDevicesList.add(device); 
     } 
    } 
} 


private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     // When discovery finds a device 
     if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
      // Get the BluetoothDevice object from the Intent 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      // Add the name and address to an array adapter to show in a ListView 
      mDevicesList.add(device); 
     } 
    } 
}; 


@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    unregisterReceiver(mReceiver); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
if (requestCode == REQUEST_ENABLE_BT) { 
     if (resultCode == RESULT_OK) { 
      Toast.makeText(this, "BT turned on!", Toast.LENGTH_SHORT).show(); 
      searchForPairedDevices(); 

      mDialog = new BluetoothDeviceDialog(this, mDevicesList); 
      mDialog.show(getFragmentManager(), ""); 
     } 
    } 

    super.onActivityResult(requestCode, resultCode, data); 
} 


public void onEvent(EventMessage.DeviceSelected event) { 

    mDialog.dismiss(); 

    BluetoothDevice device = event.getDevice(); 

    ConnectThread connectThread = new ConnectThread(device); 
    connectThread.start(); 
} 


public class ConnectThread extends Thread { 
    private final BluetoothSocket mmSocket; 
    private final BluetoothDevice mmDevice; 

    public ConnectThread(BluetoothDevice device) { 
     // Use a temporary object that is later assigned to mmSocket, 
     // because mmSocket is final 
     BluetoothSocket tmp = null; 
     mmDevice = device; 

     // Get a BluetoothSocket to connect with the given BluetoothDevice 
     try { 
      // MY_UUID is the app's UUID string, also used by the server code 
      tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 
     } catch (IOException e) { } 
     mmSocket = tmp; 
    } 

    public void run() { 
     setName("ConnectThread"); 
     // Cancel discovery because it will slow down the connection 
     mBluetoothAdapter.cancelDiscovery(); 

     try { 
      // Connect the device through the socket. This will block 
      // until it succeeds or throws an exception 
      Log.d("kent", "trying to connect to device"); 
      mmSocket.connect(); 
      Log.d("kent", "Connected!"); 
     } catch (IOException connectException) { 
      // Unable to connect; close the socket and get out 
      try { 
       Log.d("kent", "failed to connect"); 

       mmSocket.close(); 
      } catch (IOException closeException) { } 
      return; 
     } 

     Log.d("kent", "Connected!"); 
    } 

    /** Will cancel an in-progress connection, and close the socket */ 
    public void cancel() { 
     try { 
      mmSocket.close(); 
     } catch (IOException e) { } 
    } 
} 

Вот мой LogCat. Довольно коротко.

07-22 10:37:05.129: DEBUG/kent(17512): trying to connect to device 
07-22 10:37:05.129: WARN/BluetoothAdapter(17512): getBluetoothService() called with no BluetoothManagerCallback 
07-22 10:37:05.129: DEBUG/BluetoothSocket(17512): connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[98]} 
07-22 10:37:40.757: DEBUG/dalvikvm(17512): GC_CONCURRENT freed 6157K, 9% free 62793K/68972K, paused 7ms+7ms, total 72ms 
07-22 10:38:06.975: DEBUG/kent(17512): failed to connect 
07-22 10:38:06.975: DEBUG/kent(17512): read failed, socket might closed or timeout, read ret: -1 

Это последняя строка в разделе «поймать» на попытку/улова ... Я просто войти сообщение об ошибке.

Пожалуйста, обратите внимание, что есть около 20 второй разрыв между «пытается подключиться к устройству» и «не удалось подключиться»

+0

Какая версия Android? Может быть проблема стека с Jelly bean, имеющая совершенно другой стек bluetooth, неубедительный и сначала попробуйте спаривание, а затем повторите попытку – Slartibartfast

+0

post logcat также – Slartibartfast

+0

@Slartibartfast Я сейчас работаю над 4.2.2 Nexus 4. Я обновлю вопрос с помощью logcat. –

ответ

14

желе стек бобов Bluetooth заметно отличается от других версий.

Это может помочь: http://wiresareobsolete.com/wordpress/2010/11/android-bluetooth-rfcomm/

В сущности: идентификатор UUID является значение, которое должно указывать на опубликованную службу на вашем встроенном устройстве, это не просто случайным образом. Соединение RFCOMM SPP, к которому вы хотите получить доступ, имеет определенный UUID, который он публикует, чтобы идентифицировать эту службу, а когда вы создаете сокет, он должен совпадать с тем же UUID.

Если вы используете таргетинг на устройство 4.0.3 и выше, используйте fetchUuidsWithSdp() и getUuids(), чтобы найти все опубликованные службы и связанные с ними значения UUID. Для обратной совместимости прочтите статью

+0

GetUUIDs() возвращает список идентификаторов. Откуда вы знаете, какой из них следует использовать? –

+0

Я просто попробовал каждый UUID, чтобы он вернулся и имел ту же проблему. –

+0

Вы знаете полный пример кода, который я могу скопировать/вставить в новое приложение, чтобы просто проверить его? –

0

Я получил то же сообщение об ошибке после подключения сокета a второй раз. Я просто проверил, если сокет уже подключен.

if(!mmSocket.isConnected()) 
      mmSocket.connect(); 

Я тестировал Android 4.4.2 (Moto G).