Я создаю приложение для Android, которое использует Bluetooth для подключения к третьему устройству.В моем проекте я пытаюсь подключиться к устройству в классе потока следующим образом:
public class BTClient extends Thread {
UUID MY_UUID = UUID.fromString("00001101-0000");
private BluetoothAdapter _adapter;
private BluetoothSocket _btStream;
private String _connectionString;
//private OnSocketClosedErrorListener _socketClosedErrorListener;
private BluetoothDevice _device;
public BluetoothDevice getDevice() {
return _device;
}
private BTComms _comms;
public BTComms getComms() {
return _comms;
}
private boolean _isConnected = false;
public boolean IsConnected() {
return _isConnected;
}
public boolean _isValidBlueToothAddress = false;
public void IsValidBlueToothAddress() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_isValidBlueToothAddress = _adapter.checkBluetoothAddress(_connectionString);
}
}
private Vector eventSubscribers = new Vector();
/*This is an array of objects that implement the ConnectedListener interface. Right now the only class that
implements it is ConnectListenerImpl class and it implements the Connected method*/
private void OnConnected() {
@SuppressWarnings("unchecked")
//Create a new Vector with exactly same elements as eventSubscribers
Vector handler = (Vector) eventSubscribers.clone();
Iterator iter = handler.iterator();
while (iter.hasNext()) {
iter.next().Connected(new ConnectedEvent(this));
}
}
public void addConnectedEventListener(ConnectedListener listener) {
eventSubscribers.add(listener);
}
public void removeConnectedEventListener(ConnectedListener listener) {
eventSubscribers.remove(listener);
}
@SuppressLint("MissingPermission")
public BTClient(BluetoothAdapter adapter, String connectionString/*, OnSocketClosedErrorListener listener*/) throws IOException {
// _socketClosedErrorListener = listener;
//Initialize the class variables
_adapter = adapter; //Assign the adaptor
// Initializing all other variables to null
_isConnected = false;
_comms = null;
_btStream = null;
_device = null;
_connectionString = connectionString;
IsValidBlueToothAddress();
//Get a device for the given BT MAC address
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_device = _adapter.getRemoteDevice(_connectionString);
}
/* try {*/
//Create a Secure RFComm Bluetooth socket for secure outgoing connection with device
//using a given "UUID--using well known UUID SPP suggested by Android??"
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_btStream = _device.createRfcommSocketToServiceRecord(MY_UUID);
}
if (_btStream != null) { //Attempt to connect to a remote device...Needs an exception check here to
//see if it fails
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_btStream.connect();
}
_isConnected = true;
}
/*} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
@Override
public void run() {
//Needs to call this to be sure enough to cancel a discovery service
//since it is heavy weight service
//if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_adapter.cancelDiscovery();
//}
if (_isConnected)
StartCommunication();
else
System.out.println("Can't connect to the BioHarness.");
}
private void StartCommunication() {
//Create a new commmunication thread and run it
_comms = new BTComms(_btStream/*, _socketClosedErrorListener*/);
_comms.start();
//Calls Connected method which calls ReceivedPacketMethod that prints information on the phone's text box based on the message type
OnConnected();
}
public void Close() {
if (_btStream != null) {
try {
if (_comms != null)
_comms.Close();
if (_btStream != null)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_btStream.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
_isConnected = false;
//_btStream = null;
}
}
Теперь этот код работает, когда я использовал Android 8, но теперь мне нужно использовать этот код в новой ОС Android, поэтому, когда я пытаюсь подключиться к устройству, приложение возвращает мне следующую ошибку:
FATAL EXCEPTION: Thread-3
Process: it.rmountain, PID: 10445
java.lang.SecurityException: Need android.permission.BLUETOOTH_SCAN permission for android.content.AttributionSource@b09f4322: AdapterService cancelDiscovery
at android.os.Parcel.createExceptionOrNull(Parcel.java:2426)
at android.os.Parcel.createException(Parcel.java:2410)
at android.os.Parcel.readException(Parcel.java:2393)
at android.os.Parcel.readException(Parcel.java:2335)
at android.bluetooth.IBluetooth$Stub$Proxy.cancelDiscovery(IBluetooth.java:3192)
at android.bluetooth.BluetoothAdapter.cancelDiscovery(BluetoothAdapter.java:1876)
at zephyr.android.BioHarnessBT.BTClient.run(BTClient.java:119)
Код строки в BtClient.java следующий:
_adapter.cancelDiscovery();
Как это исправить?
ИЗМЕНИТЬ
Это мой файл AndroidManifest
Подробнее здесь: https://stackoverflow.com/questions/791 ... read-class
Требуется разрешение android.permission.BLUETOOTH_SCAN в классе Thread ⇐ Android
Форум для тех, кто программирует под Android
1730210171
Anonymous
Я создаю приложение для Android, которое использует Bluetooth для подключения к третьему устройству.В моем проекте я пытаюсь подключиться к устройству в классе потока следующим образом:
public class BTClient extends Thread {
UUID MY_UUID = UUID.fromString("00001101-0000");
private BluetoothAdapter _adapter;
private BluetoothSocket _btStream;
private String _connectionString;
//private OnSocketClosedErrorListener _socketClosedErrorListener;
private BluetoothDevice _device;
public BluetoothDevice getDevice() {
return _device;
}
private BTComms _comms;
public BTComms getComms() {
return _comms;
}
private boolean _isConnected = false;
public boolean IsConnected() {
return _isConnected;
}
public boolean _isValidBlueToothAddress = false;
public void IsValidBlueToothAddress() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_isValidBlueToothAddress = _adapter.checkBluetoothAddress(_connectionString);
}
}
private Vector eventSubscribers = new Vector();
/*This is an array of objects that implement the ConnectedListener interface. Right now the only class that
implements it is ConnectListenerImpl class and it implements the Connected method*/
private void OnConnected() {
@SuppressWarnings("unchecked")
//Create a new Vector with exactly same elements as eventSubscribers
Vector handler = (Vector) eventSubscribers.clone();
Iterator iter = handler.iterator();
while (iter.hasNext()) {
iter.next().Connected(new ConnectedEvent(this));
}
}
public void addConnectedEventListener(ConnectedListener listener) {
eventSubscribers.add(listener);
}
public void removeConnectedEventListener(ConnectedListener listener) {
eventSubscribers.remove(listener);
}
@SuppressLint("MissingPermission")
public BTClient(BluetoothAdapter adapter, String connectionString/*, OnSocketClosedErrorListener listener*/) throws IOException {
// _socketClosedErrorListener = listener;
//Initialize the class variables
_adapter = adapter; //Assign the adaptor
// Initializing all other variables to null
_isConnected = false;
_comms = null;
_btStream = null;
_device = null;
_connectionString = connectionString;
IsValidBlueToothAddress();
//Get a device for the given BT MAC address
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_device = _adapter.getRemoteDevice(_connectionString);
}
/* try {*/
//Create a Secure RFComm Bluetooth socket for secure outgoing connection with device
//using a given "UUID--using well known UUID SPP suggested by Android??"
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_btStream = _device.createRfcommSocketToServiceRecord(MY_UUID);
}
if (_btStream != null) { //Attempt to connect to a remote device...Needs an exception check here to
//see if it fails
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_btStream.connect();
}
_isConnected = true;
}
/*} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
@Override
public void run() {
//Needs to call this to be sure enough to cancel a discovery service
//since it is heavy weight service
//if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_adapter.cancelDiscovery();
//}
if (_isConnected)
StartCommunication();
else
System.out.println("Can't connect to the BioHarness.");
}
private void StartCommunication() {
//Create a new commmunication thread and run it
_comms = new BTComms(_btStream/*, _socketClosedErrorListener*/);
_comms.start();
//Calls Connected method which calls ReceivedPacketMethod that prints information on the phone's text box based on the message type
OnConnected();
}
public void Close() {
if (_btStream != null) {
try {
if (_comms != null)
_comms.Close();
if (_btStream != null)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
_btStream.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
_isConnected = false;
//_btStream = null;
}
}
Теперь этот код работает, когда я использовал Android 8, но теперь мне нужно использовать этот код в новой ОС Android, поэтому, когда я пытаюсь подключиться к устройству, приложение возвращает мне следующую ошибку:
FATAL EXCEPTION: Thread-3
Process: it.rmountain, PID: 10445
java.lang.SecurityException: Need android.permission.BLUETOOTH_SCAN permission for android.content.AttributionSource@b09f4322: AdapterService cancelDiscovery
at android.os.Parcel.createExceptionOrNull(Parcel.java:2426)
at android.os.Parcel.createException(Parcel.java:2410)
at android.os.Parcel.readException(Parcel.java:2393)
at android.os.Parcel.readException(Parcel.java:2335)
at android.bluetooth.IBluetooth$Stub$Proxy.cancelDiscovery(IBluetooth.java:3192)
at android.bluetooth.BluetoothAdapter.cancelDiscovery(BluetoothAdapter.java:1876)
at zephyr.android.BioHarnessBT.BTClient.run(BTClient.java:119)
Код строки в BtClient.java следующий:
_adapter.cancelDiscovery();
Как это исправить?
[b]ИЗМЕНИТЬ[/b]
Это мой файл AndroidManifest
Подробнее здесь: [url]https://stackoverflow.com/questions/79137479/need-android-permission-bluetooth-scan-permission-in-a-thread-class[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия