Подтвердить что ты не робот

BluetoothLeScanner.startScan с Android 6.0 не обнаруживает устройств

Я пытаюсь использовать функцию BluatoothLeScanner.startScan вместо устаревшего BluetoothAdapter.startLeScan. Вчера я обновил свой Nexus 5 до Android 6.0, и с этого момента мое приложение больше не работает. Сначала я добавляю предпочтения, необходимые для ACCESS_COARSE_LOCATION, как здесь, https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id. Затем я добавил разрешение, как описано здесь: https://developer.android.com/training/permissions/requesting.html. Но в конце кажется, что он не работает, он не отправляет обратно устройства.

Это мой код:

манифеста

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.stm.sensitronapp">
          <uses-sdk android:maxSdkVersion="23"/>
          <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

          <uses-permission android:name="android.permission.BLUETOOTH"/>
          <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
          <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>`

DeviceScanActivity

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
...

if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION)
            != PackageManager.PERMISSION_GRANTED){
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.ACCESS_COARSE_LOCATION)) {
        } else {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                    MY_PERMISSIONS_REQUEST_ACCESS_COARSE);
        }
    }

// Device scan callback.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            mScanCallback = new ScanCallback() {
                @Override
                public void onScanResult(int callbackType, ScanResult result) {
                    super.onScanResult(callbackType, result);
                    mLeDeviceListAdapter.addDevice(result.getDevice());
                    mLeDeviceListAdapter.notifyDataSetChanged();
                }
            };
        }
    } 
}
final BluetoothManager bluetoothManager =
            (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();

if (mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) {
        mSwipeRefreshLayout.setRefreshing(true);
        mLeDeviceListAdapter.clear();
        mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
        if(ContextCompat.checkSelfPermission(this,
                    Manifest.permission.ACCESS_COARSE_LOCATION ) == PackageManager.PERMISSION_GRANTED) {
                mBluetoothLeScanner.startScan(mScanCallback);
            }
        }

EDIT: для решения этой проблемы я только включил GPS. Это легко сделать программно в таким образом.

4b9b3361

Ответ 1

если предоставлены разрешения, попробуйте: включите GPS.

Ответ 2

Появляется ли приложение, запрашивающее разрешение на размещение при запуске? Если это не так, обработайте код в другом месте, чтобы он запрашивался.

Также вы можете проверить это, чтобы проверить, работает ли ваше приложение нормально:

Откройте "Настройки" > "Приложения" > "Управление" > "Разрешения" и разрешить местоположение, а затем попытаться выполнить поиск результатов.

Местоположение будет указано в разрешениях только в том случае, если вы предоставили ACCESS_COARSE_LOCATION в манифесте.

Ответ 3

Использование приведенных выше решений работает, но побочным эффектом является то, что вам необходимо включить службы определения местоположения для чего-то, что ему не нужно. Уродливая и неудовлетворительная работа заключается в том, чтобы указать целевую версию в вашем манифесте на

Android: targetSdkVersion = "21"

Он позволяет сканировать мой Nexus 7, хотя установленная версия 6.0.1. Я не знаю, какие побочные эффекты нацелены на более низкую версию, чем на установленную версию, но, по крайней мере, сканирование работает. Может быть единственным решением для устройств без GPS (если такие устройства существуют).

Google должен быть распят для этого.

Ответ 4

Один - не совсем правильный ответ, заключается в том, что вы все равно можете использовать один и тот же старый метод BT-сканирования, как только вы включите новое разрешение на размещение.

            mBluetoothAdapter.startDiscovery();

.......

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();

                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                mDeviceList.add(device);


            }
        }
    };

Ответ 5

Это старый вопрос, но я отвечу, чтобы помочь кому-то. К сожалению, комбинация ACCESS_COARSE_LOCATION и targetSdkVersion 22 не работает на некоторых устройствах.
Это не очень хороший метод, но я решил его следующим образом, не используя разрешения во время выполнения (ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION)

  • Установите "targetSdkVersion" в 19 (я думаю, возможно, api19 ~ api22 будет возможно)
  • Добавьте в файл манифеста следующие разрешения

    <uses-permission android:name="android.permission.READ_OWNER_DATA" />
    <uses-permission android:name="android.permission.WRITE_OWNER_DATA" />
    

протестирован на Android 4.4 ~ 7.1.1

Ответ 6

Установите "minSdkVersion" на 18 targetSdkVersion 22