"read failed, socket might closed or timeout"

6.8k Views Asked by At

I want to pair my android device (android 4.2.2) to another android device that is using BluetothAdapter.startDiscovery().

What I found when running BluetoothDevice.connect() request pairing start, but when running connect(), I got

read failed, socket might closed or timeout, read ret: -1

I tried to implement fallback and gatclass, methods in IOException: read failed, socket might closed - Bluetooth on Android 4.3

also correct UUID according to Bluetooth Connection failed “java.io.IOException: read failed, socket might closed or timeout, read ret: -1”

and static UUID"00001101-0000-1000-8000-00805F9B34FB"

But none of them work for me.

The below code from Android want to send bluetooth pair request to another devices is similar to my code and reproduces the issue:

public class Main extends Activity {
    TextView out;
    private static final int REQUEST_ENABLE_BT = 1;
    private BluetoothAdapter btAdapter;
    private ArrayList < BluetoothDevice > btDeviceList = new ArrayList < BluetoothDevice > ();
    private ArrayList < String > mylist = new ArrayList < String > ();
    private ListView lv;
    private Button btn;
    public Parcelable[] uuidExtra;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void search(View view) {
        //Register the BroadcastReceiver
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        filter.addAction(BluetoothDevice.ACTION_UUID);
        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        registerReceiver(ActionFoundReceiver, filter); // Don't forget to unregister during onDestroy

        // Getting the Bluetooth adapter
        btAdapter = BluetoothAdapter.getDefaultAdapter();
        Toast.makeText(getApplicationContext(), "\nAdapter: " + btAdapter, 5000).show();

        CheckBTState();
    }

    private void setDeviceList(ArrayList < String > list) {
        lv = (ListView) findViewById(R.id.listView);
        ArrayAdapter < String > adapter = new ArrayAdapter < String > (this, android.R.layout.simple_list_item_1, list);
        lv.setAdapter(adapter);

    }

    /* This routine is called when an activity completes.*/
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_ENABLE_BT) {
            CheckBTState();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (btAdapter != null) {
            btAdapter.cancelDiscovery();
        }
        unregisterReceiver(ActionFoundReceiver);
    }

    private void CheckBTState() {
        // Check for Bluetooth support and then check to make sure it is turned on
        // If it isn't request to turn it on
        // List paired devices
        // Emulator doesn't support Bluetooth and will return null
        if (btAdapter == null) {
            Toast.makeText(getApplicationContext(), "\nBluetooth NOT supported. Aborting.", 5000).show();
            return;
        } else {
            if (btAdapter.isEnabled()) {
                Toast.makeText(getApplicationContext(), "\nBluetooth is enabled...", 5000).show();

                // Starting the device discovery
                btAdapter.startDiscovery();
            } else if (!btAdapter.isEnabled()) {
                Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            }
            /* else{
                 Intent intent = new Intent(btAdapter.ACTION_STATE_CHANGED);
               startActivityForResult(intent, RESULT_CANCELED);
             }*/
        }
    }

    private final BroadcastReceiver ActionFoundReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                Toast.makeText(getApplicationContext(), "\n  Device: " + device.getName() + ", " + device, 5000).show();
                mylist.add(device.getName());
                setDeviceList(mylist);
            } else {
                if (BluetoothDevice.ACTION_UUID.equals(action)) {
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    Parcelable[] uuidExtra = intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID);
                    for (int i = 0; i < uuidExtra.length; i++) {
                        Toast.makeText(getApplicationContext(), "\n  Device: " + device.getName() + ", " + device + ", Service: " + uuidExtra[i].toString(), 5000).show();
                    }
                } else {
                    if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
                        Toast.makeText(getApplicationContext(), "\nDiscovery Started...", 5000).show();
                    } else {
                        if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
                            Toast.makeText(getApplicationContext(), "\nDiscovery Finished", 5000).show();
                            Iterator < BluetoothDevice > itr = btDeviceList.iterator();
                            while (itr.hasNext()) {
                                // Get Services for paired devices
                                BluetoothDevice device = itr.next();
                                Toast.makeText(getApplicationContext(), "\nGetting Services for " + device.getName() + ", " + device, 5000).show();
                                if (!device.fetchUuidsWithSdp()) {
                                    Toast.makeText(getApplicationContext(), "\nSDP Failed for " + device.getName(), 5000).show();
                                }

                            }
                        }
                    }
                }
            }
        }
    };

}
1

There are 1 best solutions below

0
On BEST ANSWER

I found my answer in another Question!. this link:

Android Connect Bluetooth device automatically after pairing programmatically

In Question discripe how connect(and it's answer complete it)

Note: before Test sure devices are Unpair