Android Сканер Bluetooth LE сканирует, только когда на некоторых устройствах включено местоположение телефона - PullRequest
0 голосов
/ 16 апреля 2020

Я создаю приложение Android, которое рекламирует небольшие пакеты информации, а также сканирует информацию, используя BLE. Код для рекламы:

   AdvertiseSettings advSettings = new AdvertiseSettings.Builder()
                .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED)
                .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM)
                .setConnectable(false)
                .build();


        AdvertiseData advData = new AdvertiseData.Builder()
                .setIncludeTxPowerLevel(true)
                .addServiceUuid(uuid)
                .build();

        AdvertiseData advScanResponse = new AdvertiseData.Builder()
                .setIncludeDeviceName(false)
                .addServiceData(uuid,"1234567890".getBytes( Charset.forName( "UTF-8" ) ))
                .build();

        AdvertiseCallback advCallback = new AdvertiseCallback() {
            String TAG="status";

            @Override
            public void onStartFailure(int errorCode) {
                super.onStartFailure(errorCode);
                Log.e(TAG, "Not broadcasting: " + errorCode);
                int statusText;
                switch (errorCode) {
                    case ADVERTISE_FAILED_ALREADY_STARTED:
                        Log.w(TAG, "ADVERTISE_FAILED_ALREADY_STARTED");
                        break;
                    case ADVERTISE_FAILED_DATA_TOO_LARGE:
                        Log.w(TAG, "ADVERTISE_FAILED_DATA_TOO_LARGE");
                        break;
                    case ADVERTISE_FAILED_FEATURE_UNSUPPORTED:
                        Log.w(TAG, "ADVERTISE_FAILED_FEATURE_UNSUPPORTED");
                        break;
                    case ADVERTISE_FAILED_INTERNAL_ERROR:
                        Log.w(TAG, "ADVERTISE_FAILED_INTERNAL_ERROR");
                        break;
                    case ADVERTISE_FAILED_TOO_MANY_ADVERTISERS:
                        Log.w(TAG, "ADVERTISE_FAILED_TOO_MANY_ADVERTISERS");
                        break;
                    default:
                        Log.wtf(TAG, "Unhandled error: " + errorCode);
                }
                Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onStartSuccess(AdvertiseSettings settingsInEffect) {
                super.onStartSuccess(settingsInEffect);
                Log.v(TAG, "Advertising started");
                mText.setText(uuid.toString());
                Toast.makeText(MainActivity.this, "Started", Toast.LENGTH_SHORT).show();
            }
        };

        mBluetoothAdapter.getBluetoothLeAdvertiser()
                .startAdvertising(advSettings, advData, advScanResponse, advCallback);

, а код для прослушивания следующий:

mBluetoothLeScanner=mBluetoothAdapter.getBluetoothLeScanner();


    ScanCallback mScanCallback = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            super.onScanResult(callbackType, result);
            if( result == null
                    || result.getDevice() == null
                     )
                return;

            if(result.getScanRecord().getServiceUuids()!=null) {

                ParcelUuid pp=result.getScanRecord().getServiceUuids().get(0);

                StringBuilder builder = new StringBuilder((pp.toString()+"\n"));

                builder.append(new String (result.getScanRecord().getServiceUuids().size()+""));

                mText.setText(builder.toString());
            }

Я проверил его на нескольких телефонах, и он отлично работает. Однако Android версия 9.0 на Galaxy S8 + не может сканировать, если местоположение не включено. Я также попробовал на Android версии 9.0 на Redmi Note 7, и она отлично работает без необходимости включать местоположение. В чем причина моей проблемы?

1 Ответ

0 голосов
/ 19 апреля 2020

Не уверен насчет настроек Android в Redmi Note 7, но для устройств Android 9 необходимо включить ACCESS_COARSE_LOCATION, чтобы Bluetooth работал. Может быть, это как-то включено в Redmi Note 7 независимо от настроек местоположения, тогда как на S8 + это связано с настройками местоположения.

Более подробную информацию вы можете найти здесь: -

{ ссылка }

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...