Benoit Bouery
Benoit Bouery

Reputation: 31

Android BLE scan issue

I'me trying to create a simple BLE application on my Android phone. I've tried a lot of example without success, i must forget something. Hope you could help me. First you'll find the permissions added and then my simple activy

Permissions:

<uses-permission android:name="android.permission.BLUETOOTH"/>
 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

And my activity : Two button, one to execute a Scan and another to stop it. I'd like to detecte an BLE device, but nothing is never detected with my code.

public class MainActivity extends AppCompatActivity {

        BluetoothManager btManager;
        BluetoothAdapter btAdapter;
        BluetoothLeScanner btScanner;
        Button startScanningButton;
        Button stopScanningButton;
        TextView peripheralTextView;
        private final static int REQUEST_ENABLE_BT = 1;
        private static final int PERMISSION_REQUEST_COARSE_LOCATION = 1;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            peripheralTextView = (TextView) findViewById(R.id.PeripheralTextView);
            peripheralTextView.setMovementMethod(new ScrollingMovementMethod());

            startScanningButton = (Button) findViewById(R.id.StartScanButton);
            startScanningButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    startScanning();
                }
            });

            stopScanningButton = (Button) findViewById(R.id.StopScanButton);
            stopScanningButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    stopScanning();
                }
            });
            stopScanningButton.setVisibility(View.INVISIBLE);

            btManager = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);
            btAdapter = BluetoothAdapter.getDefaultAdapter();

            if ( btAdapter == null ) {
                Toast.makeText(
                        this,
                        "Bluetooth not supported on this deveice",
                        Toast.LENGTH_LONG).show();
                return;
            }

            btScanner = btAdapter.getBluetoothLeScanner();
            btScanner = BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner();
            // Ensures Bluetooth is available on the device and it is enabled. If not,
            // displays a dialog requesting user permission to enable Bluetooth.
            if (btAdapter == null || !btAdapter.isEnabled()) {
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            }


            if ( ! btAdapter.isEnabled() ) {
                // Demande à activer l'interface bluetooth
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            }

            if ( checkSelfPermission( Manifest.permission.ACCESS_COARSE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED ) {
                requestPermissions(
                        new String[] {  android.Manifest.permission.ACCESS_COARSE_LOCATION  },
                        456 );
            }


            if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
                Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
                finish();
            }



            if (btAdapter != null && !btAdapter.isEnabled()) {
                Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableIntent,REQUEST_ENABLE_BT);
            }


            if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                final AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("This app needs location access");
                builder.setMessage("Please grant location access so this app can detect peripherals.");
                builder.setPositiveButton(android.R.string.ok, null);
                builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
                    @Override
                    public void onDismiss(DialogInterface dialog) {
                        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
                    }
                });
                builder.show();
            }
        }

       
        private ScanCallback leScanCallback = new ScanCallback() {
            @Override
            public void onScanResult(int callbackType, ScanResult result) {
                peripheralTextView.append("Device Name: " + result.getDevice().getName() + " rssi: " + result.getRssi() + "\n");
                super.onScanResult(callbackType, result);
              
                final int scrollAmount = peripheralTextView.getLayout().getLineTop(peripheralTextView.getLineCount()) - peripheralTextView.getHeight();
               
                if (scrollAmount > 0)
                    peripheralTextView.scrollTo(0, scrollAmount);
            }
        };

        @Override
        public void onRequestPermissionsResult(int requestCode,
                                               String permissions[], int[] grantResults) {
            switch (requestCode) {
                case PERMISSION_REQUEST_COARSE_LOCATION: {
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        System.out.println("coarse location permission granted");
                    } else {
                        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
                        builder.setTitle("Functionality limited");
                        builder.setMessage("Since location access has not been granted, this app will not be able to discover beacons when in the background.");
                        builder.setPositiveButton(android.R.string.ok, null);
                        builder.setOnDismissListener(new DialogInterface.OnDismissListener() {

                            @Override
                            public void onDismiss(DialogInterface dialog) {
                            }

                        });
                        builder.show();
                    }
                    return;
                }
            }
        }
    private boolean mScanning = false;
    private Handler handler = new Handler();
    private static final long SCAN_PERIOD = 30000;

        public void startScanning() {
            System.out.println("start scanning");
            peripheralTextView.setText("");
            startScanningButton.setVisibility(View.INVISIBLE);
            stopScanningButton.setVisibility(View.VISIBLE);
            if (!mScanning) {
                // Stops scanning after a pre-defined scan period.
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mScanning = false;
                        btScanner.stopScan(leScanCallback);
                        System.out.println("stop scanning");
                    }
                }, SCAN_PERIOD);

                mScanning = true;
                btScanner.startScan(leScanCallback);
                System.out.println("restart scanning");
            } else {
                mScanning = false;
                btScanner.stopScan(leScanCallback);
                System.out.println("stop scanning");
            }
        }

        public void stopScanning() {
            System.out.println("stopping scanning");
            peripheralTextView.append("Stopped Scanning");
            startScanningButton.setVisibility(View.VISIBLE);
            stopScanningButton.setVisibility(View.INVISIBLE);
            AsyncTask.execute(new Runnable() {
                @Override
                public void run() {
                    btScanner.stopScan(leScanCallback);
                }
            });
        }
    }

I never scan nothing.. Totaly newby, thanks a lot for your help.

Regards

Upvotes: 2

Views: 179

Answers (1)

Youssif Saeed
Youssif Saeed

Reputation: 13285

You also need to have ACCESS_BACKGROUND_LOCATION declared in order to find other Bluetooth devices. You can find more information here:-

And the links below are useful for getting started with Android LE Development:-

Upvotes: 1

Related Questions