Bluetooth and device connection

I want to connect a device and connect it, but I have a problem, I just can connect the device, but I can’t connect them. I want to know how to solve this problem. I'm afraid I didn’t explain my problem very well, I can’t connect the tools, connect the phone to the Bluetooth headset, and I can only pair, here is the code

if (btAdapt.isEnabled()) { tbtnSwitch.setChecked(false); } else { tbtnSwitch.setChecked(true); } // ============================================================ IntentFilter intent = new IntentFilter(); intent.addAction(BluetoothDevice.ACTION_FOUND); intent.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); intent.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED); intent.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); registerReceiver(searchDevices, intent); } private BroadcastReceiver searchDevices = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Bundle b = intent.getExtras(); Object[] lstName = b.keySet().toArray(); for (int i = 0; i < lstName.length; i++) { String keyName = lstName[i].toString(); Log.e(keyName, String.valueOf(b.get(keyName))); } BluetoothDevice device = null; if (BluetoothDevice.ACTION_FOUND.equals(action)) { device = intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device.getBondState() == BluetoothDevice.BOND_NONE) { String str = "no pair|" + device.getName() + "|" + device.getAddress(); if (lstDevices.indexOf(str) == -1) lstDevices.add(str); adtDevices.notifyDataSetChanged(); } }else if(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)){ device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); switch (device.getBondState()) { case BluetoothDevice.BOND_BONDING: Log.d("BlueToothTestActivity", "it is pairing"); break; case BluetoothDevice.BOND_BONDED: Log.d("BlueToothTestActivity", "finish"); connect(device); break; case BluetoothDevice.BOND_NONE: Log.d("BlueToothTestActivity", "cancel"); default: break; } } } }; @Override protected void onDestroy() { this.unregisterReceiver(searchDevices); super.onDestroy(); android.os.Process.killProcess(android.os.Process.myPid()); } class ItemClickEvent implements AdapterView.OnItemClickListener { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { if(btAdapt.isDiscovering())btAdapt.cancelDiscovery(); String str = lstDevices.get(arg2); String[] values = str.split("\\|"); String address = values[2]; Log.e("address", values[2]); BluetoothDevice btDev = btAdapt.getRemoteDevice(address); try { Boolean returnValue = false; if (btDev.getBondState() == BluetoothDevice.BOND_NONE) { BluetoothDevice.createBond(BluetoothDevice remoteDevice); Method createBondMethod = BluetoothDevice.class .getMethod("createBond"); Log.d("BlueToothTestActivity", "start"); returnValue = (Boolean) createBondMethod.invoke(btDev); }else if(btDev.getBondState() == BluetoothDevice.BOND_BONDED){ connect(btDev); } } catch (Exception e) { e.printStackTrace(); } } } private void connect(BluetoothDevice btDev) { UUID uuid = UUID.fromString(SPP_UUID); try { btSocket = btDev.createInsecureRfcommSocketToServiceRecord(uuid); Log.d("BlueToothTestActivity", "connecting..."); btSocket.connect(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } class ClickEvent implements View.OnClickListener { public void onClick(View v) { if (v == btnSearch) { if (btAdapt.getState() == BluetoothAdapter.STATE_OFF) { Toast.makeText(BlueToothTestActivity.this, "please open", 1000) .show(); return; } if (btAdapt.isDiscovering()) btAdapt.cancelDiscovery(); lstDevices.clear(); Object[] lstDevice = btAdapt.getBondedDevices().toArray(); for (int i = 0; i < lstDevice.length; i++) { BluetoothDevice device = (BluetoothDevice) lstDevice[i]; String str = "pair|" + device.getName() + "|" + device.getAddress(); lstDevices.add(str); adtDevices.notifyDataSetChanged(); } setTitle("address:" + btAdapt.getAddress()); btAdapt.startDiscovery(); } else if (v == tbtnSwitch) { if (tbtnSwitch.isChecked() == false) btAdapt.enable(); else if (tbtnSwitch.isChecked() == true) btAdapt.disable(); } else if (v == btnDis) { Intent discoverableIntent = new Intent( BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra( BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivity(discoverableIntent); } else if (v == btnExit) { try { if (btSocket != null) btSocket.close(); } catch (IOException e) { e.printStackTrace(); } BlueToothTestActivity.this.finish(); } } } 

}

+4
source share
2 answers

Quote from your code:

  btSocket = btDev.createInsecureRfcommSocketToServiceRecord(uuid); Log.d("BlueToothTestActivity", "connecting..."); btSocket.connect(); 

You can find the code in the official documentation for Android when connecting as a client, here .

I see 4 things that can cause problems:

  • You need to connect in a separate thread! .Connect () is a blocking call - see the link above
  • Not all devices accept unsafe connections.
  • For Android devices below 2.3.3, this method does not work. You must call the private method through reflection - see this . Also I think you will find it on SO.
  • Surround.create .... with try / catch and post errors on Logcat.

Can you post logcat logs?

+2
source

You did not specify, but I assume that your problem is with the part of creating the socket, and not with the actual call to connect (). This is what usually happens wrong.

How to fix?

  • Your code assumes the headset supports unsafe BT communications. In many cases this is true, but not in all. Try calling createRfcommSocketToServiceRecord () instead

  • Your code uses the default SPU UUID to search for the RFCOMM channel. For API versions> = 15, this is not working properly. Instead, try calling device.getUuids () and use the first returned UUID as the creation parameter. From my own experience, even for versions up to 15 APIs, you can still call getUuids () and get good results, but you will need to do this by reflection. Only if the above fails to attempt to create a socket using the default UUID SPP

  • If the above fails, you can try, as a last resort, activate the hidden API "createRfcommSocket". This has worked for me several times and on several versions of Android. Use java reflection to activate this call, and since it is inherently unsafe, protect it with try catch.

  • Remember to specify the logic in AsyncTask or something like that. You do not want the UI thread to block such tasks!

Finally, feel free to use https://github.com/giladHaimov/BTWiz for easier processing of a Bluetooth connection and for simple asynchronous I / O.

+12
source

Source: https://habr.com/ru/post/1434524/


All Articles