0

I am currently working on an app which requires a Bluetooth laser meter. So i tried a few lines of code and went through a loads of failures. The last error I get is an NPE because i try to access the array returned by getUuids(). I also tried to connect the app to my airPods and everything worked well. I am at minSdk 27 and targetSdk 31 All bluetooth permissions (bluetooth, bluetooth_admin) are granted.

the fact is, the laser thing requires an app to work and i wonder if the constructor could have blocked some functionalities. if so, i'll look to buy another one from another brand, if someone could provide me a link to buy a device working for my app. Here's my bluetooth connect code (pretty generic I guess)

I also tried the static UUID suggested in this post but i now get this socket error which (i think) mean the uuid's not working either:

    BluetoothAdapter blueAdapter = BluetoothAdapter.getDefaultAdapter();
    if (blueAdapter != null) {
        if (blueAdapter.isEnabled()) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH) != PackageManager.PERMISSION_GRANTED) {
                Const.requestAllAppPermissions(this);
                return;
            }

            Set<BluetoothDevice> bondedDevices = blueAdapter.getBondedDevices();
            if (bondedDevices.size() > 0) {
                Object[] devices = bondedDevices.toArray();
                BluetoothDevice device = (BluetoothDevice) devices[0];
                System.out.println(device.getName());

                if (device.fetchUuidsWithSdp()) {
                    ParcelUuid[] uuids = device.getUuids();
                    BluetoothSocket socket = null;
                    try {
           //socket = device.createRfcommSocketToServiceRecord(uuids[0].getUuid());
                        socket = device.createRfcommSocketToServiceRecord(
UUID.fromString("00001101-0000-1000-8000-00805f9b54fb"));

                        socket.connect();

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

                //outputStream = socket.getOutputStream();
                //  inStream = socket.getInputStream();
            } else {

            }

        } else {
            System.out.println("bluetooth disabled");
        }
    } else {
        System.out.println("No bluetooth built-in");
    }

here's the static UUID stacktrace:

W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
W/System.err: java.io.IOException: read failed, socket might closed or timeout, read ret: -1
W/System.err:     at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:920)
W/System.err:     at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:934)
W/System.err:     at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:494)
W/System.err:     at com.adici.activities.PlanActivity.lambda$defButton$13$com-adici-activities-PlanActivity(PlanActivity.java:409)
W/System.err:     at com.adici.activities.PlanActivity$$ExternalSyntheticLambda10.onClick(Unknown Source:2)
W/System.err:     at android.view.View.performClick(View.java:7346)
W/System.err:     at android.view.View.performClickInternal(View.java:7312)
W/System.err:     at android.view.View.access$3200(View.java:846)
W/System.err:     at android.view.View$PerformClick.run(View.java:27794)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:873)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err:     at android.os.Looper.loop(Looper.java:214)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7100)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)

I'm open to any suggestion

Michael Kotzjan
  • 2,093
  • 2
  • 14
  • 23
Symtox
  • 77
  • 5

1 Answers1

0

Looking at the user manual for the Leica DISTO D2 it states the device uses Bluetooth Smart, also known as Bluetooth Low Energy (BLE). You won't be able to connect to it using Bluetooth Sockets (Bluetooth Classic).

Please follow the Android documentation on BLE to develop your app. To debug the connection beforehand, please install a generic BLE scanner such as nRF Connect and investigate the services and characteristics the device offers.

Michael Kotzjan
  • 2,093
  • 2
  • 14
  • 23