Oreo, BLE сканер запускает сканирование с PendingIntent не работает на устройстве Samsung - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь сканировать маяки, используя startScan (фильтры, настройки, callbackIntent) . У меня есть реализация, которая отлично работает для Sony Xperia XZ и Nexus 5X. Единственное другое устройство с Android O, которое у меня есть, это Samsung Galaxy S8, и то, что работает для других устройств, на Samsung ничего не дает. (Сканирование Bluetooth действительно встроено в библиотечный модуль, но даже при создании фиктивного приложения samsung не работает, поэтому я буду использовать это в этом примере). Я удалил фильтр и настройки, использованные для startScan, так как сканирование без них все равно не работает, и это не обязательно.

MainActivity
- checks and asks for permissions (ACCESS_COARSE_LOCATION)
- simplified onStart

override fun onStart() {
    super.onStart()
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val startScan = bleScanner.startScan(null, null, getPendingIntent())
        Log.d("testApp", "Start scan! ${startScan == 0}")
    }
}

PendingIntent:

private fun getPendingIntent(): PendingIntent {
    return PendingIntent.getBroadcast(
            this, REQ_CODE,
            Intent(this.applicationContext, BleReceiver::class.java),
            PendingIntent.FLAG_UPDATE_CURRENT)
}

Manifest

Разрешения:

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

Получатель:

    <receiver android:name="com.testapp.samsungoscan.BleReceiver" >
        <intent-filter>
             <action android:name="BluetoothDevice.ACTION_FOUND" />
            <action android:name="BluetoothDevice.EXTRA_UUID" />
            <action android:name="BluetoothDevice.EXTRA_RSSI" />
        </intent-filter>
    </receiver>

Реализация получателя:

class BleReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        Log.e("testApp", "On Receive!")
    }
}

Так! Почему это не работает для Samsung, а работает для Sony и Nexus? Примечание: если я заменю приемники android:name на относительный путь .BleReceiver вместо com.testapp.samsungoscan.BleReceiver, то Nexus перестанет работать, но Sony все еще работает!

Под работой я подразумеваю, что все классы используются и журналы запускаются. Что не так?

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

А, и в дополнение к передаче пустого фильтра в startScan вам также потребуется разрешение ACCESS_FINE_LOCATION в последних версиях Android.

0 голосов
/ 15 января 2019

Вы зарегистрировали широковещательный приемник в AndroidManifest.xml с именем Intent Filter

<action android:name="BluetoothDevice.ACTION_FOUND" />

Прежде всего, вы можете указать там любую строку. Выше предположите, что вы используете эту константу , но на самом деле вы просто используете строку как есть (BluetoothDevice.ACTION_FOUND). Я бы порекомендовал изменить его на com.testapp.samsungoscan.ACTION_FOUND. Дополнения не нужны, и они предполагают, что они на самом деле являются дополнениями, но это просто имена других действий с именем «extra».

Я рекомендую изменить на:

<receiver android:name="com.testapp.samsungoscan.BleReceiver">
    <intent-filter>
         <action android:name="com.testapp.samsungoscan.ACTION_FOUND" />
    </intent-filter>
</receiver>

Во-вторых, вы должны создать PendingIntent с именем этого действия:

private fun getPendingIntent(): PendingIntent {
    return PendingIntent.getBroadcast(
            this, REQ_CODE,
            Intent(this.applicationContext, BleReceiver::class.java).setAction("com.testapp.samsungoscan.ACTION_FOUND"),
            PendingIntent.FLAG_UPDATE_CURRENT)
}

Создание намерения с указанием имени компонента требуется, поскольку Oreo может получать любые трансляции. Однако я не уверен, что он будет работать после того, как ваше приложение будет убито системой.

Наконец, я рекомендую запросить FINE_LOCATION, так как: https://android -review.googlesource.com / c / platform / packages / apps / Bluetooth / + / 848935 для изменения может потребоваться точное расположение разрешение на поиск устройств Bluetooth.

0 голосов
/ 09 сентября 2018

Вам нужно передать пустой список фильтров в вызов startScan () вместо нуля

List<ScanFilter> listOfFiters = new ArrayList<>();
ScanFilter.Builder builder = new ScanFilter.Builder();
ScanFilter filter = builder.build();
listOfFiters.add(filter);

bleScanner.startScan(listOfFilters, null, getPendingIntent())
...