#android #bluetooth #android-permissions #android-bluetooth #android-12
Вопрос:
Bluetooth является основной зависимостью нашего приложения. Итак, мы уже пытаемся внедрить новые разрешения Bluetooth для Android 12. Наш единственный ресурс-это новые разрешения Bluetooth для разработчиков Android в Android 12. Там просто сказано добавить разрешения
«андроид.разрешите.BLUETOOTH-СОЕДИНЕНИЕ»
«андроид.разрешите.BLUETOOTH_SCAN»
Я добавляю, и у меня есть разрешения во время выполнения для обоих и, конечно, для местоположения(обычно, как до 12)).
Других изменений в моей кодовой базе нет. Должно быть? Я не знаю. Итак, проблема в том, что мое приложение не может найти устройство BLE. Я не мог найти причину.
У вас есть какие-либо предложения или ресурсы?
Комментарии:
1. не удалось найти устройство BLE на Android 12 или до 12, а также?
2. я тоже пытаюсь добавить эти разрешения, но их нет в Android studio… я вижу только старые (BLUETOOTH, BLUETOOTH_ADMIN, BLUETOOTH_ADMIN_PRIVILEGED). я установил свою версию targetSdk на «S», мою версию компиляции на «android-S», а мою версию BUILDTOOLS на «3.0.0-rc5». есть идеи?
3. Я могу видеть. Мои настройки таковы: компиляция версии «android-S», сборка версии «30.0.3», Целевая версия 31
Ответ №1:
100% рабочее решение : не нужен сторонний плагин
код манифеста:
<!--BLUETOOTH PERMISSION-->
<!-- Request legacy Bluetooth permissions on older devices. -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- Needed only if your app looks for Bluetooth devices.
If your app doesn't use Bluetooth scan results to derive physical
location information, you can strongly assert that your app
doesn't derive physical location. -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<!-- Needed only if your app makes the device discoverable to Bluetooth
devices. -->
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<!-- Needed only if your app communicates with already-paired Bluetooth
devices. -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!--bibo01 : hardware option-->
<uses-feature android:name="android.hardware.bluetooth" android:required="false"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>
Код Котлина:
//check android12
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
requestMultiplePermissions.launch(arrayOf(
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_CONNECT))
}
else{
val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
requestBluetooth.launch(enableBtIntent)
}
....................................................
private var requestBluetooth = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == RESULT_OK) {
//granted
}else{
//deny
}
}
private val requestMultiplePermissions =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
permissions.entries.forEach {
Log.d("test006", "${it.key} = ${it.value}")
}
}
Подробнее:
https://developer.android.com/guide/topics/connectivity/bluetooth/permissions
Ответ №2:
Я только что добавил в манифест:
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
а затем я запросил эти разрешения у Основной деятельности, как и у любой другой.
Для запроса разрешения я использую библиотеку
implementation 'pub.devrel:easypermissions:3.0.0'
тогда вы можете просто вызвать эту функцию
public static final String[] BLUETOOTH_PERMISSIONS_S = { Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT} ;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if (!EasyPermissions.hasPermissions(this, BLUETOOTH_PERMISSIONS_S)) {
EasyPermissions.requestPermissions(this, message, yourRequestCode,BLUETOOTH_PERMISSIONS_S);
}
}
и переопределить результат onRequestPermissionResult
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
Ответ №3:
Это была ошибка платформы. Google исправил ошибку в новой бета-версии Android 12.
Ответ №4:
Если вы хотите, чтобы ваше приложение инициировало обнаружение устройств или управляло настройками Bluetooth, вы должны объявить разрешение BLUETOOTH_ADMIN в дополнение к разрешению BLUETOOTH. Большинству приложений это разрешение требуется исключительно для возможности обнаружения локальных устройств Bluetooth. Не используйте другие возможности, предоставленные этим разрешением, если только приложение не является «менеджером питания», который изменяет настройки Bluetooth по запросу пользователя. Объявите разрешения Bluetooth в файле манифеста вашего приложения
от разработчика Android мы видим, что вам нужно добавить
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
в вашем файле манифеста, но вы не добавили его, чтобы обнаружить другие устройства, я думаю, что это источник вашей проблемы
Комментарии:
1. Спасибо за ваш ответ, Барни, и извините, что не упоминал об этом раньше, но
BLUETOOTH_ADMIN
уже добавлен. Это тоже не работает с этим.
Ответ №5:
Я не уверен, объявили ли они что-либо об изменениях в Bluetooth, но, если ничто другое не поможет, они недавно представили это, что МОЖЕТ помочь в вашем использовании, если вы не делаете более сложных вещей.
https://developer.android.com/guide/topics/connectivity/companion-device-pairing#kotlin
В более новых версиях вам также больше не нужно разрешение на местоположение, если это делает все, что вам нужно.
Что касается образца: вы можете просто не включать эти 2 строки:
.setNamePattern(Pattern.compile("My device"))
.addServiceUuid(ParcelUuid(UUID(0x123abcL, -1L)), null)
Я использую его для поиска устройств без каких-либо проблем, подключение работает аналогично